欢迎投稿

今日深度:

MySQL中的集合运算符详解,

MySQL中的集合运算符详解,


目录
  • 集合运算符
    • UNION 和 UNION ALL
    • 缺点
    • UNION vs JOIN
    • UNION 结合别名
    • EXCEPT / MINUS
  • INTERSECT
    • 总结

      集合运算符

      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 结果集进行排序

      总结

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

      您可能感兴趣的文章:
      • MySQL 8.0新特性之集合操作符INTERSECT和EXCEPT
      • MySQL修炼之联结与集合浅析
      • mysql 如何获取两个集合的交集/差集/并集
      • 解决从集合运算到mysql的not like找不出NULL的问题
      • MySQL模糊查询语句整理集合

      www.htsjk.Com true http://www.htsjk.com/Mysql/48645.html NewsArticle MySQL中的集合运算符详解, 目录 集合运算符 UNION 和 UNION ALL 缺点 UNION vs JOIN UNION 结合别名 EXCEPT / MINUS INTERSECT 总结 集合运算符 MySQL中的 集合运算符 (Set operators)主要用于结合两个或多...
      评论暂时关闭