好的,下面是【MySQL 联合查询(下)】的详细讲解,主要介绍UNION的进阶用法、性能优化及实战示例,帮助你更深入掌握联合查询技术。


【MySQL】联合查询(下)


目录

  1. UNION 与 UNION ALL 区别
  2. 多表联合查询案例
  3. 联合查询中的排序和分页
  4. 联合查询性能优化技巧
  5. 复杂联合查询示例
  6. 注意事项总结

1. UNION 与 UNION ALL 区别

特性UNIONUNION ALL
是否去重会去重,自动过滤重复记录不去重,保留所有记录
性能较慢,因去重需要排序操作较快,无需额外去重操作
结果集大小结果集较小结果集较大

建议:无特殊需求尽量使用 UNION ALL 提升查询效率。


2. 多表联合查询案例

假设有两张表:

  • employees(员工表):id, name, department
  • managers(经理表):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执行计划分析和调优。