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 t1UNION ALLSELECT x FROM t2) AS combined_resultsORDER BY xLIMIT 10;
示例演示
UNION ALL:高性能合并(保留重复)
-- 即使两个表中都有数值 1,也会全部返回SELECT x FROM few_intsUNION ALLSELECT x FROM few_ints;-- 结果包含原始数据集的两倍行数
UNION DISTINCT:去重合并(默认行为)
-- 返回两个表中不重复的唯一值SELECT x FROM few_intsUNIONSELECT 10;-- 结果集会自动去重,耗时相对较长
注意事项
列匹配:所有
SELECT 语句中的列数量必须相同,且对应位置的数据类型必须兼容。列名定义:结果集的列名通常由第一个
SELECT 语句决定。LIMIT 子句:在 TCHouse-X 中,对
UNION 的结果集使用 ORDER BY 时,不再强制要求配合 LIMIT,但为了性能考虑,建议在最外层按需添加 LIMIT。