[例3.49]查询每个学生及其选修课程的情况
学生信息存储在Student表中,学生选课情况存放在SC表中,所以本査询实际上涉及Student与SC两个表。这两个表之间的联系是通过公共属性Sno实现的。
select *
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;
当属性列在查询的所有表里面是唯一的就可以省略表名前缀,否则必须加上表名前缀。
本例中,由于 Sname, Ssex, Sage, Sdept,Cno 和 Grade 属性列在 Student 表与 SC 表中是唯一的,因此引用时可以去掉表名前缀;而Sno在两个表都出现了,因此引用时须加上表名前綴。
[例3.51] 査询选修2号课程且成绩在80分(包含80分)以上的所有学生的学号和姓名
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中满足连接条件的元组进行连接得到最终的结果关系。
优化查询语句代码如下:
select Student.Sno , Sname
from Student
where Student.Sno =
(
select SC.Sno from SC
where SC.Cno = '2'
AND SC.Grade >= 90
);
[例3.52] 査询每一门课的间接先修课(即先修课的先修课).
在Course表中只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号査找它的先修课程。这就要将Course表与其自身连接
select First.Cno,Second.Cpno
from Course First,Course Second
where First.Cpno=Second.Cno;
[例 3.53] 在我们常用的连接操作中,满足条件的元组才可以作为结果进行输出,不满足条件的就会被舍弃。如果我们想让元组不被舍弃,并且输出为NULL值。我们就要用到外连接
接下来对例【3.49】修改,输出被舍弃的和没被舍弃的结果:
select Student.Sno , Sname , Ssex , Sage , Sdept , Cno , Grade
from Student left outer join SC
on(Student.Sno = SC.Sno);
[例3.54] 査询每个学生的学号、姓名、选修的课程名及成绩
select Student.Sno,Sname,SC.Cno,Grade
from Student,SC,Course
where Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。