一、语法规范
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。