LeetCode#超过5名学生的课

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

一、题目

表: Courses

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| student     | varchar |
| class       | varchar |
+-------------+---------+

(student, class)是该表的主键列。 该表的每一行表示学生的名字和他们注册的班级。  

编写一个SQL查询来报告 至少有5个学生 的所有班级。 以 任意顺序 返回结果表。 查询结果格式如下所示。

 

示例 1:

输入:

Courses table:
+---------+----------+
| student | class    |
+---------+----------+
| A       | Math     |
| B       | English  |
| C       | Math     |
| D       | Biology  |
| E       | Math     |
| F       | Computer |
| G       | Math     |
| H       | Math     |
| I       | Math     |
+---------+----------+
输出: 
+---------+ 
| class   | 
+---------+ 
| Math    | 
+---------+

解释: 
-数学课有6个学生,所以我们包括它。
-英语课有1名学生,所以我们不包括它。
-生物课有1名学生,所以我们不包括它。
-计算机课有1个学生,所以我们不包括它。
  • 来源:力扣(LeetCode)
  • 链接:leetcode.cn/problems/cl…
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据表,根据提议创建数据表并填充数据

CREATE TABLE IF NOT EXISTS Courses (
	student VARCHAR(255),
	class VARCHAR(255)
)
INSERT INTO Courses VALUES
('A', 'Math'),
('B', 'English'),
('C', 'Math'),
('D', 'Biology'),
('E', 'Math'),
('F', 'Computer'),
('G', 'Math'),
('H', 'Math'),
('I', 'Math')

解题

  • 根据提议,要查找至少有5个学生的班级,那么首先需要计算下每个班级有多少个学生
  • 这里需要使用group by 对学生班级进行分组
  • 分组之后计算每个班级的人数并且找大于5人的
  • 这里有两种方式,第一种是子查询,第二种是使用having
  • 子查询是先将班级分组计算出班级的人数之后把这个数据集作为表用where进行查询大于5人的班级
  • having是将班级分组后接having再进行班级人数的计算
  • 这里班级的计算不是使用count(*), 而是count(distinct student) 这种方式可以对数据进行去重
// 子查询
SELECT class, COUNT(DISTINCT student) AS num FROM Courses GROUP BY class
SELECT class FROM (SELECT class, COUNT(DISTINCT student) AS num FROM Courses GROUP BY class) temp_table WHERE num >= 5;

// having
SELECT class FROM Courses GROUP BY class HAVING COUNT(DISTINCT student) >= 5

三、执行结果

子查询

image.png

having

image.png

四、总结

  • 子查询是指一个查询是两一个查询的条件时,称为子查询
  • having通常是与group by 一起使用,一般会区分where与having的区别: where是在分组前进行处理,不满足条件就不再执行分组,having是分组后进行处理。而且where后不能跟聚合函数,但是having是可以进行聚合函数判断的