with t1 as (select
    d.dept_no,
    t.title,
    count(t.title) as count
from dept_emp d
left join
    titles t
on t.emp_no = d.emp_no
group by
    d.dept_no,
    t.title)
select
    t1.dept_no,
    d1.dept_name,
    t1.title,
    t1.count
from t1
right join
departments d1
on
t1.dept_no = d1.dept_no
order by
    t1.dept_no asc,
    t1.title asc


  1. WITH 子句(公共表达式 t1WITH t1 AS ( 开始定义一个公共表达式(CTE),名称为 t1。在 t1 的内部查询中:SELECT d.dept_no, t.title, COUNT(t.title) AS count:选择了 dept_emp 表(别名为 d)中的部门编号 dept_no、titles 表(别名为 t)中的职称 title,并使用 COUNT 函数计算每个 title 的数量,将结果别名为 count。FROM dept_emp d LEFT JOIN titles t ON t.emp_no = d.emp_no:从 dept_emp 表和 titles 表进行左连接。左连接确保即使 titles 表中没有与 dept_emp 表中 emp_no 匹配的记录,dept_emp 表中的记录仍会被包含在结果中,连接条件是两个表的 emp_no 相等12。GROUP BY d.dept_no, t.title:按照部门编号 dept_no 和职称 title 对结果进行分组。这样,对于每个部门和职称的组合,会计算出相应的 count 值。
  2. 主查询部分SELECT t1.dept_no, d1.dept_name, t1.title, t1.count:从 t1 和 departments 表(别名为 d1)中选择需要的列,包括 t1 中的部门编号 dept_no、departments 表中的部门名称 dept_name、t1 中的职称 title 和数量 count。FROM t1 RIGHT JOIN departments d1 ON t1.dept_no = d1.dept_no:进行右连接操作。右连接确保即使 t1 中没有与 departments 表中 dept_no 匹配的记录,departments 表中的记录仍会被包含在结果中,连接条件是两个表的 dept_no 相等。这一步将部门编号与部门名称关联起来3。ORDER BY t1.dept_no ASC, t1.title ASC:按照 t1 中的部门编号升序(ASC)和职称升序(ASC)对最终结果进行排序。

总体而言,这段代码的目的是统计每个部门中不同职称的员工数量,并将部门编号、部门名称、职称和数量一起展示出来,按照部门编号和职称排序。首先通过 t1 的子查询计算出每个部门和职称组合的数量,然后在主查询中连接部门名称并进行排序输出。