Myaql 05 合并查询(UNION)全解——多结果集合并的核心用法

张开发
2026/4/3 23:57:42 15 分钟阅读
Myaql 05 合并查询(UNION)全解——多结果集合并的核心用法
在 MySQL 中合并查询也叫联合查询用于将多个 SELECT 语句的查询结果合并为一个结果集核心关键字是UNION是处理多表 / 多条件结果合并的核心语法。一、核心知识点总览1. 核心语法SELECT 字段列表 FROM 表1 [WHERE 条件] UNION [ALL] SELECT 字段列表 FROM 表2 [WHERE 条件] [UNION [ALL] SELECT ...];2. 两个核心关键字关键字功能去重性能UNION合并多个结果集自动去重只保留唯一行较慢需去重排序UNION ALL合并多个结果集不做去重保留所有行极快直接拼接3. 合并查询的强制要求必须遵守字段数量一致所有SELECT语句的查询字段个数必须完全相同字段类型兼容对应位置的字段数据类型必须一致 / 兼容如 INT 和 BIGINT 兼容最终排序最终结果集的排序以最后一个SELECT语句后的ORDER BY为准字段名规则最终结果集的字段名以第一个SELECT语句的字段名为准二、准备测试数据创建两张结构相似的表用于后续所有示例1. 学生表student_a一班学生CREATE TABLE student_a ( stu_id INT PRIMARY KEY AUTO_INCREMENT, stu_name VARCHAR(20) NOT NULL, age INT NOT NULL ); INSERT INTO student_a (stu_name, age) VALUES (张三, 18), (李四, 19), (王五, 18);2. 学生表student_b二班学生含重复数据CREATE TABLE student_b ( stu_id INT PRIMARY KEY AUTO_INCREMENT, stu_name VARCHAR(20) NOT NULL, age INT NOT NULL ); INSERT INTO student_b (stu_name, age) VALUES (李四, 19), -- 与student_a重复 (赵六, 20), (孙七, 19);三、核心用法详解 代码示例1. 基础合并UNION自动去重核心逻辑合并两个结果集自动去除重复行只保留唯一数据。适用场景需要合并结果且去重如统计全校不重复的学生名单。代码示例-- 合并两个班的学生自动去重李四只出现一次 SELECT stu_id, stu_name, age FROM student_a UNION SELECT stu_id, stu_name, age FROM student_b;运行结果stu_idstu_nameage1张三182李四193王五182赵六203孙七19说明两张表中都有「李四」UNION自动去重最终只保留一行。2. 高效合并UNION ALL保留所有行核心逻辑直接拼接两个结果集不做任何去重操作性能远高于UNION。适用场景不需要去重仅需合并结果如统计两个班的所有学生名单含重复。代码示例-- 合并两个班的学生保留所有行李四出现两次 SELECT stu_id, stu_name, age FROM student_a UNION ALL SELECT stu_id, stu_name, age FROM student_b;运行结果stu_idstu_nameage1张三182李四193王五181李四192赵六203孙七19说明两张表的「李四」都被保留直接拼接无任何去重操作。3. 带条件的合并查询核心逻辑在合并查询中给每个SELECT语句添加WHERE条件实现「分条件查询 合并结果」。代码示例-- 合并一班年龄18的学生 二班年龄19的学生 SELECT stu_name, age FROM student_a WHERE age 18 UNION ALL SELECT stu_name, age FROM student_b WHERE age 19;运行结果stu_nameage张三18王五18李四19孙七194. 合并后排序核心逻辑最终结果集的排序必须写在最后一个SELECT语句的末尾中间语句的ORDER BY无效。代码示例-- 合并两个班的学生最终按年龄升序排序 SELECT stu_name, age FROM student_a UNION ALL SELECT stu_name, age FROM student_b ORDER BY age ASC, stu_name ASC; -- 排序写在最后运行结果stu_nameage张三18王五18李四19李四19孙七19赵六205. 字段名与类型兼容说明代码示例字段名以第一个为准-- 第一个SELECT字段名为name/age最终结果集以此为准 SELECT stu_name AS name, age FROM student_a UNION ALL SELECT stu_name, age FROM student_b;运行结果字段名是name/agenameage张三18......类型兼容示例-- INT和VARCHAR不兼容会报错 SELECT stu_id, stu_name FROM student_a UNION SELECT stu_name, age FROM student_b; -- 字段类型不匹配报错四、核心对比与避坑指南1.UNIONvsUNION ALL核心区别对比项UNIONUNION ALL去重自动去重不做去重性能慢需排序去重快直接拼接适用场景需要去重的结果合并不需要去重追求性能结果行数≤ 两个结果集行数之和 两个结果集行数之和2. 常见避坑字段数量不一致所有SELECT字段个数必须相同否则直接报错字段类型不兼容对应位置字段类型必须一致否则报错中间排序无效只有最后一个ORDER BY生效中间语句的排序会被忽略UNION性能浪费如果不需要去重必须用UNION ALL否则会做无用的去重排序字段名错误最终字段名以第一个SELECT为准后续字段名不生效五、综合实战多表合并 统计-- 需求统计两个班的学生人数合并结果 SELECT 一班 AS class, COUNT(*) AS count FROM student_a UNION ALL SELECT 二班 AS class, COUNT(*) AS count FROM student_b;运行结果classcount一班3二班3六、核心总结核心关键字UNION去重、UNION ALL不去重推荐优先用强制规则字段数一致、类型兼容、排序写在最后性能优先级UNION ALL远高于UNION无去重需求必用UNION ALL适用场景多表结果合并、分条件查询合并、统计报表多维度数据汇总

更多文章