若一个查询同时涉及两个以上的表,则称之为连接查询。
连接查询的Where子句中用来连接两个表的条件成为连接条件或连接谓词
等值与非等值连接查询
查询每个学生及其选修课程情况
SELECT Student.*,SC.*
from Student,sc
where student.sno=sc.sno;
笛卡尔积:
Select * from Student,SC;
若在等值连接中把目标列中重复的属性列去掉则为自然连接
对上例用自然连接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student,sc
where student.sno=sc.sno;
一条Sql语句可以同时完成选择和连接查询,这时Where子句是由连接谓词和选择谓词组成的复合条件。
查询选修2号课程且成绩在85分以上的所有学生的学号和姓名
SELECT Student.Sno,Sname
from Student,sc
where student.sno=sc.sno And
sC.CNO='2' aND sC.Grade>=85;
自身连接
查询每一门课的间接选修课
这里巧妙的是给Course表分别取了first和second两个别名(在语句中实现)
然后分别选择了first表自身的课程号和其先修课程的先修课程号 就实现了间接选修课
Select first.cno,second.cpno
from Course first,course second
where first.Cpno=second.cno;
T-sql里会把空值也显示出来 这是T-sql和sql不同的特性造成的
外连接
在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。但有时想某些不符合条件的元组保存在结果关系里,就需要使用外连接。
左外连接是列出左边关系中满足的元组
以STUDENT表为主题列出每个学生的基本情况和其选课情况,若某个学生没有选课,仍把Student的悬浮元组保留在结果关系中
Select Student.Sno,Sname,Ssex,sage,sdept,cno,grade
from Student LEFT OUTER JOIN SC ON (Student.sno=Sc.sno);
多表连接
查询每个学生的学号 姓名 选修的课程以及成绩
Select Student.sno,Sname,Cname,Grade
from student,sc,course
where student.sno=sc.sno and sc.cno=course.cno;