好的,下面是【MySQL 联合查询(下)】的详细讲解,主要介绍UNION的进阶用法、性能优化及实战示例,帮助你更深入掌握联合查询技术。
【MySQL】联合查询(下)
目录
- UNION 与 UNION ALL 区别
- 多表联合查询案例
- 联合查询中的排序和分页
- 联合查询性能优化技巧
- 复杂联合查询示例
- 注意事项总结
1. UNION 与 UNION ALL 区别
特性 | UNION | UNION ALL |
---|---|---|
是否去重 | 会去重,自动过滤重复记录 | 不去重,保留所有记录 |
性能 | 较慢,因去重需要排序操作 | 较快,无需额外去重操作 |
结果集大小 | 结果集较小 | 结果集较大 |
建议:无特殊需求尽量使用 UNION ALL 提升查询效率。
2. 多表联合查询案例
假设有两张表:
employees
(员工表):id, name, departmentmanagers
(经理表):id, name, department
查询所有员工和经理的姓名及部门:
SELECT name, department FROM employees
UNION
SELECT name, department FROM managers;
使用UNION ALL避免去重,提高性能:
SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM managers;
3. 联合查询中的排序和分页
- 排序(ORDER BY) 应该写在最后一个SELECT语句之后,作用于整个结果集。
示例:
SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM managers
ORDER BY name ASC
LIMIT 10 OFFSET 20;
4. 联合查询性能优化技巧
- 避免不必要的去重:除非必须,尽量使用 UNION ALL 替代 UNION。
- 减少列数和数据量:只查询必要字段,过滤无用记录。
- 适当索引:确保参与查询的字段有索引,尤其是连接条件字段。
- 拆分复杂查询:对于复杂联合查询,考虑拆分成多步执行,分批处理。
- 使用视图或临时表:适合频繁复用的联合查询场景。
5. 复杂联合查询示例
查询不同表中符合条件的数据,带有聚合和排序:
SELECT id, name, 'employee' AS role FROM employees WHERE status = 'active'
UNION ALL
SELECT id, name, 'manager' AS role FROM managers WHERE status = 'active'
ORDER BY name;
6. 注意事项总结
- UNION要求各SELECT语句列数和数据类型兼容。
- ORDER BY只能出现一次,且写在最后。
- LIMIT限制整个联合结果集,不是单个子查询。
- UNION ALL适合大多数性能敏感场景。
- 复杂联合查询建议做好SQL执行计划分析和调优。
发表回复