Sql 的书写顺序
SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
Sql 的执行顺序
from-->join-->on-->where-->group by-->having-->select-->order by-->limit
做了什么?
from===确定操作的表
join on===多表连接
where===条件筛选
group by===分组
having===分组筛选(sum、count等聚合函数)
select===查询返回字段(distinct,sum、max等函数)
order by===排序(DESC、ASC)
limit===限制返回数据
GROUP BY 用法
GROUP BY,即以其中一个字段的值来分组
select 的字段只能是分组的字段类别以及使l聚合函数如,max(),min(),count()的字段。
where在前,group by在后的原因:要先用where过滤掉不进行分组的数据,然后在对剩下满足条件的数据进行分组。
having是在分好组后找出特定的分组,通常是以筛选聚合函数的结果,如sum(a) > 10等,且having必须在group by 后面,
使用了having必须使用group by,但是使用group by 不一定使用having。不允许使用双重聚合函数,所以在对分组进行筛选的时候,可以用order by 排序,然后用limit也可以找到极值。
having和where
having只能用在group by之后,对分组后的结果进行筛选
where在group by 之前,也在having之前。
where后的条件表达式里不允许使用聚合函数having可以。
因为聚合函数是做统计用的,所有的聚合方式使用都是对这一个字段进行聚合.但在mysql内部运行机制中,where后面还没有结果,只有select后面才有结果集。所以聚合函数是不能放在where后面,却可以放在select后面。
为什么聚合函数却可以放在having后面呢?
having是分组后的过滤,也就意味着having是对分组的结果进行过滤.所以having之前一定是分组,一定是有结果的,也就意味着having后面的聚合函数可以统计到结果.所以聚合函数却可以放在having后面.
当分组筛选的时候 用having,其它情况用where
只要条件里面的字段, 不是表里面原先有的字段就需要用having. SQL在查询表的时候先把查询的字段放到了内存里,而where查询的时候是从表里面查的,其余需要用having。
count用法
使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。
MySQL聚合函数
函数名 | 作用 |
---|---|
MAX(column) | 返回某列的最低值(有则不会返回NULL,没有则返回NULL) |
MIN(column) | 返回某列的最高值(没有则返回NULL) |
COUNT(column) | 返回某列的行数(不包括 NULL 值) |
COUNT(*) | 返回被选列行数(包括NULL) |
SUM(column) | 求和 |
AVG(column) | 求平均值 |