目录

  1. UNION 操作符概述
  2. UNION 基本语法
  3. UNION 与 UNION ALL 的区别
  4. UNION 使用示例
  5. UNION 操作的限制
  6. 优化 UNION 查询
  7. 参考资料

UNION 操作符概述

UNION 操作符用于合并两个或多个 SELECT 查询的结果,并去除重复记录(默认情况下)。所有 SELECT 语句的列数、数据类型必须匹配,否则会报错。


UNION 基本语法

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

要求:

  • 每个 SELECT 查询的列数必须相同。
  • 每个 SELECT 查询的列数据类型必须兼容。
  • UNION 默认会去除重复记录。

UNION 与 UNION ALL 的区别

操作符作用是否去重执行效率
UNION合并查询结果✅ 是⏳ 较慢
UNION ALL合并查询结果❌ 否🚀 较快

示例:

使用 UNION(去重)

SELECT city FROM customers
UNION
SELECT city FROM suppliers;

如果 customerssuppliers 中存在相同的 city,最终结果只保留一条。

使用 UNION ALL(不去重)

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;

即使 customerssuppliers 中的 city 有重复,也会全部显示。


UNION 使用示例

1. 合并两个相同结构的查询结果

查询所有员工和客户的姓名:

SELECT name FROM employees
UNION
SELECT name FROM customers;

注意:

  • 这两个 SELECT 语句的列数必须相同。
  • 由于 UNION 默认去重,相同的 name 只会显示一次。

2. 使用 ORDER BY 排序

查询所有用户(包括普通用户和管理员),并按姓名排序:

SELECT name, 'User' AS type FROM users
UNION
SELECT name, 'Admin' AS type FROM admins
ORDER BY name;

  • UNION 只能有一个 ORDER BY,并且要放在最后。

3. 使用 WHERE 进行筛选

查询 2024 年及之前的订单:

SELECT order_id, order_date FROM orders WHERE order_date <= '2024-12-31'
UNION
SELECT order_id, order_date FROM old_orders WHERE order_date <= '2024-12-31';

作用:

  • ordersold_orders 两张表中筛选 2024 年及之前的订单。

UNION 操作的限制

  1. 列数必须相同 SELECT id, name FROM employees UNION SELECT id FROM customers; -- ❌ 错误,列数不匹配!
  2. 数据类型必须兼容 SELECT id, name FROM employees UNION SELECT id, age FROM customers; -- ❌ 错误,name 和 age 数据类型不同!
  3. ORDER BY 只能在最后 SELECT name FROM employees ORDER BY name -- ❌ 错误,ORDER BY 不能出现在子查询中 UNION SELECT name FROM customers;

优化 UNION 查询

1. 使用 UNION ALL 提高性能

如果不需要去重,使用 UNION ALL 速度更快:

SELECT name FROM employees
UNION ALL
SELECT name FROM customers;

2. 确保索引优化

  • 如果 UNION 查询涉及大量数据,应确保涉及的列有索引。
  • 例如,查询 userscustomers 表的 email 字段: CREATE INDEX idx_email ON users(email); CREATE INDEX idx_email ON customers(email);

3. 减少不必要的列

  • 仅选择需要的列,避免 SELECT *
  • ❌ 不推荐: SELECT * FROM employees UNION SELECT * FROM customers;
  • ✅ 推荐: SELECT id, name FROM employees UNION SELECT id, name FROM customers;

参考资料


如果你有更多 UNION 相关的需求或问题,请告诉我!