LeetCode-580. 统计各专业学生人数(中等) left join

本文介绍如何使用SQL查询语句,从两个数据表中获取每个专业的学生人数,包括那些没有学生的专业,并按人数和专业名排序。

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

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

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

student 表格如下:

| Column Name  | Type      |
|--------------|-----------|
| student_id   | Integer   |
| student_name | String    |
| gender       | Character |
| dept_id      | Integer   |
其中, student_id 是学生的学号, student_name 是学生的姓名, gender 是学生的性别, dept_id 是学生所属专业的专业编号。

department 表格如下:

| Column Name | Type    |
|-------------|---------|
| dept_id     | Integer |
| dept_name   | String  |
dept_id 是专业编号, dept_name 是专业名字。

这里是一个示例输入:
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              |

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-student-number-in-departments

审题:查询department 表中每个专业的学生人数,学生表中有专业id,和department 表中的专业id相同。然后按照人数多少排序。

思考:联合两个表然后求和,最后排序。

解题:

select A.dept_name,count() as student_number 
from department as A left join student as S on (A.dept_id = s.dept_id)
group by A.dept_id,D.dept_name
order by `student_number` desc,D.dept_name




select D.dept_name,count(S.student_id) as `student_number`
from department as D left join student as S on (D.dept_id = S.dept_id)
group by D.dept_id,D.dept_name
order by `student_number` desc,D.dept_name

知识点:

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

认识 DBMS...................................................................................1 实验 2 交互式 SQL(1)........................................................................ 6 实验 3 交互式 SQL(2)........................................................................ 8 实验 4 交互式 SQL(3)........................................................................ 9 ① 查询计算机系全体学生信息 ② 查询姓“李”的学生学号姓名。 ③ 查询课程表中先行课为空的课程名。 ④ 查询考试成绩有不及格的学生学号。 ⑤ 求选修了C1 课程或C2 课程的学生学号及成绩。 ⑥ 查询全体计算机系学生姓名及其年龄。 ⑦ 查询计算机系在1986-1987 年之间出生的学生姓名。 ⑧ 查询姓“李”的前两个学生学号姓名。 ⑨ 查询选修了两门以上课程的学生学号与课程数。 ⑩ 查询选修课程数大于等于2 的学生学号、平均成绩和选课门数,并按 平均成绩降序排列。(1) 查询选修了【数据库原理】的计算机系的学生学号姓名(2) 查询每一门课的间接先行课(即先行课的先行课)(3) 查询学生学号姓名、选修课程的名称和成绩。 (4) 查询选修了课程的学生姓名(5) 查询所有学生信息和所选修的课程。 (6) 查询已被选修的课程的情况和所有课程的名字。 (7) 列出学生所有可能的选修情况。 (8) 查找计算机系的学生选修课程数大于2 的学生姓名、平均成绩和选课 门数,并按平均成绩降序排列。(1) 统计选修了【数据库原理】课程的学生人数(2) 查询没有选修【数据库原理】课程的学生信息(3) 查询其他系中比计算机系学生年龄都小的学生(4) 查询被0602001 学生或0602002 学生所选修的课程的课程号(用UNION 组合查询与IN 条件查询两种方法实现)(5) 查询0602001 学生和0602002 学生同时选修的课程的课程号(用 INTERSECT 组合查询与EXISTS 嵌套子查询两种方法实现)(6) 查询被0602001 学生选修,但没有被0602002 学生所选修的课程的课程 号(用EXCEPT 组合查询与NOT EXISTS 嵌套子查询两种方法实现)(1) 新建查询窗口,选择StudentCourseYYXXXX 为当前数据库。 (2) 在已建立StudentCourseYYXXXX 数据库和StudentsYYXXXX、 CoursesYYXXXX、SCYYXXXX 3 个表的基础上,向StudentCourseYYXXXX数据库中 的表更新数据。 ① 向表StudentsYYXXXX 中插入(0601001,赵林, 男,1985-09-08,计算机) 的记录。② 向SCYYXXXX 表中添加一个学生的选课记录,学号为0601001,所选的课 程号为C2。 SC表中有Sno、Cno、Grade 这3 个列。这里只知道学号和课程号, 不知道成绩值。 ③ 向表StudentsYYXXXX 中插入(0601002,张修雨,default)记录,该记录 的数据中default 表示默认值‘男’,其他数据表示空值。 ④ 用CREATE 语句建立表StudentBAK1YYXXXX,包含(与Students 的Sno、 Sname、Sdept 相同)3 个字段, 然后用INSERT SELECT 语句实现向 StudentBAK1YYXXXX 添加StudentsYYXXXX 表中的计算机系学生学号姓名、 所在系的信息。 ⑤ 用 SELECT...INTO 语句实现把StudentsYYXXXX 表中1986 年后(包含 1986 年)出生的学生学号姓名存储到一个新表StudentBAK2YYXXXX。 ⑥ 将姓名为【赵林】的同学的所在系改为【机电系】,爱好改为【足球】。 ⑦ 将选修了课程名为【数据库原理】的学生成绩加5 分。 ⑧ 将StudentCourseYYXXXX 数据库的StudentBAK1YYXXXX 表中所有姓赵的 同学删除。 ⑨ 删除计算机系选修成绩不及格的学生选修记录。课程成绩优秀。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值