在处理多表数据检索时,我们通常需要从多个表中提取和整合信息,假设我们有四个表:employees(员工表)、departments(部门表)、salaries(薪资表)和projects(项目表),每个表包含不同的信息,我们需要通过 SQL 查询来获取所需的数据。
表结构简介

employees 表
| employee_id | name | department_id |
| 1 | Alice | 10 |
| 2 | Bob | 20 |
| 3 | Charlie | 10 |
| 4 | David | 30 |
departments 表
| department_id | department_name |
| 10 | HR |
| 20 | IT |
| 30 | Marketing |
salaries 表
| employee_id | salary |
| 1 | 70000 |
| 2 | 80000 |
| 3 | 65000 |
| 4 | 90000 |
projects 表
| project_id | project_name | lead_employee_id |
| 101 | Project X | 1 |
| 102 | Project Y | 2 |
| 103 | Project Z | 3 |
| 104 | Project W | 4 |
查询需求
1、获取每个员工的姓名、所在部门名称和薪资。
2、获取每个项目的负责人姓名和项目名称。
3、获取每个部门的员工数量。
4、获取薪资最高的员工及其所在部门名称。
查询示例及解释
1. 获取每个员工的姓名、所在部门名称和薪资

SELECT e.name, d.department_name, s.salary FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN salaries s ON e.employee_id = s.employee_id;
此查询使用三个表的连接,通过employee_id 和department_id 将employees、departments 和salaries 表关联起来,从而获取每个员工的姓名、所在部门名称和薪资。
2. 获取每个项目的负责人姓名和项目名称
SELECT p.project_name, e.name AS lead_employee_name FROM projects p JOIN employees e ON p.lead_employee_id = e.employee_id;
此查询通过lead_employee_id 将projects 表与employees 表连接,获取每个项目的负责人姓名和项目名称。
3. 获取每个部门的员工数量
SELECT d.department_name, COUNT(e.employee_id) AS employee_count FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_name;
此查询使用左连接将departments 表与employees 表连接,并通过department_id 分组计算每个部门的员工数量,使用左连接是为了确保即使某个部门没有员工记录,该部门也会出现在结果中,其员工数量为0。
4. 获取薪资最高的员工及其所在部门名称
SELECT e.name, d.department_name, s.salary FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN salaries s ON e.employee_id = s.employee_id WHERE s.salary = (SELECT MAX(salary) FROM salaries);
此查询首先找到薪资最高的值,然后通过子查询与主查询结合,获取薪资最高的员工的姓名、所在部门名称和薪资。
相关问题与解答
问题1: 如何修改上述查询以获取薪资最低的员工及其所在部门名称?
解答:

要获取薪资最低的员工及其所在部门名称,只需将查询中的MAX(salary) 替换为MIN(salary),修改后的查询如下:
SELECT e.name, d.department_name, s.salary FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN salaries s ON e.employee_id = s.employee_id WHERE s.salary = (SELECT MIN(salary) FROM salaries);
问题2: 如果一个员工可以参与多个项目,如何获取每个员工参与的所有项目名称?
解答:
为了获取每个员工参与的所有项目名称,可以使用JOIN 将employees 表与projects 表连接,并按员工进行分组,修改后的查询如下:
SELECT e.name, GROUP_CONCAT(p.project_name) AS project_names FROM employees e JOIN projects p ON e.employee_id = p.lead_employee_id GROUP BY e.employee_id;
在这个查询中,GROUP_CONCAT 函数用于将同一员工参与的多个项目名称连接成一个字符串,从而方便查看每个员工参与的所有项目。
小伙伴们,上文介绍了“从4个表中检索数据”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/10891.html<
