union在sql中的用法 快速学会union合并查询技巧

union在sql中的用法 快速学会union合并查询技巧
最新回答
旅行号行星

2022-03-01 09:36:58

SQL中的UNION是一种将多个SELECT语句的结果集合并为一个结果集的操作,要求各SELECT语句的列数和数据类型一致,并自动去除重复行;若需保留所有行,可使用UNION ALL。

核心功能与特点
  • 合并结果集:UNION将多个SELECT查询的结果纵向拼接,生成一个统一的结果集。

    示例:SELECT column1, column2 FROM table1UNIONSELECT column1, column2 FROM table2;此查询将table1和table2中column1和column2的数据合并,去除重复行。

  • 去重与保留所有行

    UNION:自动去除重复行。

    UNION ALL:保留所有行(包括重复行),性能更高,适合无需去重的场景。

    示例:SELECT product_id FROM sales_2022UNION ALLSELECT product_id FROM sales_2023;

适用场景
  1. 报告与数据分析:合并不同数据源的同类数据(如销售数据、用户行为数据)。

    示例:合并两个地区的销售记录:SELECT region, amount FROM sales_eastUNIONSELECT region, amount FROM sales_west;

  2. 复杂查询:合并不同表的不同列,并进行计算或格式统一。

    示例:合并订单和支付记录,统一日期和金额字段:SELECT customer_id, order_date, amount AS total_amountFROM ordersWHERE order_date >= '2023-01-01'UNIONSELECT customer_id, payment_date AS order_date, payment_amount AS total_amountFROM paymentsWHERE payment_date >= '2023-01-01';

使用限制与注意事项
  • 列数与数据类型一致:所有SELECT语句的列数必须相同,且对应列的数据类型需兼容(如数值型与字符串型不可直接合并)。

    错误示例:SELECT name, age FROM usersUNIONSELECT product_name, price FROM products; -- 列数或类型不匹配

  • NULL值处理:UNION操作中,NULL值会被视为相等(即两行均为NULL时会去重)。若需区分NULL,需额外处理。

    示例:SELECT id, NULL AS category FROM table1UNIONSELECT id, 'default' AS category FROM table2; -- 显式指定NULL的替代值

  • 排序与性能

    排序:UNION后的结果集需通过ORDER BY统一排序,且排序字段需出现在所有SELECT语句中。SELECT name FROM employeesUNIONSELECT name FROM contractorsORDER BY name;

    性能优化

    大数据量时优先使用UNION ALL(避免去重开销)。

    复杂查询可拆分为临时表或视图,减少重复计算。

    示例:-- 使用临时表优化WITH combined_data AS ( SELECT * FROM table1 UNION ALL SELECT * FROM table2)SELECT * FROM combined_data WHERE condition;

最佳实践
  1. 简化查询:减少不必要的列和复杂条件,提升可读性。

    示例:-- 不推荐:冗余列SELECT id, name, NULL AS address, NULL AS phone FROM table1UNIONSELECT id, name, address, phone FROM table2;-- 推荐:仅保留必要列SELECT id, name FROM table1UNIONSELECT id, name FROM table2;

  2. 使用视图封装:将频繁使用的UNION查询定义为视图,便于维护。

    示例:CREATE VIEW combined_sales ASSELECT product_id, amount FROM sales_2022UNIONSELECT product_id, amount FROM sales_2023;-- 后续查询直接使用视图SELECT * FROM combined_sales WHERE amount > 1000;

  3. 替代方案评估:根据场景选择JOIN、临时表或应用层合并,避免过度依赖UNION。

    示例:合并用户和订单数据时,若需关联信息,JOIN可能更高效:SELECT u.name, o.order_dateFROM users uJOIN orders o ON u.id = o.user_id;

总结

UNION是SQL中强大的数据合并工具,适用于报告生成、多源数据整合等场景。使用时需注意列结构一致性、性能优化(优先UNION ALL)及NULL值处理。通过简化查询、使用视图和评估替代方案,可进一步提升效率与可维护性。