where 和 having 的区别
(1)用的地方不一样
where可以用于select、update、delete和insert 语句中;having只能用于select语句中。
(2)执行的顺序不一样
where的搜索条件是在执行语句进行分组之前应用; having的搜索条件是在分组条件后执行的。
即如果where和having一起用时,where会先执行,having后执行
(3)子句有区别
where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;having子句可以用合计函数(sum、count、avg、max 和 min),而 where 子句不可以。
(4)SQL标准要求 having 必须引用 group 子句中的列或用于合计函数中的列
group by 的用法
group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。
(1) 集合函数 max
select max(user_id), grade from user_info group by grade;
将数据照grade字段分组,查询每组最大的user_id以及当前组内容。
注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。
(2) having
select max(user_id),grade from user_info group by grade having grade>'A';
这条sql与上面例子中的基本相同,不过后面跟了having过滤条件。将grade不满足’>A’的过滤掉了。
注意,这里分组条件是grade,查询的非聚合条件也是grade。这里不产生冲突。
select max(user_id),id,grade from user_info group by grade
id 字段的选取是按照mysql存储的检索数据匹配的第一条
结论
(1)当group by 与聚合函数配合使用时,功能为分组后计算
(2)当group by 与having配合使用时,功能为分组后过滤
(3)当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容