SELECT Student.*,SC.*FROM Student,SC
WHERE Student.Sno = SC.Sno
自然连接
Student.sno = sno
查询先修课程
SELECTFIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECONDWHEREFIRST.Cpno =SECOND.Cno;
例40.查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩。
SELECT Sname, Cno, Grade
FROM Student JOIN SC
ON Student.Sno = SC.Sno
WHERE Sdept ='计算机系'
例41. 查询信息系修了VB课程的学生的修课成绩,要求列出学生姓名、课程名和成绩。
SELECT Sname, Cname, Grade
FROM Student s JOIN SC
ON s.Sno = SC. Sno
JOIN Course c ON c.Cno = SC.Cno
WHERE Sdept ='信息系'AND Cname ='VB'
为特殊的内连接
相互连接的表物理上为同一张表。
必须为两个表取别名,使之在逻辑上成为两个表。
例43. 查询与刘晨在同一个系学习的学生的姓名和所在的系。
SELECT S2.Sname, S2.Sdept
FROM Student S1 JOIN Student S2
ON S1.Sdept = S2.Sdept
WHERE S1.Sname = ‘刘晨’
AND S2.Sname != ‘刘晨’
只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条件。
ANSI方式的外连接的语法格式为:
FROM 表1LEFT|RIGHT[OUTER]JOIN 表2ON<连接条件>
theta方式的外连接的语法格式为:
左外连接:
FROM 表1, 表2WHERE[表1.]列名(+) = [表2.]列名
右外连接:
FROM 表1, 表2WHERE[表1.]列名= [表2.]列名(+)
例44. 查询学生的修课情况,包括修了课程的学生和没有修课的学生。
SELECT Student.Sno, Sname, Cno, Grade
FROM Student LEFTOUTERJOIN SC
ON Student.Sno = SC.Sno
例37 查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE Sno IN(SELECT Sno
FROM SC
WHERE Cno ='95001')
例38查询所有选修了课程名为“信息系统”的学生学号和姓名
用连接查询
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno =SC.Sno ANd
SC.Cno = Course.Cno AND
Course.Cname ='信息系统'
用嵌套查询
SELECT Sno,Sname
FROM Student
WHERE Sno IN(SELECT Sno
FROM SC
WHERE Cno IN(SELECT Cno
FROM Course
WHERE Cname='信息系统'));
例38-1找出所有学生超过所有课程平均成绩的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade>=(SELECTAVG(Grade)from SC);
找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC X
WHERE Grade>=(SELECTAVG(Grade)FROM SC Y WHERE Y.Sno=X.Sno)
例39 查询其它系中比信息系任意一个学生年龄小的学生姓名
SELECT Sname,Sage
FROM Student
WHERE Sage <any(SELECT Sage
FROM Student
Where Sdept='IS')AND Sdept<>'IS'
查询其它系中比信息系比所有学习年龄都小的的学生姓名
SELECT Sname,Sage
FROM Student
WHERE Sage <ALL(SELECT Sage
FROM Student
Where Sdept='IS')AND Sdept<>'IS'
用集函数实现
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECTMIN(Sage)FROM Student
WHERE Sdept='IS')AND Sdept<>'IS'
查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHEREEXISTS(SELECT*FROM SC
WHERE Student.Sno='1'and Cno ='1')
SELECT Sname
FROM Student
WHERENOTEXISTS(SELECT*FROM Course
WHERENOTEXISTS(SELECT*FROM SC
WHERE Sno=Student.sno and Cno = Course.Cno
))