文档库 最新最全的文档下载
当前位置:文档库 › SQL的数据查询功能之三---多表连接查询

SQL的数据查询功能之三---多表连接查询

SQL的数据查询功能之三---多表连接查询
SQL的数据查询功能之三---多表连接查询

一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询主要包括内连接、外连接和交叉连接。

1.内连接

内连接是一种最常用的连接类型,使用内连接是,如果两个表的相关字段满足连接条件则从这两个表中提取数据并组合成新的记录。

当连接运算符为=时,称为等值连接。使用其它运算符称为非等值连接。

连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比的。但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比的类型。

从概念上讲DBMS执行连接操作的过程是,首先在表1中找到第一个元组,然后从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1全部元组都处理完毕为止。

例38 查询每个学生及其选修课程的情况

学生情况存放在Student表中,学生选课情况存放在SC表中,所以本查询实际上同时涉及Student与SC 两个表中的数据。这两个表之间的联系是通过两个表都具有的属性Sno实现的。要查询学生及其选修课程的情况,就必须将这两个表中学号相同的元组连接起来。这是一个等值连接。完成本查询的SQL语句为: SELECT * FROM Student JOIN SC ON Student.Sno=SC.Sno;

如果是按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然连接

例39 自然连接Student和SC表

SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade

FROM Student INNER JOIN SC ON Student.Sno=SC.Sno;

在本查询中,由于Sname、 Ssex、 Sage、Sdept、Cno和Grade属性列在Student与SC表中是唯一的,因此引用时可以去掉表名前缀。而Sno在两个表都出现了,因此引用时必须加上表名前缀。该查询的执行结果不再出现SC.Sno列。

例40 查询选修2号课程且成绩在90分以上的所有学生

SELECT Student.Sno, Sname FROM Student INNER JOIN SC ON Student.Sno=SC.Sno

WHERE https://www.wendangku.net/doc/691308821.html,o='2' AND SC.Grade>90;

例41 查询每个学生及其选修的课程名其及成绩

SELECT Student.Sno, Sname, https://www.wendangku.net/doc/691308821.html,ame, SC.Grade

FROM Student S INNER JOIN ON S.Sno=SC.Sno

JOIN Course C ON https://www.wendangku.net/doc/691308821.html,o=https://www.wendangku.net/doc/691308821.html,o;

2.自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。例42 查询与刘晨在同一个系学习的学生的姓名和所在系

为清楚起见,我们可以为Student表取两个别名,一个是S1,另一个是S2,也可以在考虑问题时就把Course

表想成是两个完全一样表,一个是S1表,另一个是S2表。如下所示:

完成该查询的SQL语句为:

SELECT S2.Sname, S2.Sdept

FROM Student as S1 JOIN Student as S2 ON S1.Sdept=S2.Sdept

WHERE S1.Sname=‘刘晨’AND S2.Sname!=‘刘晨’;

3.外连接

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在例35和例36的结果表中没有关于95003和95004两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组。但是有时我们想以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外连接(Outer Join)。

SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade

FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno;

Student.Sno Sname Ssex Sage Sdept Cno Grade

----------- ------- ------ ------ ------- ------ -------

95002 刘晨女 19 信息系 3 80

95003 王名女 18 数学系 NULL NULL

95004 张立男 18 信息系 NULL NULL

右连接同理。

相关文档