题:请列出所有超过或等于5名学生的课。
有一个courses
表 ,有: student (学生) 和 class (课程)。
例如,表:
+---------+------------+ | student | class | +---------+------------+ | A | Math | | B | English | | C | Math | | D | Biology | | E | Math | | F | Computer | | G | Math | | H | Math | | I | Math | +---------+------------+
应该输出:
+---------+ | class | +---------+ | Math | +---------+
Note:
学生在每个课中不应被重复计算。
分析:
1、使用count()合计
2、需要按课程分组Grout By
3、条件过滤Having
4、重复选同一门课程的学生不累计
COUNT用法:
COUNT(expr)
返回SELECT语句检索到的行中非NULL值的数目。
若找不到匹配的行,则COUNT() 返回 0 。
GROUP BY用法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
,
结合合计函数:COUNTSUM
,AVG
,MAX
,MIN
Having用法:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value
1、一个HAVING子句。
2、HAVING子句基本上是最后使用,只位于被发送给客户端的条目之前,没有进行优化。(必须位于GROUP BY子句之后,ORDER BY子句之前,LIMIT用于HAVING之后。)
3、HAVING不能用于应被用于WHERE子句的条目
4、HAVING子句可以引用总计函数,而WHERE子句不能引用
解答:
SELECT class FROM courses GROUP BY class HAVING count(distinct student)>=5;