力扣580(MySQL)-统计各专业人数(中等)

发布时间 2023-03-29 09:14:09作者: 我不想一直当菜鸟

题目:

一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据。

写一个查询语句,查询 department 表中每个专业的学生人数 (即使没有学生的专业也需列出)。

将你的查询结果按照学生人数降序排列
如果有两个或两个以上专业有相同的学生数目,将这些部门按照部门名字的字典序从小到大排列。

student 表格如下:

 department 表格如下:

示例输入:

 解题思路:

方法一:子查询

①我最先想的就是利用子查询,因为题目要求没有学生的专业也需要列出,想到用左或者右连接,Law专业就没有人数,于是我就用右连接连接两个表,以dept_name分组统计出专业人数;

1 SELECT 
2     student_name,
3     dept_name,
4     count(distinct a.student_id) as student_number
5 FROM student_580 a 
6 RIGHT JOIN department_580 b 
7 ON a.dept_id = b.dept_id 
8 GROUP BY dept_name;

 ②从第一步查询出来的临时表中,筛选出dept_name和student_number,并按人数降序排列,如果有不同专业相同人数,则按照部门名字升序排列。

 1 SELECT
 2     temp.dept_name,
 3     temp.student_number 
 4 FROM
 5     ( SELECT 
 6          student_name,
 7          dept_name,
 8          count(distinct a.student_id) as student_number
 9       FROM student_580 a 
10       RIGHT JOIN department_580 b 
11       ON a.dept_id = b.dept_id 
12       GROUP BY  dept_name
13      ) as temp
14 ORDER BY temp.student_number DESC, temp.dept_name ASC;

 或者

方法二:不用子查询,直接连接

1 SELECT b.dept_name, count(DISTINCT a.student_id) as student_number
2 FROM student_580 a 
3 RIGHT JOIN department_580 b 
4 ON a.dept_id = b.dept_id
5 GROUP BY a.dept_id
6 ORDER BY student_number DESC, a.student_name;