SQL的交并差集

1. UNION (并集)

Union能够对两个或多个结果集进行链接,造成“并集”。子结果集全部的记录组合在一块儿造成新的结果集。相当于两个表数据上下连结。
基本语法形式:

SELECT <列名1> as <别名>, ……
  FROM <表名1>
 UNION
SELECT <列名2> as <别名>, ……
  FROM <表名2>;

限定条件:

  • 子结果集要具备相同的结构。
  • 字结果集的列数必须相同。
  • 子结果集对应的数据类型必须能够兼容。
  • 每一个子结果集不能包含order by和compute子句。
-- 删除重复行
SELECT <列名1> as <别名>, ……
  FROM <表名1>
 UNION
SELECT <列名2> as <别名>, ……
  FROM <表名2>;

-- 不删除重复行
SELECT <列名1> as <别名>, ……
  FROM <表名1>
 UNION ALL
SELECT <列名2> as <别名>, ……
  FROM <表名2>;

Example

-- 保留重复行
SELECT product_id, product_name
  FROM Product
 UNION ALL
SELECT product_id, product_name
  FROM Product2;

在这里插入图片描述

2. INTERSECT (交集) (MySQL不支持)

InterSect能够对两个或多个结果集进行链接,造成“交集”。返回左边结果集和右边结果集中都有的记录。
基本语法形式:

SELECT <列名1> as <别名>, ……
  FROM <表名1>
 INTERSECT
SELECT <列名2> as <别名>, ……
  FROM <表名2>;

限定条件:

  • 子结果集要具备相同的结构。
  • 字结果集的列数必须相同。
  • 子结果集对应的数据类型必须能够兼容。
  • 每一个子结果集不能包含order by和compute子句。

3. EXCEPT (差集) (MySQL不支持)

Except能够对两个或多个结果集进行链接,造成“差集”。返回第一个查询结果集合中已经有的记录,而第二个查询结果集中没有的记录。
oracle用的语法为 minus
在这里插入图片描述
基本语法形式:

SELECT <列名1> as <别名>, ……
  FROM <表名1>
 EXCEPT -- minus
SELECT <列名2> as <别名>, ……
  FROM <表名2>;

限定条件:

  • 子结果集要具备相同的结构。
  • 字结果集的列数必须相同。
  • 子结果集对应的数据类型必须能够兼容。
  • 每一个子结果集不能包含order by和compute子句。

在MySQL中,求差集也可以用 NOT IN

SELECT * FROM Product 
WHERE sale_price > 2000 
AND product_id NOT IN (
SELECT product_id FROM Product 
WHERE sale_price<1.3*purchase_price)

但 NOT IN 在处理大数据时的表现并不好,此时我们还可以用 join 来求差集

select A.id, B.id from A
left join B
on A.id=B.id
where B.id IS NULL

4. 求对称差

两个集合A,B的对称差是指那些仅属于A或仅属于B的元素构成的集合。例如, 两个集合的交就可以看作是两个集合的并去掉两个集合的对称差.上述方法在其他数据库里也可以用来简单地实现表或查询结果的对称差运算: 首先使用UNION求两个表的并集, 然后使用INTERSECT求两个表的交集, 然后用并集减去交集, 就得到了对称差.

但由于在MySQL 8.0 里, 由于两个表或查询结果的并不能直接求出来, 因此并不适合使用上述思路来求对称差. 好在还有差集运算可以使用. 从直观上就能看出来, 两个集合的对称差等于 A-B并上B-A, 因此实践中可以用这个思路来求对称差.

-- 使用 NOT IN 实现两个表的差集
SELECT * 
  FROM Product
 WHERE product_id NOT IN (SELECT product_id FROM Product2)
UNION
SELECT * 
  FROM Product2
 WHERE product_id NOT IN (SELECT product_id FROM Product)

参考来源:
DataWhale-SQL: Task04:集合运算 - 4.1.表的加减法
SQL的JOIN、并集、差集、交集

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 致谢 引言 第1章 T-SQL查询和编程基础  1.1 理论背景  1.2 SQL SERVER体系结构  1.3 创建表和定义数据完整性  1.4 总结 第2章 单表查询  2.1 SELECT语句的元素  2.2 谓词和运算符  2.3 CASE表达式  2.4 NULL值  2.5 同时操作(ALL-AT-ONCE OPERATION)  2.6 处理字符数据  2.7 处理日期和时间数据  2.8 查询元数据  2.9 总结  2.10 练习  2.11 解决方案 第3章 联接查询  3.1 叉联接  3.2 内联接  3.3 特殊的联接实例  3.4 外联接  3.5 总结  3.6 练习  3.7 解决方案 第4章 子查询  4.1 独立子查询  4.2 相关子查询  4.3 高级子查询  4.4 总结  4.5 练习  4.6 解决方案 第5章 表表达式  5.1 派生表  5.2 公用表表达式(CTE)  5.3 视图  5.4 内联表值函数  5.5 APPLY运算符  5.6 总结  5.7 练习  5.8 解决方案 第6章 集合运算  6.1 UNION(并集)集合运算  6.2 INTERSECT(集)集合运算  6.3 EXCEPT(差集)集合运算  6.4 集合运算的优先级  6.5 避开不支持的逻辑查询处理  6.6 总结  6.7 练习  6.8 解决方案 第7章 透视、逆透视及分组集    7.1 透视转换  7.2 逆透视转换  7.3 分组集  7.4 总结  7.5 练习  7.6 解决方案 第8章 数据修改  8.1 插入数据  8.2 删除数据  8.3 更新数据  8.4 合并数据  8.5 通过表表达式修改数据  8.6 带有TOP选项的数据更新  8.7 OUTPUT子句  8.8 总结  8.9 练习  8.10 解决方案 第9章 事务和并发  9.1 事务  9.2 锁定和阻塞  9.3 隔离级别  9.4 死锁  9.5 总结  9.6 练习 第10章 可编程对象  10.1 变量  10.2 批处理  10.3 流程控制元素  10.4 游标  10.5 临时表  10.6 动态SQL  10.7 例程  10.8 错误处理  10.9 总结
注:分二卷,点击上传者查看第二卷地址。亲,本人纯手工添加了书签哦!!方便阅读  《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑查询处理、SELECT查询、连接和子查询、表表达式、过滤和分组、透视转换、修改数据、事务和一致性的处理、可编程对象等内容。   书中并非系统地罗列T-SQL的各种语法元素,而是结合实践中的各种问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。本书内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性较强,可以把它们作为解决实际问题的标准模板。阅读本书,可以充分地理解T-SQL语言和获得良好的编程实践,学会如何编写更加有效而强大的查询。书中大部分章节后面都提供了练习题目,可以帮助读者更好地掌握所学的内容。   《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》适合须要学习T-SQL的各级程序员和数据库专业人员,是他们快速掌握T-SQL的必备参考图书。 致谢 引言 第1章 T-SQL查询和编程基础 1.1 理论背景 1.2 SQL SERVER体系结构 1.3 创建表和定义数据完整性 1.4 总结 第2章 单表查询 2.1 SELECT语句的元素 2.2 谓词和运算符 2.3 CASE表达式 2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 叉联接 3.2 内联接 3.3 特殊的联接实例 3.4 外联接 3.5 总结 3.6 练习 3.7 解决方案 第4章 子查询 4.1 独立子查询 4.2 相关子查询 4.3 高级子查询 4.4 总结 4.5 练习 4.6 解决方案 第5章 表表达式 5.1 派生表 5.2 公用表表达式(CTE) 5.3 视图 5.4 内联表值函数 5.5 APPLY运算符 5.6 总结 5.7 练习 5.8 解决方案 第6章 集合运算 6.1 UNION(并集)集合运算 6.2 INTERSECT(集)集合运算 6.3 EXCEPT(差集)集合运算 6.4 集合运算的优先级 6.5 避开不支持的逻辑查询处理 6.6 总结 6.7 练习 6.8 解决方案 第7章 透视、逆透视及分组集 7.1 透视转换 7.2 逆透视转换 7.3 分组集 7.4 总结 7.5 练习 7.6 解决方案 第8章 数据修改 8.1 插入数据 8.2 删除数据 8.3 更新数据 8.4 合并数据 8.5 通过表表达式修改数据 8.6 带有TOP选项的数据更新 8.7 OUTPUT子句 8.8 总结 8.9 练习 8.10 解决方案 第9章 事务和并发 9.1 事务 9.2 锁定和阻塞 9.3 隔离级别 9.4 死锁 9.5 总结 9.6 练习 第10章 可编程对象 10.1 变量 10.2 批处理 10.3 流程控制元素 10.4 游标 10.5 临时表 10.6 动态SQL 10.7 例程 10.8 错误处理 10.9 总结 附录A SQL SERVER使用入门 索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值