目录
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;
如果 customers
和 suppliers
中存在相同的 city
,最终结果只保留一条。
使用 UNION ALL
(不去重)
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;
即使 customers
和 suppliers
中的 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';
作用:
- 从
orders
和old_orders
两张表中筛选2024
年及之前的订单。
UNION 操作的限制
- 列数必须相同
SELECT id, name FROM employees UNION SELECT id FROM customers; -- ❌ 错误,列数不匹配!
- 数据类型必须兼容
SELECT id, name FROM employees UNION SELECT id, age FROM customers; -- ❌ 错误,name 和 age 数据类型不同!
- 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
查询涉及大量数据,应确保涉及的列有索引。 - 例如,查询
users
和customers
表的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
相关的需求或问题,请告诉我!
发表回复