数据查询
1、集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT
注意:参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同
例 查询计算机科学系的学生及年龄不大于19岁的学生
select *
from student
where sdept='cs'
union
select *
from student
where sage<=19;
本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。使用UNION将多个查询结果结合并起来,系统会自动去除重复元组。如果要保留重复元组则用UNION ALL操作符
例 查询计算机科学系的学生与年龄不大于19岁的学生的交集
select *
from student
where sdept='cs'
intersect
select *
from student
where sage<=19;
这实际上就是查询计算机科学系中年龄不大于19岁的学生
select *
from student
where sdept='cs' and
sage<=19;
例 查询计算机科学系的学生与年龄不大于19岁的学生的差集
select *
from student
where sdept='cs'
except
select *
from student
where sage<=19;
也就是查询计算机科学系中年龄大于19岁的学生
select *
from student
where sdept='cs' and
sage>19;
2、基于派生表的查询
子查询不仅可以出现在WHERE字句中,还可以出现在FROM字句中。这时子查询生成的临时**派生表(derived table)**成为主查询的对象
例 找出每个学生超过他自己选修课程平均成绩的课程号
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 and sc.grade>=avg_sc.avg_grade;
这里FROM子句中的子查询将生成一个派生表 Avg_sc。该表由avg_sno和avg_grade两个属性组成,记录了每个学生的学号及平均成绩。主查询将SC于Avg_sc按学号相等进行连接,选出选修课成绩大于其平均成绩的课程号
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。
例 查询所有选修了1号课程的学生姓名
select sname
from student,(select sno
from sc
where cno='1'