【LeetCode-SQL】580. 统计各专业学生人数
目录
- 一、题目
- 二、解决
- 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. 统计各专业学生人数相关推荐
- LeetCode MySQL 580. 统计各专业学生人数
文章目录 1. 题目 2. 解题 1. 题目 一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据. 写一个查询语句,查询 depa ...
- 580. 统计各专业学生人数(SQL)
题目:https://leetcode-cn.com/problems/count-student-number-in-departments/ 一所大学有 2 个数据表,分别是 student 和 ...
- 580. 统计各专业学生人数
select dept_name , count(student_id) as student_number from department as A left outer join student ...
- LeetCode:Database 21.统计各专业学生人数
要求:写一个查询语句,查询 department 表中每个专业的学生人数 (即使没有学生的专业也需列出),将你的查询结果按照学生人数降序排列,如果有两个或两个以上专业有相同的学生数目,将这些部门按照部 ...
- leetcode580. 统计各专业学生人数(SQL)
一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据. 写一个查询语句,查询 department 表中每个专业的学生人数 (即使没 ...
- 【每日SQL打卡】DAY 6丨统计各专业学生人数【难度中等】
活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升. 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远.
- LeetCode(数据库)- 统计各专业学生人数
题目链接:点击打开链接 题目大意:略. 解题思路:唯一注意的地方:要用 department.dept_id 而不能是 student.dept_id,因为后者可能改 dept_id 为 NULL. ...
- mysql查询各专业人数_SQL统计各专业学生人数
统计"学生"表中学生的总人数的sql语句是: select count(*) from student; 其中select代表查询,count(*)是统计行数量,student是学 ...
- HDU1235 统计同成绩学生人数【水题+序列处理】
统计同成绩学生人数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
最新文章
- 五年12篇顶会论文综述!一文读懂深度学习文本分类方法
- Cissp-【第3章 安全工程】-2021-2-22(269页-289页)
- 光纤熔接盒盘线方法_【图文教程】光纤熔接技术的操作与技巧分享!
- 设计模式之策略模式在地铁票价系统中的应用
- 想让数据分析更简便,怎能少了它!
- C语言中static关键字的作用详解,全网最透彻
- 选择排序 介绍与java实现
- nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
- vant上传图片 转二进制_土旦:移动端 Vue+Vant 的Uploader 实现 :上传、压缩、旋转图片...
- ThinkPHP5旅游管理系统
- Winform开发全套31个UI组件开源共享
- MCS-51单片机的外部引脚及片外总线
- SciPy 科学计算基础
- 计算机键盘fn,键盘功能键Fn
- 安卓-LBS地图显示
- 双路服务器56核系统推荐,双路最高支持56核112线程!华硕妖板羡煞旁人
- Mac网络正常但是所有浏览器无法上网问题解决
- ARMv8-A笔记一 ARM-A系列处理器介绍
- 《江南style》影射的经济style
- JDK8下载及安装教程之windows版、linux版