1.等值与非等值连接查询
连接查询的where子句中用来连接两个表的条件称为连接条件或连接谓词
例 3.49 查询每个学生及其选修课程的情况
SELECT Student.*,SC.* // **Student.*,SC.* 可替换为 *
FROM Student,SC
WHERE Student.Sno=SC.Sno;

若在等值连接中把目标列中重复的属性的去掉则为自然连接
例 3.50 对例 3.49用自然连接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade //手动去重
From Student,SC
WHERE Student.Sno=SC.Sno;
一条SQL语句可以同时完成选择和查询。这时WHRER子句是由连接谓词和选择谓词组成的复合条件
例 3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>80;
该查询的一种优化的执行过程是,先从SC中挑选出Cno=‘2′并且Grade>90的元组其中一个中间关系在和Student中满足连接条件的元组进行连接得到最终的结果关系
2.自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,称为表的自身连接
例 3.52 查询每一门课的间接先修课(即先修课的先修课)
为Course表取两个别名,一个是First,另一个是SECOND
FIRST表(Course表)
SECOND表(Course表)
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
3.外连接
在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。如例3.49的结果表中没有201215123和201215125两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组,导致 Student中这些元组在连接时被舍弃了。
有时想以 Student表为主体列出每个学生的基本情况及其选课情况。若某个学生没有选课,仍把 Student的悬浮元组保存在结果关系中,而在SC表的属性上填空值NULL,这时就需要使用外连接。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
使用USING来去掉结果中的重复值
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC USING(Sno);
4.多表连接
连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接
例 3.54 查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
SELECT *
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。本例的一种可能的执行方式是,先将 Student表与SC表进行连接,得到每个学生的学号、姓名、所选课程号和相应的成绩,然后再将其与 Course表进行连接,得到最终结果。