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

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 AINNER 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.rhkb.cn/news/369874.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows启动Docker闪退Docker desktop stopped

Windows启动Docker闪退-Docker desktop stopped 电脑上很早就安装有Docker了,但是有一段时间都没有启动了,今天想启动启动不起来了,打开没几秒就闪退,记录一下解决方案。仅供参考 首先,参照其他解决方案,本…

【Python系列】数字的bool值

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

JAVA每日作业day7.4

ok了家人们今天学习了Date类和simpleDateformat类,话不多说我们一起看看吧 一.Date类 类 java.util.Date 表示特定的瞬间 ( 日期和时间 ) ,精确到毫秒。 1.2 Date类的构造方法 public Date(): 用来创建当前系统时间对应的日期对象。 public Date(long …

Linux系统(CentOS)安装iptables防火墙

1,先检查是否安装了iptables 检查安装文件-执行命令:rpm -qa|grep iptables 检查安装文件-执行命令:service iptables status 2,如果安装了就卸装(iptables-1.4.21-35.el7.x86_64 是上面命令查出来的版本) 执行命令&#xff1a…

【高性能服务器】多进程并发模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 对于常见的C/S模型…

spark on k8s两种方式的原理与对比

spark on k8s两种方式的原理与对比 1、spark on k8s 方式 spark-submit可以直接用来向 Kubernetes 集群提交 Spark 应用,提交机制如下: 1、Spark 创建一个在Kubernetes pod中运行的 Spark 驱动程序。 2、驱动程序创建在 Kubernetes Pod 中运行的执行器…

JAVA基础知识(上)

# 一、说说&和&&的区别? 作为运算符:& 将二进制的每一位进行与运算 作为逻辑运算符:两者都是与,&& 如果左边为假则终止右边运算,即短路运算。& 则需要把两边的比较执行完 # 二、int和Integer的区…

智慧校园-资产管理系统总体概述

智慧校园资产管理系统是面向教育机构设计的一体化数字平台,其核心目标在于通过先进的信息技术手段,全面优化校园内部的资产管理流程。该系统致力于提升资产管理的效率与透明度,同时降低成本并确保所有操作符合财务及审计规范,为校…

springboot基于Java的超市进销存系统+ LW+ PPT+源码+讲解

第三章系统分析与设计 3.1 可行性分析 一个完整的系统,可行性分析是必须要有的,因为他关系到系统生存问题,对开发的意义进行分析,能否通过本网站来补充线下超市进销存管理模式中的缺限,去解决其中的不足等&#xff0c…

Cesium 二三维热力图

Cesium 二三维热力图 原理:主要依靠heatmap.js包来实现 效果图:

Vue 前端修改页面标题无需重新打包即可生效

在public文件夹下创建config.js文件 index.html页面修改 其他页面的标题都可以用window.title来引用就可以了!

Java项目:基于SSM框架实现的校园快递代取管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的校园快递代取管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

关于 Mac 系统 .DS_store 文件的起源

原文:Arno - 2006.10.01 (前排提醒:可以在 .gitignore 中添加 .DS_Store,否则 git 仓库会存储这个和项目无关的文件。) 如果你是 Mac 用户,曾经将文件从 Mac 传输到 Windows,那么可能对 .DS_S…

Hadoop权威指南-读书笔记-02-关于MapReduce

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊 第二章 关于MapReduce MapReduce是一种可用于数据处理的编程模型。 MapReduce程序本质上是并行运行的&#xff0c…

算法体系-26 第二十六节:第26节:单调栈结构 (5节)

一 单调栈知识讲解 1.1描述 一个数组里面想的到每个位置与他最近的左边和右边比他小的最近的信息 1.2 分析 通过单调栈的特点,for遍历数组中的每个数,当前数来的时候对比单调栈中的数进行每个数的左右判断完满足条件的进行更新到当前i种的 int[][] re…

【鸿蒙学习笔记】Stage模型工程目录

官方文档:应用配置文件概述(Stage模型) 目录标题 FA模型和Stage模型工程级目录模块级目录app.json5module.json5程序执行流程程序基本结构开发调试与发布流程 FA模型和Stage模型 工程级目录 模块级目录 app.json5 官方文档:app.j…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…

【机器学习】机器学习与自然语言处理的融合应用与性能优化新探索

引言 自然语言处理(NLP)是计算机科学中的一个重要领域,旨在通过计算机对人类语言进行理解、生成和分析。随着深度学习和大数据技术的发展,机器学习在自然语言处理中的应用越来越广泛,从文本分类、情感分析到机器翻译和…

项目部署_持续集成_Jenkins

1 今日内容介绍 1.1 什么是持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干 持续集成的组成要素 一个自动构建过程, 从检出代码、 编译构建…

【Python】基于KMeans的航空公司客户数据聚类分析

💐大家好!我是码银~,欢迎关注💐: CSDN:码银 公众号:码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…