distinct
- 对结果去重
-
select distinct column1[, column2...] from tables [where conditions];
- 往往用
distinct
来返回不重复字段的条数(count(distinct column)
),因为distinct
只能返回它的目标字段,而无法返回其他字段 distinct
要放在所有字段的前面;如果去重的字段大于一个,则会进行组合去重,只有多个字段组合起来相同时才会被去重
order by
- 对结果排序
order by column1[, column2...] ASC|DESC
group by
- 分组统计:结合聚合函数,根据一个或多个列对结果集进行分组
- 执行流程:
select city ,count(*) as num from staff group by city;
- 创建内存临时表,表里有两个字段city和num
- 全表扫描staff的记录,依次取出city=’X’的记录
- 判断临时表中是否有city=’X’的行,没有就插入一个记录(X,1);如果临时表中有city=’X’的行,就将x这一行的num值加1
- 遍历完成后,再根据字段city做排序,得到结果集返回给客户端
- group by使用不当,很容易就会产生慢SQL 问题。因为它既用到临时表,又默认用到排序。有时候还可能用到磁盘临时表。如果执行过程中,会发现内存临时表大小到达了上限(控制这个上限的参数就是tmp_table_size),会把内存临时表转成磁盘临时表。
- group by后面的字段加索引,保证group by后面的字段数值一开始就是有序是优化group by最简单有效的优化方式:
alter table staff add index idx_age_city(age,city);
- order by null不用排序
- 尽量只使用内存临时表:适当调大tmp_table_size参数,来避免用到磁盘临时表
- 使用SQL_BIG_RESULT:使用SQL_BIG_RESULT这个提示直接用磁盘临时表。MySQl优化器发现,磁盘临时表是B+树存储,存储效率不如数组来得高。因此会直接用数组来存
- group by后面的字段加索引,保证group by后面的字段数值一开始就是有序是优化group by最简单有效的优化方式:
having
- SQL中增加HAVING子句原因是,WHERE关键字无法与聚合函数一起使用
- HAVING 子句可以让我们筛选分组后的各组数据
- where & having 区别总结:
- having子句用于分组后筛选,where子句用于行条件筛选
- having一般都是配合group by和聚合函数一起出现如(count(),sum(),avg(),max(),min())
- where条件子句中不能使用聚集函数,而having子句就可以。
- having只能用在group by之后,where执行在group by之前
where 1=1 / where 1<>1
- 表示条件永远成立/永远不成立
- 可用于动态查询,后面拼凑
and condition
- 用于SQL注入,在查询语句中注入or 1=1
explain
explain expression
- 对输入的语句进行分析
聚合(Aggregate)函数
count
- 计数
sum
- 对字段求和