MST

星途 面试题库

面试题:MySQL JOIN连接类型优化在复杂查询中的应用

有四张表:员工表(employees)包含员工ID、部门ID等信息;部门表(departments)包含部门ID、部门名称;项目表(projects)包含项目ID、项目名称;员工项目关联表(employee_projects)包含员工ID、项目ID。现在要查询每个部门中参与了至少两个不同项目的员工姓名及所在部门名称。请详细说明你会如何设计查询语句,如何选择JOIN连接类型以达到较好的性能,并且分析不同连接类型在该场景下的优劣。
12.1万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 查询语句设计

    SELECT e.employee_name, d.department_name
    FROM employees e
    JOIN departments d ON e.department_id = d.department_id
    JOIN employee_projects ep ON e.employee_id = ep.employee_id
    JOIN projects p ON ep.project_id = p.project_id
    GROUP BY e.employee_id, e.employee_name, d.department_name
    HAVING COUNT(DISTINCT p.project_id) >= 2;
    
    • 首先通过JOIN操作将employees表与departments表连接,以获取员工所属部门的信息。连接条件是e.department_id = d.department_id
    • 接着将employees表与employee_projects表连接,连接条件是e.employee_id = ep.employee_id,这样可以获取员工参与项目的关联信息。
    • 然后将employee_projects表与projects表连接,连接条件是ep.project_id = p.project_id,从而获取项目的详细信息。
    • 使用GROUP BY子句按照员工ID、员工姓名和部门名称进行分组,这样可以统计每个员工参与的不同项目数量。
    • 使用HAVING COUNT(DISTINCT p.project_id) >= 2筛选出参与至少两个不同项目的员工。
  2. JOIN连接类型选择及性能分析

    • 内连接(INNER JOIN):在本场景下使用内连接是合适的。因为我们只关心有部门归属并且参与了项目的员工信息。内连接会返回满足连接条件的所有行,丢弃不满足连接条件的行。在性能方面,内连接通常是高效的,因为数据库可以通过索引快速定位满足连接条件的行。如果表中数据量较大,且索引设计合理,内连接能够在较短时间内完成连接操作。
    • 外连接(LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)
      • LEFT JOIN:如果使用LEFT JOIN,假设以employees表为左表连接其他表,会返回employees表中的所有行,即使某些员工没有对应的部门信息(departments表中无匹配行),或者没有参与项目(employee_projects表和projects表中无匹配行)。这可能会导致结果集中包含一些我们不关心的数据,并且会增加查询的计算量,因为需要处理这些额外的行。在本场景下不适合使用LEFT JOIN,除非有特殊需求需要保留所有员工,无论其是否有部门或参与项目。
      • RIGHT JOIN:与LEFT JOIN类似,RIGHT JOIN以右表为基准返回所有行。在本场景下同样不适用,因为我们关注的是有实际关联关系(有部门且参与项目)的数据。
      • FULL OUTER JOINFULL OUTER JOIN会返回左右表中所有的行,匹配的行合并,不匹配的行用NULL填充。这种连接类型会产生大量不必要的数据,并且性能开销极大,在本场景下完全不适用。

综上所述,在本场景下,使用内连接能够在保证结果准确性的同时,达到较好的性能。