sql-语法 UNION, UNION ALL

UNION ALL 是 SQL 中用于合并多个 SELECT 查询结果集的操作符。它与 UNION 类似,但有一个关键区别:UNION ALL 保留所有行(包括重复行),而 UNION 会自动去重。

sql 复制代码
SELECT column1, column2, ... FROM table1
UNION ALL
SELECT column1, column2, ... FROM table2
UNION ALL
SELECT column1, column2, ... FROM table3;
  1. 每个 SELECT 语句的列数必须相同
  2. 对应列的数据类型需兼容(如都是字符串或数字)
  3. 列的顺序必须一致
特性 UNION ALL UNION
是否去重 ❌ 保留所有重复行 ✅ 自动去除重复行
是否排序 ❌ 不排序 ✅ 隐式排序(用于去重)
性能 ⚡ 更快(无去重开销) 🐢 较慢(需排序+去重)
适用场景 数据互斥、无需去重 需要唯一结果集

在大数据量下,UNION 可能因去重操作触发临时表写入和内存溢出,而 UNION ALL 几乎无额外开销,速度通常快 3--5 倍。

例子

sql 复制代码
-- 合并 2023 年和 2024 年的订单表(数据天然互斥)
SELECT order_id, amount, '2023' AS year FROM orders_2023
UNION ALL
SELECT order_id, amount, '2024' AS year FROM orders_2024;
sql 复制代码
-- 快速生成包含重复值的测试集
SELECT 'Alice' AS name, 25 AS age
UNION ALL
SELECT 'Bob', 30
UNION ALL
SELECT 'Alice', 25; -- 重复行会被保留
  1. 列名以第一个 SELECT 为准
    结果集的列名由第一个查询决定,后续查询的列名会被忽略。
  2. 避免在不需要去重时使用 UNION
    如果你确定数据无重复(如分表查询),用 UNION ALL 更高效。
  3. 与 ORDER BY 配合使用
    若需对最终结果排序,必须将整个 UNION ALL 作为子查询:
sql 复制代码
SELECT * FROM (
    SELECT name, age FROM table1
    UNION ALL
    SELECT name, age FROM table2
) AS combined
ORDER BY age;

"不确定是否重复?先用 UNION ALL,再根据业务需求决定是否去重。"