创建分组
分组是在SELECT语句的GROUP BY子句中建立的
select column_name, COUNT(*) as num_row from table_name GROUP BY column_name;
使用了GROUP BY指示了分组数据,然后对每个组而不是整个结果集进行聚集。
GROUP BY规定:
- GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套
- 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。即:在建立分组时,指定的所有列都一起计算(不能从个别列取回数据)
- GROUP BY子句中列出的每个列都必须是检索列或者有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,必须再GROUP BY子句中指定相同的表达式,不能使用别名
- 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
- 如果分组列中有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
过滤分组
规定包括哪些分组,排除哪些分组
HAVING支持所有的WHERE操作符
WHERE和HAVING的区别:WHERE过滤行,HAVING过滤分组
另一种理解:WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE排除的行不再分组中。
过滤两个以上column_name的分组:
select column_name,count() as nums from table_name GROUP BY column_name HAVING COUNT()>=2;
同时WHERE和HAVING:
select column_name,COUNT() as nums from table_name WHERE column_name1>=999 GROUP BY column_name HAVING COUNT()>=2;
分组和排序
ORGER BY与GROUP BY区别
| ORGER BY | GROUP BY |
|---|---|
| 排序产生的输出 | 分组行,但输出可能不是分组的顺序 |
| 任意列都可以使用(甚至非选择的列都可以使用) | 只可以使用选择列或表达式列,而且必须使用每个选择列表达式 |
| 不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须需要 |
HAVING聚集函数举例:
select column_name, SUM(column_name2column_name3) AS total from table_name GROUP BY column_name HAVING SUM(column_name2column_name3)>=999;
加排序:
select column_name, SUM(column_name2column_name3) AS total from table_name GROUP BY column_name HAVING SUM(column_name2column_name3)>=999 ORDER BY total;
SELECT子句顺序
| 子句 | 说明 | 是否必须使用 |
|---|---|---|
| SELECT | 要返回的列或表达式 | 是 |
| FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
| WHERE | 行级过滤 | 否 |
| GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
| HAVING | 组级过滤 | 否 |
| ORDER BY | 输出排序顺序 | 否 |
| LIMIT | 要检索的行数 | 否 |
