MySQL 8.0中的INTERSECT和EXCEPT

简介: 随着MySQL最新版本(8.0.31)的推出,MySQL增加了对SQL标准INTERSECT和EXCEPT表运算符的支持。让我们看看如何使用它们,我们将使用下表

随着MySQL最新版本(8.0.31)的推出,MySQL增加了对SQL标准INTERSECT和EXCEPT表运算符的支持。让我们看看如何使用它们,我们将使用下表:





CREATE TABLE `new` (  `id` int NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  `tacos` int DEFAULT NULL,  `sushis` int DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB


我们为团队会议准备了甜点,包括:玉米饼(tacos)和寿司(sushis),每条记录代表一个团队成员选择甜点的信息:




select * from new;+----+-------------+-------+--------+| id | name        | tacos | sushis |+----+-------------+-------+--------+|  1 | Kenny       |  NULL |     10 ||  2 | Miguel      |     5 |      0 ||  3 | lefred      |     4 |      5 ||  4 | Kajiyamasan |  NULL |     10 ||  5 | Scott       |    10 |   NULL ||  6 | Lenka       |  NULL |   NULL |+----+-------------+-------+--------+


01

INTERSECT


INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。我们运行两个查询,第一个会列出团队成员选择玉米饼的所有记录,第二个会返回团队成员选择寿司的所有记录。这两个单独的查询是:



(query 1) select * from new where tacos>0;(query 2) select * from new where sushis>0;

INTERSECT的插图


这两个结果中唯一共同存在的记录是id=3的记录。让我们使用INTERSECT来确认:





select * from new where tacos > 0 intersect select * from new where sushis > 0;+----+--------+-------+--------+| id | name   | tacos | sushis |+----+--------+-------+--------+|  3 | lefred |     4 |      5 |+----+--------+-------+--------+

很好,但在以前版本的MySQL上,此类查询的结果应该是:





ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'intersect select * from new where sushis > 0' at line 1


02

EXCEPT


EXCEPT输出在第一个SELECT语句结果中存在但不在第二个SELECT语句结果中的行。让我们找出所有只使用EXCEPT吃玉米饼的团队成员:



select * from new where tacos > 0 except select * from new where sushis > 0;+----+--------+-------+--------+| id | name   | tacos | sushis |+----+--------+-------+--------+|  2 | Miguel |     5 |      0 ||  5 | Scott  |    10 |   NULL |+----+--------+-------+--------+

EXCEPT的插图

如果我们想反过来,让所有只吃寿司的人,我们就会像这样反转查询顺序:





select * from new where sushis > 0 except select * from new where tacos > 0;+----+-------------+-------+--------+| id | name        | tacos | sushis |+----+-------------+-------+--------+|  1 | Kenny       |  NULL |     10 ||  4 | Kajiyamasan |  NULL |     10 |+----+-------------+-------+--------+


03

结论


MySQL 8.0.31延续了8.0已有的功能,包括对SQL标准的支持,如窗口函数、通用表表达式、后派生表、JSON_TABLES、JSON_VALUE、...享受MySQL!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
安全 网络安全 数据安全/隐私保护
【网络工程师】<软考中级>网络安全与应用
【1月更文挑战第27天】【网络工程师】<软考中级>网络安全与应用
|
Windows
Windows下CMD中文乱码问题解决方法,设置代码页65001后仍然乱码
原文地址: http://blog.csdn.net/u011250882/article/details/48136883 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。  如果想正确显示UTF-8
14605 0
|
C# Windows 容器
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
NotifyIcon控件表示系统右下角任务栏上的托盘图标,其ShowBalloonTip方法用于显示气球状提示框(Win10只有为本地Toast通知),ToolTip\oolTipText可以...
4005 0
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
|
9月前
|
SQL 人工智能 自然语言处理
数据语义编织:企业级 Data Agent 的必备基建
2025 年,每家企业都想拥有自己的 Data Agent,但 90% 的项目可能不是死在 Demo 阶段就是建成后无人问津。为什么?因为我们试图用概率性的 LLM 去直接挑战确定性的数据分析,对结果期待太高,而对过程准备不足。
|
11月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2782 35
|
消息中间件 缓存 NoSQL
如何实现消费幂等 ?
这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:**消费幂等**。
如何实现消费幂等 ?
|
存储 前端开发 安全
如何优雅的使用FlaskWeb表单,快速掌握Flask-WTF
Flask-WTF扩展可以把处理Web表单的过程变成一种愉悦的体验。这个扩展对独立的WTForms包进行了包装,方便集成到Flask应用中。 Flask-WTF及其依赖可使用pip安装:
1331 0
如何优雅的使用FlaskWeb表单,快速掌握Flask-WTF
|
数据采集 机器学习/深度学习 API
爬虫过程中如何处理验证码?
【2月更文挑战第22天】【2月更文挑战第69篇】 爬虫过程中如何处理验证码?
1367 1
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
1348 5
|
算法 Python
算法小白秒变高手?一文读懂Python时间复杂度与空间复杂度,效率翻倍不是梦!
【7月更文挑战第24天】在编程中,算法效率由时间复杂度(执行速度)与空间复杂度(内存消耗)决定。时间复杂度如O(n), O(n^2), O(log n),反映算法随输入增长的耗时变化;空间复杂度则衡量算法所需额外内存。案例对比线性搜索(O(n))与二分搜索(O(log n)),后者利用有序列表显著提高效率。斐波那契数列计算示例中,递归(O(n))虽简洁,但迭代(O(1))更节省空间。掌握这些,让代码性能飞跃,从小白到高手不再是梦想。
520 1