当前位置: 代码网 > it编程>数据库>Mysql > MySQL中的集合运算符详解

MySQL中的集合运算符详解

2025年02月13日 Mysql 我要评论
集合运算符mysql中的 集合运算符(set operators)主要用于结合两个或多个select语句的结果集,这些结果集应该具有相同的列数和数据类型,以便能够进行比较或合并。需要注意的是,mysq

集合运算符

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com