MySQL中的集合运算符详解

 更新时间:2025年02月06日 11:12:02   作者:ZachOn1y  
本文主要介绍了MySQL中的集合运算符,包括UNION、INTERSECT、EXCEPT等,这些运算符用于结合两个或多个SELECT语句的结果集,并进行去重、合并或差集操作

集合运算符

MySQL中的 集合运算符(Set operators)主要用于结合两个或多个SELECT语句的结果集,这些结果集应该具有相同的列数和数据类型,以便能够进行比较或合并。

需要注意的是,MySQL本身并没有直接称为“Set operators”的特定术语或一组专门的运算符,而是使用了一些类似功能的SQL语句或运算符来实现集合操作,如 UNIONINTERSECTEXCEPT 以及 UNION ALL 等。

UNION 和 UNION ALL

UNION 操作符允许将两个或多个查询结果集合并为单个结果集

  • UNION DISTINCT 是 SQL 中用于合并多个查询结果集去除重复行的操作符。
  • 它将多个 SELECT 语句的结果按照列的顺序合并成一个结果集,自动去重(即使未显示地指定 DISTINCT),并将结果进行排序(默认为升序)

UNION 和 UNION ALL 的区别就在于是否会自动去重且是否自动排序

  • UNION ALL 是 SQL 中用于合并多个查询结果集的操作符。
  • 它将多个 SELECT 语句的结果按照列的顺序合并成一个结果集,并保留重复行,不会对结果集进行排序。
  • 执行速度要快于UNION。若要进行排序,可以使用 ORDER BY 子句。

语法结构:

SELECT column1, column2, ... FROM table1
UNION [DISTINCT | ALL]
SELECT column1, column2, ... FROM table2;
UNION [DISTINCT | ALL]
SELECT column1, column2, ... FROM table3;

每个SELECT语句表示要合并的结果集,每个查询的列数和数据类型必须相同,若列数不相同,需要添加NULL来补足。

缺点

  • 查询语句太过冗长
  • 查询的性能不太好,因为数据库引擎必须在内部执行两个单独的查询,并将结果集合并为一个查询。

UNION vs JOIN

JOIN 水平地将查询结果集结合,UNION 垂直地将查询结果结合

UNION 结合别名

若为查询结果的列头设置别名,需要在第一个SELECT语句中为字段设置别名:

SELECT 
    CONCAT(firstName,' ',lastName) fullname
FROM
    employees 
UNION SELECT 
    CONCAT(contactFirstName,' ',contactLastName)
FROM
    customers;

EXCEPT / MINUS

EXCEPT(MINUS) 是 SQL 中用于组合多个查询结果并返回不在第一个查询结果中的唯一行的关键字。通常与 UNIONUNION ALL 一起使用,用于执行集合间的差集操作

MySQL 8.0.31 以上的版本 支持 EXCEPT 关键字,在 MySQL低版本通常使用NOT EXISTS或LEFT JOIN…IS NULL来模拟

EXCEPT 在不同的数据库管理系统中的实现可能会有所差异。在某些数据库中,可能会使用 MINUS 关键字来执行类似的操作

SELECT column_list FROM table1    -- query1
EXCEPT | MINUS [DISTINCT | ALL]
SELECT column_list FROM table2;   -- query2

'''等价于'''
SELECT column_list FROM table1
LEFT JOIN table2 ON join_predicate
WHERE table2.column_name IS NULL;

EXCEPT/MINUS 将把 query1 的结果与 query2 的结果集进行比较,并**返回 query1 的结果集中,且没有出现在 query2 的结果集中的column。

  • query1 和 query2 中的列的顺序和数量必须相同
  • query1 和 query2 中对应列的数据类型必须相同
  • 默认情况下,EXCEPT/MINUS 会使用 DISTINCT 选项,即使省略了该关键字,它会自动去重。
  • EXCEPT/MINUS ALL 将会保留重复项
  • EXCEPT/MINUS 将会返回一个结果集,查询结果的列名来自第一个查询。如果需要改变列名,可以使用别名
  • 借助 ORDER BY 子句 EXCEPT/MINUS 结果集进行排序

