SQL 集合查询

本文最后更新于:2024年3月18日 凌晨

SQL 集合查询

  • SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作,集合操作主要包括并操作UNION,交操作INTERSECT和差操作EXCRPT
  • 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。

UNION

[例3.64]:查询计算机科学系的学生及年龄不大于19岁的学生。

1
2
3
4
5
6
7
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19;
  • 本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集,使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组,如果要保留重复元组则用UNION ALL操作符。

[例3.65]:查询选修了课程1或者选修了课程2的学生。

  • 本例即查询选修课程1的学生集合与选修课程2的学生集合的并集。
1
2
3
4
5
6
7
SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno='2';

INTERSECT

[例3.66]:查询计算机科学系的学生与年龄不大于19岁的学生的交集。

1
2
3
4
5
6
7
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;
  • 这实际上就是查询计算机科学系中年龄不大于19岁的学生。
1
2
3
4
SELECT *
FROM Student
WHERE Sdept='CS' AND
Sage<=19;

[例3.67]:查询既选修了课程1又选修了课程2的学生,就是查询选修课程1的学生集合与选修课程2的学生集合的交集。

1
2
3
4
5
6
7
SELECT Sno
FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';
  • 本例也可以表示为;
1
2
3
4
5
6
SELECT Sno
FROM SC
WHERE Cno='1' AND Sno IN
(SELECT Sno
FROM SC
WHERE Cno='2');

EXCEPT

[例3.68]:查询计算机科学系的学生与年龄不大于19岁的学生的差集。

1
2
3
4
5
6
7
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <= 19;
  • 也就是查询计算机科学系中年龄大于19岁的学生。
1
2
3
SELECT *
FROM Student
WHERE Sdept='CS' AND Sage>19;