T-SQL查询语句(三):多表查询
***************************************
SQL查询语句《三》:多表查询 (也叫连接查询,此处为基于两个表的连接查询)
如果一个查询需要对多个表进行操作就称为连接查询,连接查询的结果集或结果称为表之间的连接.
连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征.
select 表1.字段名1,表2.字段名2,...
from 表1,表2
where 连接条件
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM 表名 join_type 表名 [ON (连接条件)]
连接操作中的ON (连接条件) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构
成。
连接查询分类:
1.自连接查询,对同一个表进行连接操作
2.内连接查询,<又分为:自然连接、等值连接、不等值连接三种>
3.外连接查询,<又分为:左外连接、右外连接、全外连接三种>
4.交叉连接查询,也作无条件查询。
5.联合查询
----------------------------
一。自连接查询:
一个表自己与自己建立连接称为自连接或自身连接。
进行自连接就如同两个分开的表一样,可以把一个表的某一行与同一表中的另一行连接起来。
例:
查询选学“101”课程的成绩高于“9505201”号学生成绩的所有学生记录,
并按成绩从高到低排列。
select x.* from sclass x,sclass y
where x.cno='101' and x.degree>y.degree and y.sno='9505201' and y.cno='101'
order by x.degree desc
----------------------------
二。内连接(INNER JOIN):
内连接是最常用的一种连接方式,它只返回两个数据集合之间匹配关系的那些行.
将位于两个互相交叉的数据集合中重叠部分以内的那些数据行连接起来.
内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,
并列出这些表中与连接条件相匹配的数据行。
根据所使用的比较方式不同,内连接查询操作列出与连接条件匹配的数据行,
它使用比较运算符比较被连接列的列值。
语法:
select 字段名列表 from 表名 [inner] join 表名 on 连接条件 [where 条件表达式]
例:
select 学生表.学号,学生表.姓名,学生表.班级代号,成绩表.课程代号,成绩表.课程成绩
from 学生表 INNER JOIN 成绩表
on 学生表.学号=成绩表.学号
where 学生表.班级代号='200201'
select x.sno,x.sname,y.cno,y.degree from student x
INNER join sclass y on x.sno=y.sno where x.sclass='95文秘1'
内连接分三种:
1、等值连接:
所谓等值连接,是指表之间通过“等于”关系连接起来,产生一个临时表,
然后对该临时表进行处理后生成最终结果。其查询结果中列出被连接表中的所有列,
包括其中的重复列。
(1)查询所有学生的sno,cname,degree列:
SELECT x.sno,y.cname,x.degree
FROM score x,course y
WHERE x.cno=y.cno
(2)查询“95033”班所选课程的平均分:
SELECT y.cno,avg(y.degree) as "平均分"
FROM student x,score y
WHERE x.class='95033' and x.sno=y.sno group by y.cno
(3)查询所有学生的student,score表信息:
select x.*,y.* from student x,score y where x.sno=y.sno
用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
2、不等值连接:
是指表之间的连接关系不是“等于”,而是其它关系。
这些运算符包括>、>=、<=、<、!>、!<和<>。
(1)查询所有学生的sno,cno,rank列:
select sno,cno,rank
from score,grade
where degree between low and upp order by rank
(2)
select x.sno,x.sname,y.cno,y.degree
from student x,score y
where x.sno!=y.sno
3、自然连接:
在等值连接中消除重复列就是自然连接。
(1)
select x.sno,x.sname,y.cno,y.degree
from student x,score
where x.sno=y.sno
用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.*?p.pub_id?p.pub_name?p.country
FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city
----------------------------
三。外连接(OUTER JOIN):
与内连接不同的是,外连接不只列出与连接条件相匹配的行,
而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)
中所有符合搜索条件的数据行。
外连接是对内连接的扩充,除了将两个数据集合中重叠部分以内的那些数据行连接起来之外,
还可以根据要求返回左侧或右侧数据集合中非匹配的数据或全部的数据.
即左外连接(LEFT OUTER JOIN);
右外连接(RIGHT OUTER JOIN);
全部连接(FULL OUTER JOIN).
外连接返回的结果集中的一些数据看起来和内连接返回的数据完全一样,
但有一些数据也与内连接返回的数据不同,这些数据行的某些部分是来自于表中的数据,
另一部分是NULL值,产生这些NULL值的原因是因为另一表中不包含与指定表相匹配的数据项
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和
连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,
而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
注:外连接强以使不满足条件的记录也出现在结果集中。
外连接语法:
Select 字段名列表 from 表名 Left|Right|Full [Outer] join 表名 ON 连接条件
外连接分为:
1。左外连接(LEFT OUTER JOIN或LEFT JOIN):
在结果表中包含第一个表中满足条件的所有记录。
如果是在连接条件上匹配的记录,则第二个表返回相应值,否则第二个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程成绩
from 学生表 left outer join 成绩表
on 学生表.学号=成绩表.学号
2。右外连接(RIGHT OUTER JOIN或RIGHT JOIN):
在结果表中包含第二个表中满足条件的所有记录。
如果是在连接条件上匹配的记录,则第一个表返回相应值,否则第一个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程成绩
from 学生表 right outer join 成绩表
on 学生表.学号=成绩表.学号
3。全外连接(FULL OUTER JOIN或FULL JOIN):
在结果表中包含两个表中满足条件的所有记录。
如果是在连接条件上匹配的元组,则另一个表返回相应值,否则另一个表返回空值。
select 学生表.学号,学生表.姓名,成绩表.课程代号,成绩表.课程成绩
from 学生表 full outer join 成绩表
on 学生表.学号=成绩表.学号
例子:
SELECT a.*,b.* FROM student as a left JOIN sclass as b
ON a.sno=b.sno and a.sno='9502101'
go
SELECT a.*,b.* FROM student as a right JOIN sclass as b
ON a.sno=b.sno and a.sno='9502101'
go
SELECT a.*,b.* FROM student as a full JOIN sclass as b
ON a.sno=b.sno
go
----------------------------
四。交叉连接:
交叉连接不使用任何连接条件来限制结果集合,将各表的记录以“笛卡尔”积的方式组合起来,
是分别使用两个数据源中的行以所有可能的方式进行组合,
即数据集中的每一行都要与另一表每一行组成一个新的行.
例如:一表中有三条记录,另一表有4条记录,交叉连接后,结果集合将由12条记录组成.
交叉连接(CROSS JOIN)没有WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,
返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中
符合查询条件的数据行数。
例,
titles表中有6类图书,而publishers表中有8家出版社,
则下列交叉连接检索到的记录数将等于6*8=48行。
select * from student,sclass
SELECT * FROM student a CROSS JOIN sclass ORDER BY a.sno
----------------------------
五。联合查询
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,
即执行联合查询。
UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,
被联合查询结果集合中的重复行将只保留一行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。
因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,
也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,
并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型
。
在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。
例如:
查询1 UNION (查询2 UNION 查询3)
select topicbody,posttime from bbs_topic
union all
select replybody,posttime from bbs_reply
----------------------------
六。复杂查询
---复合连接
select a.学号,a.姓名,b.课程代号,b.课程成绩,c.课程名称,d.教师代号
from 学生表 a,成绩表 b,课程表 c,教学表 d
where (a.学号=b.学号)
and (b.课程代号=c.课程代号)
and(c.课程代号=d.课程代号)
三个表以上的连接
SELECT dbo.kb.xq, dbo.kbk.kcmc, dbo.kbk.lbdh, dbo.kbk.jsmc, dbo.kb.jse, dbo.bj.bj,
dbo.kb.jc, 2 AS num, dbo.kb.zc,
CASE dbo.kb.ds WHEN '单' THEN '1' WHEN '双' THEN '2' WHEN ' ' THEN '0' END AS ds,
dbo.kb.zc1, dbo.kb.zc2
FROM dbo.kb INNER JOIN
dbo.bj ON dbo.kb.bh = dbo.bj.bh INNER JOIN
dbo.kbk ON dbo.kb.xq = dbo.kbk.xq AND dbo.kb.bh = dbo.kbk.bh AND
dbo.kb.kcdm = dbo.kbk.kcdm
WHERE (dbo.kb.jc = 1) OR
(dbo.kb.jc = 3) OR
(dbo.kb.jc = 5) OR
(dbo.kb.jc = 7) OR
(dbo.kb.jc = 9) OR
(dbo.kb.jc = 11)
----------------------------
总结:
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,
但可以对这三种列进行间接连接。
例如:
SELECT p1.pub_id?p2.pub_id?p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
***************************************
- 浏览: 4614 次
- 性别:
- 来自: 上海
相关推荐
Mybatis基于注解实现多表查询功能 Mybatis基于注解实现多表查询功能是指使用Mybatis框架中的注解来实现多表查询的功能。这种方法可以简化配置,提高开发效率。下面我们将详细介绍如何使用Mybatis基于注解实现多表...
本文将深入探讨如何在ASP.NET MVC中执行多表查询。 首先,理解多表查询的基本概念至关重要。在关系型数据库中,多个表之间的数据通常是相互关联的,通过外键实现。多表查询允许我们从这些相关的表中获取和组合数据...
在SQL(Structured Query Language)中,多表查询是数据库操作中的一个重要概念,它允许我们从不止一个表中获取数据,从而实现更复杂的数据分析和整合。这个“SQL数据库多表查询练习题”旨在帮助你深化对这一核心...
本文将深入探讨HQL多表查询的核心概念、语法结构以及实际应用案例。 ### HQL多表查询的基础概念 HQL支持多种查询方式,包括单表查询、多表查询、连接查询等。其中,多表查询是处理复杂数据关系的关键技术,它允许...
Oracle 多表查询优化 在 Oracle 数据库中,多表查询是一种常见的查询方式,但它也可能会对数据库性能产生影响。本文将讨论 Oracle 多表查询优化的几种方法,帮助开发者提高数据库性能。 1. 选择最有效率的表名顺序...
### 多表查询精讲 #### 一、引言 在数据库管理中,经常会遇到需要从多个表中获取数据的情况,这种情况下就需要用到多表查询。本文将详细介绍如何使用PL/SQL进行多表复杂查询,包括多表查询的基本原理、不同类型的...
Entity Framework 多表查询方式 Entity Framework 是一个强大的数据访问技术,提供了多种查询方式来满足不同的业务需求。在本节中,我们将详细介绍 Entity Framework 中的多表查询方式,包括简单查询、查询部分字段...
数据库实验一多表查询 本实验报告的主要目的是让学生掌握多表查询的基本概念和语法,熟悉使用 SQL 语句对单表进行查询,并且掌握 SQL Server 所提供的函数。实验中,学生需要使用 SQL 语句对订单数据库 OrderDB 中...
### ORACLE 多表查询与数据修改 #### 学习目标 - **熟悉三个或四个表的连接查询**:在实际应用中,我们往往需要从多个表中获取数据以完成复杂的业务逻辑。通过本节的学习,您将能够掌握如何利用Oracle数据库进行多...
本文实例讲述了thinkPHP框架实现多表查询的方法。分享给大家供大家参考,具体如下: 我们可以将两个表连起来一起查询数据,我现在有两张表,一个是feedback表和member表,如图: 总目录: 上代码: $where = ...
### MySQL多表查询和EXISTS查询性能对比 #### 测试环境 在进行MySQL多表查询与EXISTS查询的性能对比之前,首先需要了解测试环境的相关配置。虽然原文中并未给出具体的测试环境细节,但在实际操作中,这一步骤至关...
本示例"coredata多表查询demo"提供了一个很好的实践平台,帮助开发者深入了解并熟练掌握CoreData在多表查询中的应用。 CoreData模型通常由实体(Entities)、属性(Attributes)和关系(Relationships)组成。实体...
### SQL多表查询知识点详解 #### 一、基础知识回顾 在数据库操作中,经常会遇到需要从多个表中获取数据的情况,这时就需要用到SQL的多表查询技术。多表查询是指在一个查询语句中涉及两个或两个以上的表,并且通过...
通过这个"CoreData多表查询"的Demo,你将能实践以上概念,并了解如何在实际项目中有效地利用CoreData进行多表查询。记住,良好的数据模型设计和有效的查询策略对于保持应用的性能至关重要。阅读源码和说明文档,将有...
本资料“mybatis多表查询.zip”着重讲解了如何在MyBatis中实现多表查询,这对于构建复杂业务逻辑的系统来说是至关重要的。以下是对这个主题的详细阐述: 1. **MyBatis简介** MyBatis是由Apache基金会维护的一个...
### MySQL多表查询详解 #### 一、多表查询的基本概念与操作 多表查询是在实际业务场景中非常常见的需求之一。它允许我们从多个表中检索数据,并将这些数据组合在一起以形成有意义的信息。在MySQL中,多表查询通常...
在C#编程中,多表查询是数据库操作中常见的需求,尤其在开发复杂业务系统时。C#本身并不直接处理数据库查询,但它可以借助ADO.NET、Entity Framework等库与SQL Server、MySQL、Oracle等数据库进行交互。本篇将详细...
在SQL查询中,多表查询是数据库操作中的关键部分,特别是在处理复杂的数据关系时。本文将详细介绍几种在SQL中用于多表查询的嵌套查询,包括带`in`、`any`、`some`、`all`的嵌套查询以及并、交、差操作的嵌套查询。 ...
ThinkPHP 多表查询详解 ThinkPHP 框架提供了多表查询的功能,允许开发者灵活地操作多个数据表,并且提供了两种方式来实现多表查询:Table 方法和 Join 方法。 Table 方法 Table 方法用于定义要操作的数据表名称,...