一、GROUP BY 子句的补充(HAVING短语)
[例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩
错误使用(WHERE子句是不能用聚集函数作为条件表达式的)
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
SELECT Sno,AVG(Grade) 分数
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=80
二,连接查询
同时涉及两个以上的表的查询
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
注意:连接字段类型必须是可比的,但名字不必相同
1.等值与非等值连接查询
[例 3.49] 查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno
①.自然连接
[例 3.50] 对[例 3.49]用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno
②.一条语句同时完成选择和连接查询
[例 3.51 ]查询选修2号课程且成绩在50分以上的所有学生的学号和姓名。
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2'
AND SC.Grade>50
2.自身连接
[例 3.52]查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno
可以通过完整的表来理解
SELECT FIRST.*,SECOND.*
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno
3.外连接
外连接⟗与普通连接⋈的区别
⋈ 只输出满足连接条件的元组
⟗以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
[例 3. 53] 改写[例 3.49] 左连接列出所有
SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
4.多表查询
[例3.54]查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno