MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

news2024/12/23 17:45:24

MySQL8.0.31 新版本的推出,MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。

1、INTERSECT

INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。

我们运行两个查询,第一个会列出ID是 1,2,3 记录,第二个会列出ID是 2,3,4记录。这两个单独的查询是:
在这里插入图片描述
we had two result sets T1 and T2:

  • T1 result set includes 1, 2, and 3.
  • T2 result set includes 2, 3, and 4.

The intersection of T1 and T2 result sets returns the distinct rows which are 2 and 3

(root@localhost)[(none)]> with t1 as (select 1 as id union all select 2 as id union all select 3 as id),
    ->  t2 as (select 2 as id union all select 3 as id union all select 4 as id)
    -> select id from t1 intersect select id from t2;
+----+
| id |
+----+
|  2 |
|  3 |
+----+
2 rows in set (0.02 sec)

2、EXCEPT

except输出在第一个select语句结果中存在但不在二个查询结果中的记录的行。
The following are the rules for combining the result sets of two queries in the above syntax:

The number and order of columns must be the same in both queries.

The data types of the corresponding columns must be the same or compatible.

The following picture shows the EXCEPT operation of the two result sets T1 and T2:

在这里插入图片描述

(root@localhost)[(none)]> with t1 as (select 1 as id union all select 2 as id union all select 3 as id),
-> t2 as (select 2 as id union all select 3 as id union all select 4 as id) 
-> select id from t1 except select id from t2;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

3、MySQL 8.0及之前的版本中

在MySQL 8.0及之前的版本中,直接并不支持SQL标准中的INTERSECT和EXCEPT操作符,这两个操作符在SQL中用于集合运算,分别用来找出两个查询结果的交集和差集。但是,你可以通过其他方式来实现类似INTERSECT和EXCEPT的功能。

3.1、模拟INTERSECT

要模拟INTERSECT的行为,你可以使用INNER JOIN或者EXISTS子查询。但是,对于简单的交集查询,通常使用INNER JOIN的方式更为直观。

使用INNER JOIN模拟INTERSECT
假设你有两个表TableA和TableB,你想要找出在TableA.column1和TableB.column1中都存在的值,可以这样做

SELECT A.column1  
FROM TableA A  
  INNER JOIN TableB B ON A.column1 = B.column1;

如果这两个列来自不同的查询,你可以使用子查询或临时表/CTE(公用表表达式,MySQL 8.0支持)来模拟

WITH CTE_A AS (  
    SELECT column1 FROM (your_query_for_TableA)  
), CTE_B AS (  
    SELECT column1 FROM (your_query_for_TableB)  
)  
SELECT A.column1  
FROM CTE_A AS A
  INNER JOIN CTE_B AS B ON A.column1 = B.column1;

3.2、模拟EXCEPT

要模拟EXCEPT的行为,你可以使用LEFT JOIN或者NOT EXISTS子查询。使用LEFT JOIN的方式通常更为直接。

使用LEFT JOIN模拟EXCEPT
假设你仍然使用TableA和TableB,并且想要找出在TableA.column1中存在但在TableB.column1中不存在的值,可以这样做:

SELECT A.column1  
FROM TableA A  
  LEFT JOIN TableB B ON A.column1 = B.column1  
WHERE B.column1 IS NULL;

或者,如果你有两个不同的查询结果,你可以使用子查询或CTE来模拟

WITH CTE_A AS (  
    SELECT column1 FROM (your_query_for_TableA)  
), CTE_B AS (  
    SELECT column1 FROM (your_query_for_TableB)  
)  
SELECT A.column1  
FROM CTE_A AS A  
  LEFT JOIN CTE_B AS B ON A.column1 = B.column1  
WHERE B.column1 IS NULL;

4、注意事项

  • 当使用 INTERSECT 或 EXCEPT 时,两个查询的列数和列的数据类型必须兼容。这意味着两个查询必须选择相同数量的列,并且这些列在数据类型上必须能够相互比较。

  • 默认情况下,INTERSECT 和 EXCEPT 返回的结果集中的列没有特定的顺序。如果你需要结果按特定顺序返回,你应该使用 ORDER BY 子句。

  • 这两个操作符在处理大量数据时可能会比使用 JOIN 或其他集合操作更慢,因为 MySQL 需要分别执行两个查询,然后在内部对它们的结果集进行比较。因此,在性能敏感的应用程序中,建议仔细考虑查询的设计和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仰邦BX.K协议对接

背景 使用BX 6K控制卡控制诱导屏显示剩余车位数,由于控制卡和服务端不在一个局域网内,所以不能使用官网提供的案例,官网提供的案例为控制卡为TCP Server,服务端为TCP Client,因此需要开发此程序,服务端左右…

docker mysql cpu100% cpu打满排查 mysql cpu爆了 mysql cpu 100%问题排查

1. docker 启动了一个mysql 实例,近期忽然发现cpu100% 如下图所示 命令: top 2.进入容器内排查: docker exec mysql(此处可以是docker ps -a 查找出来的image_id) -it /bin/bash cd /var/log cat mysqld.log 容器内m…

