- 列数量和顺序要求
- 要求:UNION 操作符两侧的查询结果集必须具有相同数量的列,并且列的顺序必须一致。这是因为 UNION 是按列位置进行合并的。
- 示例:
-- 正确示例
SELECT column1, column2 FROM table1
UNION
SELECT column3, column4 FROM table2;
-- 错误示例,列数量不一致
SELECT column1, column2 FROM table1
UNION
SELECT column3 FROM table2;
- 数据类型要求
- 要求:对应位置的列的数据类型必须兼容。虽然数据类型不一定要完全相同,但必须能进行隐式类型转换。例如,数值类型和可以转换为数值的字符串类型(如 '123')在一定程度上是兼容的。
- 示例:
-- 正确示例,数据类型兼容
SELECT id, 'text' FROM numbers_table
UNION
SELECT id, name FROM text_table;
-- 错误示例,数据类型不兼容
SELECT id, 'text' FROM numbers_table
UNION
SELECT id, date_column FROM date_table; -- date_column 假设为日期类型,与字符串不兼容
- 重复行处理
- 要求:默认情况下,UNION 会去除合并结果集中的重复行。如果想要保留所有行(包括重复行),需要使用 UNION ALL。
- 示例:
-- 使用 UNION 去除重复行
SELECT value FROM table1
UNION
SELECT value FROM table2;
-- 使用 UNION ALL 保留重复行
SELECT value FROM table1
UNION ALL
SELECT value FROM table2;
- 排序和分组
- 要求:如果对 UNION 结果进行排序或分组,ORDER BY 和 GROUP BY 子句只能在整个 UNION 语句的最后使用,不能在每个单独的 SELECT 语句中使用(除非每个 SELECT 语句都有自己独立的子查询且排序等操作在子查询内部合理使用)。
- 示例:
-- 正确示例,在 UNION 语句最后排序
SELECT value FROM table1
UNION
SELECT value FROM table2
ORDER BY value;
-- 错误示例,在单个 SELECT 语句中排序
SELECT value FROM table1 ORDER BY value
UNION
SELECT value FROM table2;