UNION 子句

最近更新时间:2026-05-06 16:28:13

我的收藏
UNION 子句用于将两个或多个 SELECT 语句的结果集组合成一个单一的结果集。它在逻辑上是对数据集的“并集”操作。

语法规范

query_1 UNION [DISTINCT | ALL] query_2
UNION DISTINCT(默认):合并结果集并移除重复行。
UNION ALL:合并结果集并保留所有行(包括重复行)。

关键对比与性能建议

特性
UNION ALL
UNION (DISTINCT)
重复值处理
保留所有重复记录
自动应用 DISTINCT 去重
内存消耗
低。数据直接流式传输
高。需在内存中维护哈希表以检测重复
处理速度
快。几乎无额外开销
慢。涉及昂贵的去重计算
推荐场景
确定数据无重复,或业务允许重复
必须保证结果集唯一时
注意:
在 TCHouse-X 中,处理数百万行数据时,去重操作会导致巨大的 CPU 和内存开销。若业务逻辑允许,强烈建议优先使用 UNION ALL

高级用法说明

全局排序与分页:如果直接对单个查询使用 ORDER BY,它仅作用于该子部分。若要对合并后的最终结果集进行全局排序,必须将 UNION 语句包装在子查询中:
-- 推荐:对合并后的所有结果进行全局排序
SELECT * FROM (
SELECT x FROM t1
UNION ALL
SELECT x FROM t2
) AS combined_results
ORDER BY x
LIMIT 10;

示例演示

UNION ALL:高性能合并(保留重复)

-- 即使两个表中都有数值 1,也会全部返回
SELECT x FROM few_ints
UNION ALL
SELECT x FROM few_ints;
-- 结果包含原始数据集的两倍行数

UNION DISTINCT:去重合并(默认行为)

-- 返回两个表中不重复的唯一值
SELECT x FROM few_ints
UNION
SELECT 10;
-- 结果集会自动去重,耗时相对较长

注意事项

列匹配:所有 SELECT 语句中的列数量必须相同,且对应位置的数据类型必须兼容。
列名定义:结果集的列名通常由第一个 SELECT 语句决定。
LIMIT 子句:在 TCHouse-X 中,对 UNION 的结果集使用 ORDER BY 时,不再强制要求配合 LIMIT,但为了性能考虑,建议在最外层按需添加 LIMIT。