Android LayoutInflater 深度解析

在 Android 开发中,LayoutInflater 是一个非常重要的工具。它允许我们从 XML 布局文件中动态地创建 View 对象,从而使得 UI 的创建和管理更加灵活。本文将深入解析 android.view.LayoutInflater,包括它的基本用法、常见问题以及高级用法。 什…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么,而不是以什么形式做。 以函数式接口Runnable为例讲解: public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

学习无人机飞行技术,有哪些就业方向?

随着无人机技术的不断进步和应用领域的拓展,研发创新人才的需求也将不断增加,那就业前景还是很广阔的。学习无人机飞行技术后,有以下多个就业方向可供选择: 1. 无人机操作员: - 负责操控和监控无人机飞行,…

第57期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

“探索价值增长消费:让每一笔购物都成为增值之旅“

亲爱的顾客们,你们好!今天,我将带你们探索一种革命性的消费哲学——价值增长消费,让每一次购物都成为一次增值之旅! 在传统消费观念里,我们付出金钱换取商品或服务,随后这些便成为过去。但如今…

38. 扫描系统设计

导论: 扫描系统根据反射旋转类型分为平面振镜扫描和转股扫描,根据光路途径分为一维、二维和三维扫描,根据振镜和扫描镜头的位置又可分为镜前扫描和镜后扫描。 设计流程: zemax设计与优化: 系统建模 在孔径类型中选择入瞳直径…

fastapi swagger js css 国内访问慢问题解决

fastapi swagger js css 国内访问慢问题解决 直接修改fastapi包中静态资源地址为如下地址 swagger_js_url: str "https://cdn.bootcdn.net/ajax/libs/swagger-ui/3.9.3/swagger-ui-bundle.js", swagger_css_url: str "https://cdn.bootcdn.net/ajax/libs/sw…

发电机保护屏的作用及其重要性

发电机保护屏的作用及其重要性 发电机保护屏是电力系统中的重要组成部分,它负责监测和控制发电机的运行状态,确保发电机在正常运行和故障情况下都能得到及时、准确的保护。负责监测和控制发电机运行状态,确保及时准确的保护。它由显示屏、控制…

python学习-list

List(列表的定义语法) [元素1, 元素2, 元素3, ......] 什么是元素? 数据容器内的每一份数据,都称之为元素 元素的类型有限制吗? 元素的数据类型没有任何限制,甚至元素也可以是列表,这样就定义了嵌套列表 但是打印…

RT-Thread Studio与CubeMX联合编程之rtthread stm32h743的使用(十一)spi设备SFUD驱动的使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验,核心板如图: 1.建立新工程,选择相应的芯片型号及debug引脚及调试器 2.编译下载,可以看到串口打印正常 3.…

数据结构_1.0

一、数据结构概述 1.1 概念 在计算机科学中,数据结构是一种数据组织、管理和存储的格式 。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

【】AI八股-神经网络相关

Epoch Epoch 是指完成一次完整的数据集训练的过程。比如,有一个数据集有1000个样本,当网络用这些样本训练一次后,这就是一个epoch。 Iteration Iteration 是指在一个epoch中,使用一个batch进行训练的次数。如果你的数据集有100…

2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证试题及解析根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通…

深度解密Spark性能优化之道

课程介绍 课程通过实战案例解析和性能调优技巧的讲解,帮助学员提升大数据处理系统的性能和效率。课程内容涵盖了Spark性能调优的各个方面,包括内存管理、并行度设置、数据倾斜处理、Shuffle调优、资源配置等关键技术和策略。学员将通过实际案例的演示和…

文件操作详解(C语言)

1.为什么要用到文件?怎样数据才能持久化? 保存在内存中的数不安全(一次断电,忘记保存,不用了还给系统) 持久化:保存在硬盘上(放在文件中) 什么是文件?文件…

鱼塘专用激光冲击波声压网驱鸟器

随着生态环境的日益改善,越来越多的鸟类频繁光临鱼塘,捕食鱼苗或成鱼,给养殖户造成巨大的经济损失。 如何有效地让鸟远离你的鱼塘呢? 鱼塘专用激光冲击波声压网驱鸟器,结合了多种驱鸟功能,包括激光驱鸟技术…

分页导航DOM更新实践:JavaScript与jQuery的结合使用

分页导航DOM更新实践:JavaScript与jQuery的结合使用 在Web开发中,分页导航是展示大量数据时不可或缺的UI组件。合理的分页不仅可以提高应用性能,还能优化用户体验。本博客将通过一个实际的DOM结构和模拟数据,讲解如何使用JavaScr…

CentOS修复OpenSSH漏洞升级到openssh 9.7 RPM更新包

在做政府和学校单位网站时,经常需要服务器扫描检测,经常被OpenSSH Server远程代码执行漏洞(CVE-2024-6387)安全风险通告,出了报告需要升级OpenSSH。 使用yum update openssh是无法更新到最新的,因为系统里的…