sql union 和 union all

sql union 和 union all
UNION和UNION ALL是 SQL 中用于合并两个或多个查询结果集的操作符。它们的基本作用相同但在去重和性能上有关键区别。一、核心区别特性UNIONUNION ALL去重✅ 会去除重复行❌ 保留所有行包括重复性能较慢需要排序去重更快直接合并使用场景需要唯一结果集不关心重复 / 已知不会重复记住一句话UNION ALL是直接拼接UNION是拼接后再去重。二、示例说明假设有两张表表 Atextid | name ----|------ 1 | 张三 2 | 李四表 Btextid | name ----|------ 2 | 李四 3 | 王五UNION ALL保留重复sqlSELECT id, name FROM A UNION ALL SELECT id, name FROM B;结果text1 | 张三 2 | 李四 2 | 李四 ← 重复保留 3 | 王五UNION去重sqlSELECT id, name FROM A UNION SELECT id, name FROM B;结果text1 | 张三 2 | 李四 3 | 王五三、使用限制和注意事项规则说明列数必须相同所有查询的SELECT列数必须一致列类型必须兼容对应列的数据类型必须能隐式转换列名以第一个查询为准最终结果集的列名由第一个SELECT决定ORDER BY只能放在最后不能对单个子查询排序只能对整个结果集排序LIMIT只能放在最后同上四、常见写法1. 合并查询结果sqlSELECT id, name FROM table_a UNION ALL SELECT id, name FROM table_b ORDER BY id DESC; -- 对整个结果集排序2. 合并后分页sqlSELECT id, name FROM ( SELECT id, name FROM table_a UNION ALL SELECT id, name FROM table_b ) t LIMIT 10 OFFSET 0;3. 组合UNION和WHEREsqlSELECT id, name FROM table_a WHERE status 1 UNION ALL SELECT id, name FROM table_b WHERE status 1;五、性能对比操作执行计划UNION ALL直接 Append追加结果集最快UNIONAppend Sort Unique排序去重多消耗 CPU 和内存建议如果确认数据不会重复或者业务上允许重复尽量使用UNION ALL。六、在 MyBatis-Plus / JPA 中使用MyBatis-PlusXMLxmlselect idunionExample resultTypecom.seazon.cloud.entity.Driver SELECT id, name FROM driver_info UNION ALL SELECT id, name FROM driver_history /selectJPA原生 SQLjavaQuery(value SELECT id, name FROM driver_info UNION ALL SELECT id, name FROM driver_history, nativeQuery true) ListObject[] unionQuery();七、UNION与JOIN的区别对比UNIONJOIN作用上下合并行左右关联列结果行数增加列数增加关联不需要关联条件需要ON条件图示textUNION: JOIN: 表A 行 表A 列 表B 列 表A 行 → 表A 行 表B 行 ← 横向扩展 表B 行 ↑ 表A 行 表B 行 表B 行 纵向扩展八、总结需求推荐使用结果集不允许重复UNION结果集允许重复 / 已知无重复UNION ALL优先需要排序ORDER BY放在最后需要分页先UNION再套一层LIMIT

最新新闻

日新闻

周新闻

月新闻