题解 | #统计各个部门的工资记录数#
统计各个部门的工资记录数
https://www.nowcoder.com/practice/6a62b6c0a7324350a6d9959fa7c21db3
select d.dept_no, d.dept_name,count(s.salary) as sum from departments as d inner join dept_emp as de on d.dept_no =de.dept_no inner join salaries as s on s.emp_no = de.emp_no group by d.dept_no order by d.dept_no asc;
这个SQL查询的目标是从三个表中提取信息:departments
、dept_emp
和 salaries
,并计算每个部门中员工的薪水记录总数。以下是查询的逐步解释:
- SELECT d.dept_no, d.dept_name, COUNT(s.salary) as sum:这一行定义了查询将返回的列:部门编号(dept_no)、部门名称(dept_name)以及一个名为sum的计算列,该列表示每个部门的薪水记录总数。
- from departments as d:这是查询的主表,departments表,被赋予了别名d。
- inner join dept_emp as de on d.dept_no =de.dept_no:这里使用INNER JOIN将departments表与dept_emp表连接起来。连接条件是两个表中的dept_no字段相等。dept_emp表被赋予了别名de。INNER JOIN意味着只有当departments和dept_emp表中存在匹配项时,才会返回结果行。不匹配的行将被排除。
- inner join salaries as s on s.emp_no = de.emp_no:这个INNER JOIN将上一步生成的结果集与salaries表连接起来。连接条件是salaries表中的emp_no字段与dept_emp表中的emp_no字段相等。salaries表被赋予了别名s。同样,INNER JOIN意味着只有当dept_emp和salaries表中存在匹配项时,才会返回结果行。
- group by d.dept_no:查询结果将根据departments表的dept_no字段进行分组。这意味着对于每个不同的部门编号,将计算一个薪水记录总数。
- order by d.dept_no asc:最后,查询结果将按照dept_no升序排序。
关于INNER JOIN
的执行顺序,虽然在SQL语法中没有明确指定,但实际上数据库优化器会决定最佳的执行顺序。然而,在大多数情况下,你可以认为JOIN
操作是按照它们在查询中出现的顺序依次执行的。也就是说,首先执行的是departments
与dept_emp
之间的INNER JOIN
,然后将结果与salaries
表进行第二次INNER JOIN
。
但是,数据库优化器可能会重排JOIN
顺序以优化性能,特别是当涉及到大型表时。例如,如果dept_emp
和salaries
表之间的连接比departments
和dept_emp
之间的连接更有效率,优化器可能会先执行后者。为了确保查询的执行方式符合预期,你可以查看查询的执行计划,这通常可以通过在查询前加上EXPLAIN
关键字来完成。