联合查询|UNION 与 UNION ALL 区别,报表合并必备

发布时间:2026/6/2 19:28:09

联合查询|UNION 与 UNION ALL 区别,报表合并必备 前言在企业 SQL 开发中我们经常需要把多条查询结果纵向拼接成一张完整报表。比如合并 “线上订单” 和 “线下订单”合并 “今日数据” 与 “历史数据”合并多个业务线的统计结果这时就需要用到联合查询UNION和UNION ALL。 本篇从原理、语法、区别、性能、场景、避坑一次性讲透一、本章知识点汇总联合查询作用纵向合并多个 SELECT 结果集UNION 与 UNION ALL 核心区别联合查询的4 条语法铁律执行效率对比UNION ALL 远快于 UNION联合查询适用业务场景多表合并实战订单合并、数据汇总联合查询 排序 / 分页 / 条件过滤写法高频踩坑与企业规范核心总结课后练习题 答案思路二、各知识点详解1. 什么是联合查询联合查询 把多条 SELECT 的结果按行上下拼接在一起。多表结构可以不同但列数、类型、顺序必须对应最终返回一张合并后的结果表2. UNION 与 UNION ALL 核心区别面试必考UNION合并后自动去重会排序效率低适合需要 “不重复” 的干净数据UNION ALL合并后不去重保留所有行不排序、效率极高生产环境90% 优先使用一句话总结要去重用 UNION追求速度用 UNION ALL。3. 联合查询语法铁律必须遵守多个 SELECT 的列数必须完全一致对应列的数据类型必须兼容int ↔ intvarchar ↔ varchar列名以第一条 SELECT 为准后面的别名无效整体 ORDER BY 只能写在最后一条 SELECT 后面4. 效率对比关键UNION 合并 → 去重 → 排序 → 返回 数据量大时非常慢UNION ALL 直接合并 → 返回速度接近 UNION 的 10 倍以上企业规范能不用 UNION 就不用默认用 UNION ALL。5. 标准语法sqlSELECT 列1,列2,列3 FROM 表1 UNION ALL SELECT 列1,列2,列3 FROM 表2 UNION ALL SELECT 列1,列2,列3 FROM 表3 ORDER BY 排序字段; -- 全局排序三、实战环境准备直接复制运行我们创建线上订单表 线下订单表模拟业务合并场景sql-- 线上订单表 CREATE TABLE order_online ( id INT PRIMARY KEY, order_no VARCHAR(20), username VARCHAR(20), amount DECIMAL(10,2), order_type VARCHAR(10) ); -- 线下订单表 CREATE TABLE order_offline ( id INT PRIMARY KEY, order_no VARCHAR(20), username VARCHAR(20), amount DECIMAL(10,2), order_type VARCHAR(10) ); -- 插入测试数据 INSERT INTO order_online VALUES (1,OL001,张三,299,线上), (2,OL002,李四,159,线上); INSERT INTO order_offline VALUES (1,OF001,王五,88,线下), (2,OF002,张三,299,线下); -- 与线上金额重复四、应用案例及结果分析案例 1UNION ALL 合并所有订单不去重sqlSELECT order_no, username, amount, order_type FROM order_online UNION ALL SELECT order_no, username, amount, order_type FROM order_offline;结果分析一共返回4 条数据包含重复金额记录速度最快企业最常用案例 2UNION 合并并去重sqlSELECT username, amount FROM order_online UNION SELECT username, amount FROM order_offline;结果分析张三 299 重复只保留 1 条返回3 条数据有去重开销慢于 UNION ALL案例 3联合查询 全局排序报表标准写法sqlSELECT order_no, username, amount, order_type FROM order_online UNION ALL SELECT order_no, username, amount, order_type FROM order_offline ORDER BY amount DESC;结果分析合并后全局按金额降序适合导出总报表、大屏展示案例 4联合查询 常量列业务标记给合并结果统一加来源标记便于区分sqlSELECT order_no, username, amount, 线上 AS source FROM order_online UNION ALL SELECT order_no, username, amount, 线下 AS source FROM order_offline;案例 5统计合并日报 / 周报必备统计线上总金额、线下总金额、合并总金额sqlSELECT 线上合计 AS type, SUM(amount) AS total FROM order_online UNION ALL SELECT 线下合计 AS type, SUM(amount) AS total FROM order_offline UNION ALL SELECT 总合计 AS type, (SELECT SUM(amount) FROM order_online)(SELECT SUM(amount) FROM order_offline);五、注意事项列数必须一致多一列少一列都会直接报错不要滥用 UNION没有重复需求必须用 UNION ALL联合查询的列名以第一条 SELECT 为准后面别名无效全局 ORDER BY 只能写最后面不能给单条 SELECT 加排序大表合并优先 UNION ALL避免 UNION 造成数据库压力合并时字段顺序必须对应不要把 “金额” 和 “类型” 放错位UNION 不能替代 JOINUNION 是上下拼JOIN 是左右拼六、核心总结UNION/UNION ALL 作用纵向合并多个查询结果核心区别UNION去重 排序慢UNION ALL不去重超快语法铁律列数相同、类型兼容、顺序一致企业规范优先 UNION ALL必要时才用 UNION联合查询常用于多渠道订单合并、多部门统计、多维度报表口诀上下拼接用联合去重就用 UNION速度要快 ALL 选列数一致不翻车七、课后实战练习题附思路题目 1用 UNION ALL 合并线上、线下订单并只显示订单号、用户名、金额按金额升序排序。题目 2用 UNION 合并两张表的username amount实现去重效果。题目 3用联合查询实现线上订单最大金额线下订单最大金额全部订单最大金额 一行一个结果展示。参考答案思路题目 1sqlSELECT order_no, username, amount FROM order_online UNION ALL SELECT order_no, username, amount FROM order_offline ORDER BY amount ASC;题目 2sqlSELECT username, amount FROM order_online UNION SELECT username, amount FROM order_offline;题目 3sqlSELECT 线上最大, MAX(amount) FROM order_online UNION ALL SELECT 线下最大, MAX(amount) FROM order_offline UNION ALL SELECT 全部最大, GREATEST( (SELECT MAX(amount) FROM order_online), (SELECT MAX(amount) FROM order_offline) );

相关新闻