一、概述
集合查询是对两个SELECT语句的查询结果进行再进行处理的查询
二、条件
1、两个SELECT语句的查询结果必须是属性列数目相同
2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型
三、并(UNION)运算
1、语法格式:
SELECT 语句1
UNION 【ALL】
SELECT 语句2
2、结果
两个SELECT语句并运算的结果就是两个查询结果中的元组,使用并运算进行集合查询在查询结果中会自动去除重复的元组
3、举例:查询选修了课程号为“001”或"002"的学生学号。
select sNo from sC where cNo='001'
union
select sNo from sC where cNo='002';
也可以使用一个SELECT语句来实现查询需求,但注意要用DISTINCE关键词去重
select distinct sNo
from sC
where cNo='001' or cNo='002'
四、交(INTERSECT)运算
1、语法格式:
SELECT 语句1
INTERSECT
SELECT 语句2
2、结果:
两个SELECT语句的查询结果进行交运算的结果是在两个SELECT语句中同时存在的元组的集合
3、举例:查询既选修了“001”课程又选修了“002”课程的学生学号
select sNo from sC where cNo='001'
intersect
select sNo from sC where cNo='002';
4、使用单个的SELECT语句也可以满足查询需求
select sNo
from sC
where cNo='001' and sNo in(
select sNo
from sC
where cNo='002'
)
错误示例:
select sNo
from sC
where cNo='001' and cNo='002'
错因:一个元组在同一时刻同一属性只能为1个值,因此WHERE子句的运算结果始终为假
五、差(EXCEPT)运算
1、语法格式:
SELECT 语句1
EXCEPT
SELECT 语句2
2、结果:
两个SELECT语句的结果集进行差运算的结果是从第一个SELECT语句的结果集中去除第二个SELECT语句的结果集中存在的元组之后所形成的新的元组集
3、举例:查询选修了课程号为“001”但没选修“002”课程的学生学号
select sNo from sC where cNo='001'
except
select sNo from sC where cNo='002';
也可以使用一个SELECT语句来实现查询需求
select sNo
from sC
where cNo='001' and sNo not in(
select sNo
from sC
where cNo='002'
)
六、总结
1、集合查询体现了SQL语言对关系的操作能力
2、集合查询方式语义清晰,容易理解
3、不同的DBMS对集合查询的支持程度不同,语义动词可能会不一样,比如有的DBMS进行差集运算的语义动词是MINUS