[例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩
注意:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
正确写法:
select Sno,AVG(Grade)
from sc
group by Sno
having avg(grade)>=90;
注意:WHERE子句作用于表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。
多表查询_连接查询
等值连接与非等值连接
【例3.49】査询每个学生及其选修课程的情况
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;
[例 3.51 ]查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
select student.Sno,Sname
from student,sc
where student.Sno=sc.Sno AND Cno='2' AND Grade>90;
自身连接
[例 3.52]查询每一门课的间接先修课(即先修课的先修课)
second似乎是sql sever中的一个关键词,直接打second会变颜色。
select first_table.Cno,second_table.Cpno
from course first_table,course second_table
where first_table.Cpno=second_table.Cno;
外连接
[例 3. 53] 改写[例 3.49]
左外连接,这个左右针对的是 left_table on right_table,和后面的on里面的表的顺序无关。
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from student left outer join sc ON(student.Sno=Sc.Sno);
对于这个例子,右外连接就相等于普通的(非外连接)连接,因为右边 sc有外键约束(参照了student)。
多表连接
[例3.54]查询每个学生的学号、姓名、选修的课程名及成绩
select *
from student,sc,course
where student.Sno=sc.Sno AND course.Cno=sc.Cno;