集合查询
select语句查询结果是元组的集合,所以多个select语句的结果可进行集合操作。集合操作主要包括并操作union、交操作intersect和差操作except。
3.64 查询计算机科学系的学生及年龄不大于19岁的学生
select *
from Student
where Sdept='CS'
union//两个条件取并集
select *
from Student
where Sage<=19;
注:系统会自动去掉重复元组,若要保留重复元组可用union all操作符
3.65 查询选修了课程1或者选修了课程2的学生
select Sno
from SC
where Cno='1'
union//两个条件取并集
select Sno
from SC
where Cno='2';
3.66 查询计算机科学系的学生与年龄不大于19岁的学生的交集
select *
from Student
where Sdept='CS'
intersect//两个条件取交集
select *
from Student
where Sage<=19;
它等价于
select *
from Student
where Sdept='CS' and Sage<=19;
3.67 查询既选修了课程1又选修了课程2的学生
select Sno
from SC
where Cno='1'
intersect//两个条件取交集
select Sno
from SC
where Cno='2';
也可以表示为
select Sno
from SC
where Cno='1' and Sno in(
select Sno
from SC
where Cno='2');
3.68 查询计算机科学系中年龄大于19岁的学生的差集
select *
from Student
where Sdept='CS'
except//两个条件取差集
select *
from Student
where Sage<=19;
基于派生表的查询
子查询不仅可以出现在where子句中,还可以出现在from子句中,这时子查询生成的临时派生表成为主查询的查询对象
- 3.57也可这样做
select Sno,Cno
from SC,
(select Sno,Avg(Grade)
from SC
group by Sno) as Avg_sc(avg_sno,avg_grade)//派生表
where SC.Sno=Avg_sc.avg_sno