表a
表b
- 一般连接
一般连接
2.等值连接
等值连接
3.自然连接
自然连接
4.外连接
外连接
5.左外连接
左外连接
6.右外连接
右外连接
1、等值与非等值连接查询连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
[<表名1>.]<列名1><比较运算符>[<表名2>/]<列名2>
其中比较运算符主要有:=、>、<、>=、<=、!= 等。
此外连接谓词还可以使用下面形式:
[<表名1>.]<列名1>BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
当连接运算符为=时,称为等值连接。使用其它运算符称为非等值连接。
查询每个学生及其选修课程的情况。
SELECT Student.* ,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno;
查询结果如下:
DBMS执行该连接操作的可能过程是:
首先在表Student中找到第一个元组,然后从头开始扫描SC表,逐一查找与Student第一个元组的Sno相等的SC元组,找到后就将Student中的第一个元组与该元组拼接起来,形成结果表中的一个元组。SC全部查找完后,再找Student中第二个元组,然后再从头开始扫描SC,逐一查找满足连接条件的元组,找到后就将Student中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直至Student中的全部元组都处理完毕为止。
若把等值连接中把目标列中重复的属性列去掉则为自然连接。
对上一例子用自然连接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno=SC.Sno;
例中,由于Sno,Sname,Ssex,Sage,Sdept,Cno和Grade属性列在Student和SC表中是唯一的,因此引用是可以去掉表明前缀。而Sno在两个表都出现了,因此引用是必须加上表明前缀。
2、自身连接连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
查每门课的间接先修课。
FIRST表
SECOND 表
SELECT FIRST.Cno,SECOND.Cpno WHERE Course FIRST ,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;
结果为:
3、外连接
如果把舍弃的元组保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接(outer jion);
如果只把左边关系中要舍弃的元组保存就叫做左外连接(LEFT OUTER JION 或LEFT JION);
如果只把右边关系中要舍弃的元组保存就叫做右外连接 (RIGHT OUTER JION 或RIGHT JION)。
SELECT Student.Sno,Sname,Ssex,Sdept,Cno,Grade FROM Student LEFT OUT JOIN ON(Student.Sno=SC.Sno); /*也可以使用USING来去掉结果中的重复值: FROM Student LEFT OUT JOIN SC USING (Sno);*/
4、复合条件连接WHERE子句中可以有多个连接条件,称为复合条件连接。
查询选修2号课程且成绩在90分以上的所有学生的学号和名字。
SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>90;
多表连接
查询每个学生的学号、姓名、选修课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
,