1、创建分组
分组就是把具有相同的数据值的行放在同一组中。可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。
SELECT COUNT(id) '男生与女生的人数'
FROM demo
GROUP BY gender
分析:这条sql语句的功能是统计男生和女生的人数。
GROUP BY子句一些重要的规定:
- GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套(使用逗号分开),为数据分组提供更细致的控制。
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
- 如果列中有多行NULL值,它们将分为一组。
- 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
2、过滤分组
除了能用GROUP BY分组数据外,MySQL还允许过滤分组,其功能与WHERE子句相似。它们唯一的差别是WHERE过滤行,而HAVING过滤分组。同时HAVING支持所有WHERE操作符,换句话说,也就是WHERE能用的地方,HAVING都可以使用。
SELECT count(id) '班级的人数'
FROM demo
GROUP BY class
HAVING COUNT(*) > 50
分析:这条sql的功能是对class列进行分组,同时分组大小不对于50的分组,将被过滤。
HAVING和WHERE的差别:
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
3、SELECT子句顺序
最后,我们回顾一下SELECT语句中子句的顺序。下表列出了各个子句,而且编写sql时应该按照表中的顺序进行编写。
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |