创建分组

分组是在SELECT语句的GROUP BY子句中建立的

select column_name, COUNT(*) as num_row from table_name GROUP BY column_name;

使用了GROUP BY指示了分组数据,然后对每个组而不是整个结果集进行聚集。

GROUP BY规定:

  1. GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套
  2. 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。即:在建立分组时,指定的所有列都一起计算(不能从个别列取回数据)
  3. GROUP BY子句中列出的每个列都必须是检索列或者有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,必须再GROUP BY子句中指定相同的表达式,不能使用别名
  4. 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
  5. 如果分组列中有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组
  6. 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 要检索的行数