SQL语句练习一
大家好,从今天开始个人公众号也开启每日刷题的文章了。每日都会分享一道数据库相关的练习试题。题目可能很简单,也可能很难。
在每天的试题中,都会记录个人的解题思路。如果你有好的解题思路,也可以评论留言。如果存在不足的地方,也欢迎指正。
题目描述:
有一个courses 表 ,有: student (学生) 和 class (课程)。请用一条SQL语句,列出所有超过或等于5名学生的课。例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
期望输出的结果为:
+---------+
| class |
+---------+
| Math |
+---------+
学生在每个课中不应被重复计算
解题思路
首先我们明确最终查询的是课程,也就是class这一列。然后是关于>或者=关于这个课程的学生数量。换句话说,我们要去根据class筛选,那就只能使用group实现,将class的值按照一个分组的思想,一次去统计每一个class的总数是多少。
我们要注意不能统计重复记录。那就需要使用distinct函数了。并且题目中要求用一条SQL语句。
解答方法
解题方法一
select class from courses group by class having count(distinct student) > 4;
解题方法二
select class from
(select class, count(distinct student) as ct
from courses group by class) as a where ct >=5
第一种方法是直接在having中针对group的数据做一个条件筛选。第二种方法是先统计出所有的课程的总数和课程数,将结果放在一个字表中。由于我们只要class这一列值,因此在用一个select语句去查询字表中的字段,并且添加上我们的筛选条件。
评论