交(INTERSECT):
#选出同时选修1号和2号课程的学生学号
SELECT Sno
FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';
注:交运算不属于基本运算。
差(EXCEPT):
-- 选了1号课却没选2号课的学生学号
select Sno,Cno,Grade
FROM SC
WHERE Cno='1'
EXCEPT
SELECT Sno,Cno,Grade
FROM SC
WHERE Cno='2';
谓词any、all:
使用ANY / ALL时必须同时使用比较运算符。
当子查询返回多个值时使用。
-- 查询比计算机学院的学生都小的学生姓名和年龄
select sname,sage
from student
where sage<all
(select sage
from student
where sdept='计算机');
-- 相当于使用最小值聚集函数
select sname,sage
from student
where sage<
(select min(sage)
from student
where sdept='计算机');
= | <> | < | <= | > | >= | |
---|---|---|---|---|---|---|
ANY | IN | – | <MAX | <=MAX | >MIN | >=MIN |
ALL | – | NOT IN | <MIN | <=MIN | >MAX | >=MAX |
谓词EXISTS
查询结果只返回逻辑值”真“或者”假“,不返回任何数据。
嵌套查询:
-- 查询选修了数据库的学生学号和姓名:
select Sno,Sname
from student
where Sno in
(select Sno
from sc
where cno in
(select cno
from course
where cname='数据库'));
eg2:
-- 查询同时选修1号课程和2号课程的学生学号
-- 思路:从(选修过2号课程的)学号中选出(选修了1号课程的)学号
select sno
from sc
where cno='1'
and sno in
(select sno
from sc
where cno='2')
eg3:
-- 查询选修了1号课程又没有选修2号课程的学生学号
select sno
from sc
where cno='1'
and sno not in
(select sno
from sc
where cno='2')
带有比较运算符的子查询:
当用户能够确切知道内层查询返回的时单值时,可以使用比较运算符。
-- 找出每个学生超过他平均成绩的课程号
-- 思路:先计算出平均成绩,再进行筛选
select sno,cno
from sc x
where grade>
select avg(grade)
from sc y
where x.sno=y.sno