您当前的位置:首页 > 文章 > Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解

Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解

作者:beidaol 时间:2023-07-19 阅读数:354 人阅读

限制条件

  • (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 语句:

SELECT Txn_Date FROM Store_Information
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

标签:数据库