Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解
限制条件
- (1)所有查询中的列数和列的顺序必须相同。
- (2)比较的两个查询结果集中的列数据类型可以不同但必须兼容。
- (3)比较的两个查询结果集中不能包含不可比较的数据类型(xml、text、ntext、image 或非二进制 CLR 用户定义类型)的列。
- (4)返回的结果集的列名与操作数左侧的查询返回的列名相同。ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名。
- (5)不能与 COMPUTE 和 COMPUTE BY 子句一起使用。
- (6)通过比较行来确定非重复值时,两个 NULL 值被视为相等。(EXCEPT 或 INTERSECT 返回的结果集中的任何列的为空性与操作数左侧的查询返回的对应列的为空性相同。)
UNION 并集
查询选修了180101号或180102号课程或二者都选修了的学生学号、课程号和成绩。
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180101')
UNION
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180102')
与SELECT子句不同,UNION运算自动去除重复。因此,在本例中,若只输出学生的学号,则相同的学号只出现一次。如果想保留所有的重复,则必须用UNION ALL代替UNION,且查询结果中出现的重复元组数等于两个集合中出现的重复元组数的和。
INTERSECT 交集
intersect运算 返回查询结果中相同的部分既他们的交集
查询同时选修了180101和180102号课程的学生学号、课程号和成绩。
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180101')
INTERSECT
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180102')
INTERSECT运算自动去除重复,如果想保留所有的重复,必须用INTERSECT ALL代替INTERSECT,结果中出现的重复元组数等于两集合出现的重复元组数里较少的那个。
minus-(oracle) 差集
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录,
即两个结果的差集,请注意,在 MINUS 指令下,不同的值只会被列出一次。
语法
[SQL 语句 1]
MINUS
[SQL 语句 2];
select * from abc2
minus
select * from abc ;
Store_Information 表格
Store_Name | Sales | Txn_Date |
Los Angeles | 1500 | 05-Jan-1999 |
San Diego | 250 | 07-Jan-1999 |
Los Angeles | 300 | 08-Jan-1999 |
Boston | 700 | 08-Jan-1999 |
Internet Sales 表格
Txn_Date | Sales |
07-Jan-1999 | 250 |
10-Jan-1999 | 535 |
11-Jan-1999 | 320 |
12-Jan-1999 | 750 |
而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:
MINUS
SELECT Txn_Date FROM Internet_Sales;
结果:
Txn_Date |
Jan-05-1999 |
Jan-08-1999 |
'Jan-05-1999', 'Jan-07-1999', 和 'Jan-08-1999' 是 "SELECT Txn_Date FROM Store_Information" 所产生的结果。在这里面,'Jan-07-1999' 是存在于 "SELECT Txn_Date FROM Internet_Sales" 所产生的结果中。因此 'Jan-07-1999' 并不在最后的结果中。
EXCEPT (mysql不支持)
EXCEPT 返回两个结果集的差(即从左查询中返回右查询没有找到的所有非重复值)。
查询选修了180101号课程的学生中没有选修180102号课程的学生学号、课程号和成绩。
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180101')
EXCEPT
(SELECT 学号, 课程号, 成绩
FROM 学习
WHERE 课程号='180102')
EXCEPT运算自动去除重复,如果想保留所有的重复,必须用EXCEPT ALL代替EXCEPT,结果中出现的重复元组数等于两集合出现的重复元组数之差(前提是差是正值)。
在不支持INTERSECT和EXCEPT运算的DBMS中,必须使用其它方法实现,其中,嵌套查询是十分有效的一种方法。
本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com