sql 中 union 用法_sql 中 union 合并结果集详解

sql 中 union 用法_sql 中 union 合并结果集详解
最新回答
山水闲人

2026-01-02 23:31:14

SQL 中 UNION 用于合并两个或多个结构相同的 SELECT 语句结果集,要求列数和数据类型兼容,默认去重且效率较低,UNION ALL 保留重复项但效率更高。 以下是详细说明:

1. UNION 的基本语法

UNION 的核心功能是将多个 SELECT 查询的结果合并为一个结果集,其基本语法结构如下:

SELECT column1, column2, ... FROM table1UNIONSELECT column1, column2, ... FROM table2;
  • 关键要求:所有 SELECT 语句的列数必须相同,且对应列的数据类型需兼容(例如数值型与数值型、字符型与字符型)。若列数量或顺序不一致,数据库会直接报错。
  • 示例:SELECT name FROM employees WHERE department = 'HR'UNIONSELECT name FROM employees WHERE department = 'Finance';此查询合并了人力资源部和财务部的员工姓名,并自动去除重复项。

2. UNION 与 UNION ALL 的区别
  • UNION:

    自动去重:合并结果时会删除重复行,确保每行数据唯一。

    效率较低:因需去重操作,数据库需额外处理,性能开销较大。

    适用场景:明确需要去除重复数据时使用。

  • UNION ALL:

    保留所有行:直接合并所有结果,包括重复项。

    效率更高:无需去重,执行速度更快。

    适用场景:确定无重复或允许重复时优先使用。

  • 示例对比:-- 使用 UNION(去重)SELECT product_id FROM orders WHERE order_date = '2023-01-01'UNIONSELECT product_id FROM orders WHERE order_date = '2023-01-02';-- 使用 UNION ALL(保留重复)SELECT product_id FROM orders WHERE order_date = '2023-01-01'UNION ALLSELECT product_id FROM orders WHERE order_date = '2023-01-02';若某产品在两天内均有订单,UNION 仅显示一次,而 UNION ALL 会显示两次。

3. 实际使用场景
  • 合并不同条件的数据:-- 合并北京和上海的客户名单SELECT name FROM customers WHERE city = '北京'UNIONSELECT name FROM customers WHERE city = '上海';
  • 合并多表数据:-- 合并两个子系统的用户列表SELECT user_id, username FROM system1.usersUNIONSELECT user_id, username FROM system2.users;
  • 时间范围数据合并:-- 合并上个月和本月的订单数据SELECT order_id, amount FROM orders WHERE order_date BETWEEN '2023-02-01' AND '2023-02-28'UNION ALLSELECT order_id, amount FROM orders WHERE order_date BETWEEN '2023-03-01' AND '2023-03-31';
  • 排序处理:若需对最终结果排序,需在最后一个 SELECT 后添加 ORDER BY,且排序字段需存在于所有 SELECT 语句中:SELECT name FROM customers WHERE city = '北京'UNIONSELECT name FROM customers WHERE city = '上海'ORDER BY name;

4. 常见错误与注意事项
  • 列不匹配:

    数量不一致:如第一个 SELECT 选 3 列,第二个选 2 列,会报错。

    顺序不一致:即使列名相同,顺序不同也可能导致逻辑错误或报错。-- 错误示例:列顺序不一致SELECT id, name FROM table1UNIONSELECT name, id FROM table2; -- 可能报错或逻辑错误

  • 数据类型不兼容:

    如第一个 SELECT 的某列为整数型,第二个为字符型,会报错。

  • 性能问题:

    误用 UNION 导致不必要的去重操作,应优先使用 UNION ALL。

  • 逻辑混乱:

    混用带 WHERE 和不带 WHERE 的查询,可能导致结果不符合预期。

  • 别名问题:

    最终结果集的列名取自第一个 SELECT 语句,若需明确列名,可在第一个 SELECT 中使用别名:SELECT name AS customer_name FROM customers WHERE city = '北京'UNIONSELECT name FROM customers WHERE city = '上海';

总结

UNION 是 SQL 中合并结果集的强大工具,但需严格遵循列数、顺序和数据类型兼容性规则。根据是否需要去重选择 UNION 或 UNION ALL,并注意排序、别名和性能优化。合理使用可显著提升查询效率与结果准确性。