目录

  • 一、题目
  • 二、解决
    • 1、left join
  • 三、参考

一、题目

表: Student

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| student_id   | int     |
| student_name | varchar |
| gender       | varchar |
| dept_id      | int     |
+--------------+---------+
Student_id是该表的主键。
dept_id是Department表中dept_id的外键。
该表的每一行都表示学生的姓名、性别和所属系的id。

表: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| dept_id     | int     |
| dept_name   | varchar |
+-------------+---------+
Dept_id是该表的主键。
该表的每一行包含一个部门的id和名称。

编写一个SQL查询,为 Department 表中的所有部门(甚至是没有当前学生的部门)报告各自的部门名称和每个部门的学生人数。

按 student_number 降序 返回结果表。如果是平局,则按 dept_name 的 字母顺序 排序。

查询结果格式如下所示。

示例 1:

输入:
Student 表:
+------------+--------------+--------+---------+
| student_id | student_name | gender | dept_id |
+------------+--------------+--------+---------+
| 1          | Jack         | M      | 1       |
| 2          | Jane         | F      | 1       |
| 3          | Mark         | M      | 2       |
+------------+--------------+--------+---------+
Department 表:
+---------+-------------+
| dept_id | dept_name   |
+---------+-------------+
| 1       | Engineering |
| 2       | Science     |
| 3       | Law         |
+---------+-------------+
输出:
+-------------+----------------+
| dept_name   | student_number |
+-------------+----------------+
| Engineering | 2              |
| Science     | 1              |
| Law         | 0              |
+-------------+----------------+

二、解决

1、left join

思路:

1、如果 student 左连 department 就会忽略掉没有人的专业,造成最后专业缺失,所以要用 department 左连 student。

2、count(*) 计算的是总行数,不会忽略 null,但是这里有些专业没有人,计算出来应该是 0,所以应该使用 count(student_id)

代码:

SELECTdept_name,count( student_id ) AS student_number
FROMdepartmentLEFT JOIN student ON department.dept_id = student.dept_id
GROUP BYdept_name
ORDER BYstudent_number DESC, dept_name ASC
;
# result1:
+-------------+----------------+
| dept_name   | student_number |
+-------------+----------------+
| Engineering | 2              |
| Science     | 1              |
| Law         | 0              |
+-------------+----------------+

错误:

# wrong anwser:
select b.dept_name, a.student_number
from
(select dept_id, count(distinct(student_id)) as student_numberfrom studentgroup by dept_id
) a
right join department b on a.dept_id = b.dept_id;
# result2: 错误答案,有一个为null
+-------------+----------------+
| dept_name   | student_number |
+-------------+----------------+
| Engineering | 2              |
| Science     | 1              |
| Law         | null           |
+-------------+----------------+

补充 :count(*) 和 count(1)和count(列名)区别

执行效果上:

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略为NULL的值。
  • count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略为NULL的值。
  • count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是指空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

执行效率上:

  • 列名为主键,count(列名)会比count(1)快
  • 列名不为主键,count(1)会比count(列名)快
  • 如果表多个列并且没有主键,则 count(1 的执行效率优于 count(*)
  • 如果有主键,则 select count(主键)的执行效率是最优的
  • 如果表只有一个字段,则 select count(*)最优。

三、参考

1、需要注意的两个考察点
2、统计各专业学生人数
3、执行count(1)、count(*) 与 count(列名) 到底有什么区别?

【LeetCode-SQL】580. 统计各专业学生人数相关推荐

  1. LeetCode MySQL 580. 统计各专业学生人数

    文章目录 1. 题目 2. 解题 1. 题目 一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据. 写一个查询语句,查询 depa ...

  2. 580. 统计各专业学生人数(SQL)

    题目:https://leetcode-cn.com/problems/count-student-number-in-departments/ 一所大学有 2 个数据表,分别是 student 和  ...

  3. 580. 统计各专业学生人数

    select dept_name , count(student_id) as student_number from department as A left outer join student ...

  4. LeetCode:Database 21.统计各专业学生人数

    要求:写一个查询语句,查询 department 表中每个专业的学生人数 (即使没有学生的专业也需列出),将你的查询结果按照学生人数降序排列,如果有两个或两个以上专业有相同的学生数目,将这些部门按照部 ...

  5. leetcode580. 统计各专业学生人数(SQL)

    一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据. 写一个查询语句,查询 department 表中每个专业的学生人数 (即使没 ...

  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】

      活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升. 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远.

  7. LeetCode(数据库)- 统计各专业学生人数

    题目链接:点击打开链接 题目大意:略. 解题思路:唯一注意的地方:要用 department.dept_id 而不能是 student.dept_id,因为后者可能改 dept_id 为 NULL. ...

  8. mysql查询各专业人数_SQL统计各专业学生人数

    统计"学生"表中学生的总人数的sql语句是: select count(*) from student; 其中select代表查询,count(*)是统计行数量,student是学 ...

  9. HDU1235 统计同成绩学生人数【水题+序列处理】

    统计同成绩学生人数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

最新文章

  1. 五年12篇顶会论文综述!一文读懂深度学习文本分类方法
  2. Cissp-【第3章 安全工程】-2021-2-22(269页-289页)
  3. 光纤熔接盒盘线方法_【图文教程】光纤熔接技术的操作与技巧分享!
  4. 设计模式之策略模式在地铁票价系统中的应用
  5. 想让数据分析更简便,怎能少了它!
  6. C语言中static关键字的作用详解,全网最透彻
  7. 选择排序 介绍与java实现
  8. nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
  9. vant上传图片 转二进制_土旦:移动端 Vue+Vant 的Uploader 实现 :上传、压缩、旋转图片...
  10. ThinkPHP5旅游管理系统
  11. Winform开发全套31个UI组件开源共享
  12. MCS-51单片机的外部引脚及片外总线
  13. SciPy 科学计算基础
  14. 计算机键盘fn,键盘功能键Fn
  15. 安卓-LBS地图显示
  16. 双路服务器56核系统推荐,双路最高支持56核112线程!华硕妖板羡煞旁人
  17. Mac网络正常但是所有浏览器无法上网问题解决
  18. ARMv8-A笔记一 ARM-A系列处理器介绍
  19. 《江南style》影射的经济style
  20. JDK8下载及安装教程之windows版、linux版

热门文章

  1. AFMG全球战略发布会,一场与豪华纯电智能跑车的零距离之约
  2. 【计算方法】线性方程组的数值解法
  3. Java里面for循环的几种用法
  4. 手机实现实时人脸识别(二)
  5. 最近成了三等奖专业户
  6. AI时代的追星逐浪,中国科技的奋发自强
  7. activiti查询我的待办任务以及审批
  8. 相似度算法余弦相似度
  9. 【教学类-17-01】20221122《世界杯七巧板A4整页-随机参考图+七巧板+画框》(大班)
  10. 微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比