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 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.mfbz.cn/a/783632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类,可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止,大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器,input 元素被统一…

位置编码的具体计算方式(公式解释)

公式 (10.6.2) 描述了位置编码的具体计算方式,这种位置编码基于正弦和余弦函数,用于在自注意力机制中引入位置信息。下面我们详细解释公式和代码。 公式 (10.6.2) 公式 (10.6.2) 的目的是为输入序列中的每个词元添加一个位置编码,以保留序列…

厦门大学-中央空调分户计费预付费管理系统案例

厦门大学-中央空调分户计费预付费管理系统案例 实现中央空调节能与舒适的双重目标随着社会的发展和人们生活水平的提高,空调已成为现代建筑中不可或缺的设备。传统的集中计费方式已无法满足多样化的用户需求和节能减排的市场趋势。中央空调如何公平、公正、合理的收…

笔记本电脑投屏怎么操作?一看就会!

日常工作或办公都会用到笔记本电脑,但很多新手用户不知道笔记本电脑的投屏要怎么操作?接下来系统之家给大家介绍三种简单的操作方法,帮助大家轻松完成笔记本电脑投屏投屏操作,从而满足自己的办公或学习使用需求。 方法一 1. 直接W…

解决Ubuntu虚拟机卡死的一种可能情况:文件系统可用率不足

Ubuntu虚拟机卡死 界面挂在/dev/sda3上开不了机了,情况可能的很多,由于我这里是虚拟机,给内存才分配了20G,我一猜就是硬存炸了,果不其然。。。 进入recovery mode 我们进入recovery mode先,在VM虚拟机开…

IOC、DI<4> Unity

IOC():控制反转,把程序上层对下层的依赖,转移到第三方的容器来装配 是程序设计的目标,实现方式包含了依赖注入和依赖查找(.net里面只有依赖注入) DI:依赖注入&#xff0c…

【Mathematical14.0最新进阶教学】-1-基础计算拓展

我在真正使用Mathematica后,才发觉这个软件的神奇,但是又有对于不知道如何使用这个神奇软件,因此我将我学习《The Student’s Introduction to Mathematica and the Wolfram Language (Bruce F. Torrence, Eve A. Torrence) 》的一些心得进行…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0,var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型,通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

分享四种CAD图纸加密方法,防止盗图!

保护CAD图纸不受盗用和非法传播是设计行业中的一个重要课题,以下四种CAD图纸加密方法可以帮助防止图纸被未授权使用。 1.使用专业的加密软件(最安全的方法) 专门的加密软件,如安企神软件,可以提供更高级别的保护。它使…

【Java伴学笔记】Day-01 命令行|环境|编译解释运行|Java的相关分支|Java的特性|字面量

一、关于命令行 图形化界面的缺点 需要加载图片等一系列资源 效率较低 命令行 CMDMicrosoft Learn-CMDWindows CMD常用命令大全(值得收藏) 二、环境 什么是JDK JDK是Java Development Kit的缩写,意为Java开发工具包。它是一个用于开发Java应用…

httpd目录显示乱码问题

vim /etc/httpd/conf/httpd.conf 在<Directory “/var/www/html”>下添加&#xff1a; IndexOptions CharsetUTF-8重启httpd: systemctl restart httpd.service还是不好看&#xff0c;调整下显示宽度&#xff0c;还是这个位置&#xff1a; <Directory “/var/www/ht…

Qt使用sqlite数据库及项目实战

一.sqlite使用介绍 在Qt中使用SQLite数据库非常简单&#xff0c;SQLite是一个轻量级的嵌入式数据库&#xff0c;不需要单独的数据库服务器&#xff0c;完全使用本地文件来存储数据。 当在Qt中使用SQLite数据库时&#xff0c;需要涉及到一些SQL语句以及Qt中的相关函数&#xf…

glide加载mp4 源码堆栈调用核心代码分析

load 数据走的httpurlfetcher 的loaddata 从MultiLoader 调用而来 load到inputstream流后的处理 核心 图片是glide 首先创建解释器的时候 加了videodecoder 然后这里会从流中加载对应帧的图片保存在手机cache目录中 将这个file 作为bitmap传递 然后加载 private static final…

2024人工智能大会_强化学习论坛相关记录

求解大规模数学优化问题 规划也称为优化 四要素&#xff1a;数据、变量、目标、约束 将一个简单的数学规划问题项gpt进行提问&#xff0c;GPT给了一个近似解&#xff0c;但不是确切的解。 大模型的训练本身就是一个优化问题。 大模型是如何训练的&#xff1f;大模型训练通常使…

vue3+ el-tree 展开和折叠,默认展开第一项

默认第一项展开: 展开所有项&#xff1a; 折叠所有项&#xff1a; <template><el-treestyle"max-width: 600px":data"treeData"node-key"id":default-expanded-keys"defaultExpandedKey":props"defaultProps"…

java-数据结构与算法-02-数据结构-03-递归

1. 概述 定义 计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instances…

codeforces 1633A

文章目录 1. 题目链接2. 题目代码正确代码错误代码 3. 题目总结 1. 题目链接 Div. 7 2. 题目代码 正确代码 #include<iostream> using namespace std; int main(){int testCase;cin >> testCase;while(testCase --){int ingeter;cin >> ingeter;if(!(inget…

Python: 分块读取文本文件

在处理大文件时&#xff0c;逐行或分块读取文件是很常见的需求。下面是几种常见的方法&#xff0c;用于在 Python 中分块读取文本文件&#xff1a; 1、问题背景 如何分块读取一个较大的文本文件&#xff0c;并提取出特定的信息&#xff1f; 问题描述: fopen(blank.txt,r) quot…

专家指南:如何为您的电路选择理想的压敏电阻或热敏电阻

保护和维持电路功能需要两种设备&#xff1a;压敏电阻和热敏电阻。这两个电气元件有时会因后缀相似而混淆&#xff0c;但它们具有不同且重要的用途。 由于这种混淆&#xff0c;我们需要准确地了解这些组件是什么&#xff0c;这就是本文将要讨论的内容——应用程序、作用、优点…

SAP 无权限的解决

在进行SAP操作过程中&#xff0c;经常会出现无权限的情况&#xff0c;如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候&#xff0c;已经有角色分配了 解决&#xff1a;1、ABAA之后&#xff0c;SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…