INTERSECT

INTERSECT 是 SQL 中一种用于获取两个查询结果集的交集的集合操作符,即同时存在于所有 SELECT 语句结果集中的行

MySQL 在其 8.0.31 及更高版本中引入了 SQL 标准中的 INTERSECT 运算符,而在低版本中,通常使用 INNER JOINEXISTS 子句来模拟INTERSECT,即找出两个结果集的交集

SELECT column_list FROM table1    -- query1
INTERSECT [DISTINCT | ALL]
SELECT column_list FROM table2    -- query2

INTERSECT操作符比较 query1 和 query2 两个查询的结果集并返回二者公共行,不同于 UNION 将二者结合。

  • query1 和 query2 中的列的顺序和数量必须相同
  • query1 和 query2 中对应列的数据类型必须相同
  • 默认情况下,INTERSECT 会使用 DISTINCT 选项,即使省略了该关键字,它会自动去重。
  • INTERSECT ALL 将会保留重复项
  • INTERSECT 将会返回一个结果集,查询结果的列名来自第一个查询。如果需要改变列名,可以使用别名
  • 借助 ORDER BY 子句 INTERSECT 结果集进行排序

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql数据库之数据备份与恢复方式

    Mysql数据库之数据备份与恢复方式

    本文详细介绍了数据库备份的重要性、分类、方法以及Mysql数据库的备份与恢复操作,包括完全备份、差异备份、增量备份等,同时,还涉及了日志数据库、备份策略和执行备份的定时任务(Crontab)等内容
    2025-01-01
  • 8种手动和自动备份MySQL数据库的方法

    8种手动和自动备份MySQL数据库的方法

    作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的。本文就为大家介绍几种适用于企业的数据备份方法,需要的朋友可以参考下
    2018-10-10
  • 一篇文章看懂MySQL主从复制与读写分离

    一篇文章看懂MySQL主从复制与读写分离

    在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,一般都是通过主从复制的方式来同步数据,再通过读写分离(来提升数据库的并发负载能力,这篇文章主要给大家介绍了关于MySQL主从复制与读写分离的相关资料,需要的朋友可以参考下
    2021-11-11
  • mysql允许外网访问以及修改mysql账号密码实操方法

    mysql允许外网访问以及修改mysql账号密码实操方法

    这篇文章主要介绍了mysql允许外网访问以及修改mysql账号密码实操方法,有需要的朋友们可以参考学习下。
    2019-08-08
  • Mysql忘记root密码怎么办

    Mysql忘记root密码怎么办

    MySQL有时候忘记了root密码是一件伤感的事,下面通过本文给大家介绍Mysql忘记root密码怎么办的相关知识,需要的朋友参考下
    2016-01-01
  • mysql alter添加列的实现方式

    mysql alter添加列的实现方式

    这篇文章主要介绍了mysql alter添加列的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 数据库设计工具MySQL Workbench使用教程(超级详细!)

    数据库设计工具MySQL Workbench使用教程(超级详细!)

    MySQL Workbench为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能,下面这篇文章主要给大家介绍了关于MySQL设计工具Workbench使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • 详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    注意:这里说的delete是指不带where子句的delete语句 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据
    2008-04-04
  • openEuler RPM方式安装MySQL8的实现

    openEuler RPM方式安装MySQL8的实现

    本文主要介绍了openEuler RPM方式安装MySQL8的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • mysql缺少my.ini文件的最佳解决方法

    mysql缺少my.ini文件的最佳解决方法

    my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的,下面这篇文章主要给大家介绍了关于mysql缺少my.ini文件的最佳解决方法,需要的朋友可以参考下
    2024-01-01

最新评论