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