MySQL 联合查询
联合查询用于合并多个 SELECT 语句的结果集,是数据整合的常用手段。
基本语法
SQL
SELECT 列名 FROM 表1
UNION [ALL]
SELECT 列名 FROM 表2;
UNION 与 UNION ALL
| 操作符 | 功能 | 性能 |
|---|---|---|
| UNION | 合并并去重 | 较慢,需排序去重 |
| UNION ALL | 合并不去重 | 较快,直接合并 |
使用示例
UNION 去重合并
SQL
-- 合并两个部门的员工,自动去重
SELECT emp_name FROM employees WHERE dept_id = 10
UNION
SELECT emp_name FROM employees WHERE dept_id = 20;
UNION ALL 保留重复
SQL
-- 合并两个部门的员工,保留重复记录
SELECT emp_name FROM employees WHERE dept_id = 10
UNION ALL
SELECT emp_name FROM employees WHERE dept_id = 20;
多表联合
SQL
-- 合并三个查询结果
SELECT product_name FROM products WHERE price > 1000
UNION ALL
SELECT product_name FROM archived_products WHERE price > 1000
UNION ALL
SELECT product_name FROM temp_products WHERE price > 1000
ORDER BY product_name;
联合查询排序
SQL
-- 排序必须放在最后一条SELECT语句
SELECT emp_name, salary FROM employees WHERE dept_id = 10
UNION ALL
SELECT emp_name, salary FROM employees WHERE dept_id = 20
ORDER BY salary DESC;
使用规则
- 列数必须相同:每条 SELECT 的列数必须一致
- 列类型兼容:对应列的数据类型必须兼容
- 列名取自首句:结果集列名由第一条 SELECT 决定
- 排序放末尾:ORDER BY 只能出现在最后一条 SELECT 后
典型应用场景
SQL
-- 场景1:合并不同表的结构相似数据
SELECT id, name, 'customers' AS source FROM customers
UNION ALL
SELECT id, name, 'suppliers' AS source FROM suppliers;
-- 场景2:分页数据合并展示
SELECT * FROM (
SELECT id, title, create_time FROM articles
UNION ALL
SELECT id, title, create_time FROM videos
) AS combined
ORDER BY create_time DESC
LIMIT 20;
要点总结
- UNION 自动去重,UNION ALL 保留所有记录
- 各 SELECT 列数必须相同,类型必须兼容
- ORDER BY 只能放在整个语句末尾
- 性能优先选择 UNION ALL,需要去重时使用 UNION
📝 发现内容有误?点击此处直接编辑