题解 | #统计各个部门的工资记录数#

统计各个部门的工资记录数

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查询的目标是从三个表中提取信息:departmentsdept_emp 和 salaries,并计算每个部门中员工的薪水记录总数。以下是查询的逐步解释:

  1. SELECT d.dept_no, d.dept_name, COUNT(s.salary) as sum:这一行定义了查询将返回的列:部门编号(dept_no)、部门名称(dept_name)以及一个名为sum的计算列,该列表示每个部门的薪水记录总数。
  2. from departments as d:这是查询的主表,departments表,被赋予了别名d。
  3. 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表中存在匹配项时,才会返回结果行。不匹配的行将被排除。
  4. 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表中存在匹配项时,才会返回结果行。
  5. group by d.dept_no:查询结果将根据departments表的dept_no字段进行分组。这意味着对于每个不同的部门编号,将计算一个薪水记录总数。
  6. order by d.dept_no asc:最后,查询结果将按照dept_no升序排序。

关于INNER JOIN的执行顺序,虽然在SQL语法中没有明确指定,但实际上数据库优化器会决定最佳的执行顺序。然而,在大多数情况下,你可以认为JOIN操作是按照它们在查询中出现的顺序依次执行的。也就是说,首先执行的是departmentsdept_emp之间的INNER JOIN,然后将结果与salaries表进行第二次INNER JOIN

但是,数据库优化器可能会重排JOIN顺序以优化性能,特别是当涉及到大型表时。例如,如果dept_empsalaries表之间的连接比departmentsdept_emp之间的连接更有效率,优化器可能会先执行后者。为了确保查询的执行方式符合预期,你可以查看查询的执行计划,这通常可以通过在查询前加上EXPLAIN关键字来完成。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务