1、group by
根据指定的列名(即规则)对数据进行分组,将一个“数据集” 划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
常用的聚合函数:count() , sum() , avg() , max() , min();
HAVING 操作的对象是组,那么其使用的要素是有一定限制的,能够使用的要素有 3 种: 常数 、 聚合函数 和 聚合键 ,聚合键也就是 GROUP BY 子句中指定的列名。
select 字段 from 表名 where 条件 group by 字段 having 过滤条件。
与where的区别:
(注意:where后的条件表达式里不允许使用聚合函数,而having可以)
WHERE 先过滤出行,然后 GROUP BY 对行进行分组,HAVING 再对组进行过滤,筛选出我们需要的数据,如下:
group by一些注意点,使用聚集函数。点击查看
当where和having关键字同时使用时,尽量在where中书写筛选数据条件理由如下:
-
语义更清晰,WHERE 子句和 HAVING 子句的作用是不同的;前面已经说过,HAVING 子句是用来指定“组”的条件的,而“行”所对应的条件应该写在 WHERE 子句中,这样一来,写出来的 SQL 语句不但可以分清两者各自的功能,而且理解起来也更容易
-
执行速度更快,使用 COUNT 等函数对表中数据进行聚合操作时,DBMS 内部进行排序处理,而排序处理会大大增加机器的负担,从而降低处理速度;因此,尽可能减少排序的行数,可以提高处理速度
-
通过 WHERE 子句指定条件时,由于排序之前就对数据进行了过滤,那么就减少了聚合操作时的需要排序的记录数量;而 HAVING 子句是在排序之后才对数据进行分组的,与在 WHERE 子句中指定条件比起来,需要排序的数量就会多得多
-
另外,索引是 WHERE 根据速度优势的另一个有利支持,在 WHERE 子句指定条件所对应的列上创建索引,可以大大提高 WHERE 子句的处理速度
注意:
默认情况下,如果只有group by col,那么结果将会按照col进行升序排序,也就是说,mysql会导致默认的排序,这个对性能是有影响的,注意!
如果确定不需要排序,那么可以加上group by col order by null,这样就不会导致排序。但有列外情况:假如col字段上有索引,那么即使加上order by null,其查出来的结果仍然是按照col排序的,相当于使用了索引覆盖,注意!
select 字段 fun_name from 表名 [where 条件] [group by field1,field2...] [with rollup] [having 条件];
eg:
1.fun_name 表示要做的聚合操作,也就是说聚合函数,常用的有 : sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
2.group by关键字 表示要进行分类聚合的字段。比如要按照部门分类统计员工数量,部门就应该写在group by 后面。
3.with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总
4.having 关键字表示对分类后的结果再进行条件过滤。
2、order by
//关键字 desc(降序) asc(升序),放在列名后面
//descend ascend
select * from 表名 order by 列名1 desc, 列名2 asc ;
默认是升序