大家好,我是宁一。
今天讲解SQL教程第15课:GROUP BY子句。
GROUP BY子句是用来给结果集分组的,通常与我们上节课讲的聚合函数结合使用。
基本语法:
SELECT <字段名> FROM <表名> GROUP BY <字段名>;
1、GROUP BY子句
如果SQL语句中有GROUP BY子句,SELECT后面的字段如果是表中现有的列,则GROUP BY子句中也必须有这个列,否则会报错。
这句话有点不好理解,我们举个实例就清楚多了。
实例:在Students表中,将记录通过学生性别Ssex分组。
SELECT SsexFROM StudentsGROUP BY Ssex;
SELECT后面跟的列是表中现有的列Ssex,GROUP BY子句中也有Ssex列。
如果像下面这样写,SELECT后面跟的Sname列,没有出现在GROUP BY子句中,就会报错。
SELECT Ssex,SnameFROM StudentsGROUP BY Ssex;
上面语句改成下面这样,就没错了。所以一定要牢记,SELECT后面的字段如果是表中现有的列,则GROUP BY子句中也必须有这个列。
SELECT Ssex,SnameFROM StudentsGROUP BY Ssex,Sname;
2、配合聚合函数使用
实际业务中,一般GROUP BY子句都会与聚合函数搭配使用。
实例:在Students表中,将记录通过学生性别Ssex分组,计算每个分组有多少人,并找出每个分组中最大的生日Sage。
实例解析:COUNT(*)与GROUP BY结合使用,会计算出每个分组中的记录数量。
SELECTSsex,COUNT(*) AS "数量",MAX(Sage) AS "最大生日"FROM StudentsGROUP BY Ssex;
3、语句书写顺序
如果语句中同时有WHERE、JOIN、GROUP BY、ORDER BY、LIMIT。书写顺序是这样的:
SELECT <字段名> FROM <表名>JOIN <表名>WHERE <筛选条件>GROUP BY <字段名>ORDER BY <字段名>LIMIT <限制行数>;
语句顺序一定要记牢,顺序不对会报错的。还有语句书写顺序与执行顺序不是一样的,后面的课程我们会详细讲到。
作业:结合Students表和Teachers表,查找每个班主任带的男女学生数量,最后根据数量倒序排序。
示例结果:
作业解析:根据示例答案,第一列是班主任姓名,Students表中只有教师编号Tid,所以我们需要JOIN连接Teachers表,获取到班主任姓名。
我们要查找每个班主任带的男女学生数量,通过GROUP BY对班主任Tname,学生性别Ssex分组,再通过COUNT(*)计算数量就可以了。
SELECTt.Tname AS "老师姓名",s.Ssex AS "学生性别",COUNT(*) AS "数量"FROM Teachers AS tJOIN Students AS sON t.Tid = s.TidGROUP BY t.Tname,s.SsexORDER BY COUNT(*) DESC;
下节课,我们来讲讲HAVING子句。
点击关注,更新课程第一时间通知哦~