SQL的UNION用法大全介绍
SQL的UNION用法大全介绍
- SQL UNION用法大全
- 基本语法
- UNION与UNION ALL的区别
- UNION使用规则
- 常见用法示例
- 1. 基本合并查询
- 2. 保留重复记录
- 3. 多表合并
- 4. 带WHERE条件的UNION
- 5. 不同列名的合并
- 6. 与ORDER BY结合使用
- 7. 使用UNION实现复杂逻辑
- 高级用法
- 1. 使用UNION实现PIVOT效果
- 2. 动态SQL与UNION结合
- 3. 使用UNION ALL计算总计行
- 性能优化建议
- 注意事项
SQL UNION用法大全
UNION是SQL中用于合并多个SELECT语句结果集的操作符,下面详细介绍UNION的各种用法和注意事项。
基本语法
SELECT column1, column2, ...
FROM table1
UNION [ALL]
SELECT column1, column2, ...
FROM table2;
UNION与UNION ALL的区别
特性 | UNION | UNION ALL |
---|---|---|
去重 | 自动去除重复行 | 保留所有行,包括重复行 |
性能 | 较慢(需要排序和去重) | 较快(直接合并结果) |
结果排序 | 结果默认按第一列升序排列 | 结果顺序不确定 |
UNION使用规则
- 列数相同:所有SELECT语句必须有相同数量的列
- 数据类型兼容:对应列的数据类型必须兼容
- 列名规则:结果集使用第一个SELECT语句的列名
- ORDER BY位置:ORDER BY子句只能出现在最后一个SELECT语句后
常见用法示例
1. 基本合并查询
-- 合并两个表的数据(去重)
SELECT product_id, product_name FROM products_2022
UNION
SELECT product_id, product_name FROM products_2023;
2. 保留重复记录
-- 合并两个表的数据(保留重复)
SELECT customer_id FROM orders_jan
UNION ALL
SELECT customer_id FROM orders_feb;
3. 多表合并
-- 合并三个表的数据
SELECT employee_id, name FROM hr_employees
UNION
SELECT employee_id, name FROM sales_employees
UNION
SELECT employee_id, name FROM it_employees;
4. 带WHERE条件的UNION
-- 合并带条件的查询
SELECT product_id, price FROM products WHERE price > 100
UNION
SELECT product_id, price FROM discounted_products WHERE discount > 0.2;
5. 不同列名的合并
-- 列名不同时,使用第一个查询的列名
SELECT id AS user_id, name FROM users
UNION
SELECT customer_id, customer_name FROM customers;
6. 与ORDER BY结合使用
-- 对整个结果集排序
SELECT product_id, product_name FROM domestic_products
UNION
SELECT product_id, product_name FROM imported_products
ORDER BY product_name;
7. 使用UNION实现复杂逻辑
-- 使用UNION实现OR逻辑
SELECT * FROM employees WHERE department = 'IT'
UNION
SELECT * FROM employees WHERE salary > 8000;
高级用法
1. 使用UNION实现PIVOT效果
-- 将行转为列
SELECT 'Total Sales' AS metric, SUM(amount) AS value FROM sales
UNION
SELECT 'Average Sale', AVG(amount) FROM sales
UNION
SELECT 'Max Sale', MAX(amount) FROM sales;
2. 动态SQL与UNION结合
-- 根据不同条件动态构建UNION查询
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM table1 WHERE condition1';
IF @param = 1SET @sql = @sql + ' UNION SELECT * FROM table2 WHERE condition2';
EXEC sp_executesql @sql;
3. 使用UNION ALL计算总计行
-- 在报表中添加总计行
SELECT product_id, SUM(quantity) AS total_quantity
FROM order_details
GROUP BY product_id
UNION ALL
SELECT 'TOTAL' AS product_id, SUM(quantity) AS total_quantity
FROM order_details;
性能优化建议
- 尽量使用UNION ALL:除非确实需要去重,否则使用UNION ALL性能更好
- 限制结果集大小:在UNION前先用WHERE过滤数据
- 索引优化:确保UNION涉及的列有适当索引
- 考虑使用临时表:对于复杂UNION操作,可先存入临时表再处理
- 避免过度使用:UNION操作较耗资源,应考虑是否有更好的替代方案
注意事项
- UNION操作可能会改变结果顺序,除非显式使用ORDER BY
- 某些数据库对UNION结果的行数有限制
- 在事务中使用UNION时要注意锁定问题
- 不同数据库对UNION的实现可能有细微差别
通过合理使用UNION和UNION ALL,可以有效地合并多个查询结果,满足复杂的数据分析需求。