MySQL分组查询

HAVING关键字,指定条件表达式,对分组后的内容进行过滤

GROUP BY,通常和聚合函数一块儿使用函数

GROUP BY子句必须出如今WHERE子句以后, ORDER BY子句以前。
HAVING关键字和WHERE关键字的做用相同,都是用于设置条件表达式,对查询结果进行过滤。blog

二者的区别,HAVING关键字后,能够跟聚合函数,而WHERE关键字不能,一般状况下,HAVING关键字,都是和GROUP BY一块儿使用,用于对分组后的结果进行过滤排序

SELECT COUNT(*),sex FROM db_employee GROUP BY sex原理

根据性别进行分组,将性别相同的放在一块儿 最后自动统计数目im

给count(*)起个别名统计

SELECT sex,COUNT(*) as number FROM db_employee GROUP BY sex数据

除了能用GROUP BY分组数据外, MySQL还容许过滤分组,规定包括哪些分组,排除哪些分组。能够经过 HAVING实现。HAVING很是相似于WHERE。事实上,以前全部类型的WHERE子句均可以用HAVING来替代。惟一的差异是WHERE过滤行,而HAVING过滤分组。HAVING支持全部WHERE操做符。查询

SELECT子句的书写顺序和执行顺序
Select子句书写顺序:
Select … from tbl1, tbl2 where … group by … having ……order by (asc | desc )
当SELECT语句被DBMS执行时,其子句会按照固定的前后顺序执行: 
(1)FROM  子句。 
(2)WHERE 子句。 
(3)GROUP BY 子句。 
(4)HAVING 子句。 
(5)SELECT 子句。 
(6)ORDER BY 子句。 
基本的工做原理:FROM子句先被执行,经过FROM子句得到一个虚拟表,而后经过WHERE子句从虚拟表中获取知足条件的记录,生成新的虚拟表。将新虚拟表中的记录经过GROUP BY子句分组后获得更新的虚拟表,然后HAVING子句在最新的虚拟表中筛选出知足条件的记录组成另一个虚拟表中,SELECT子句会将指定的列提取出来组成更新的虚拟表,最后ORDER BY子句对其进行排序得出最终的虚拟表。一般这个最终的虚拟表被称为查询结果集。
db