示例使用的是MySQL官方数据库sakila
having子句一直是我认为比较难以理解的玩意,但是既然用到了就要把这个玩意弄清楚。
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。having和where的作用类似,都是提供一个筛选条件。但是这两者最大的不同是where判断的是真实读取的数据,having判断的是调用一些聚合函数计算之后得到的数据。
例如having的一个应用场景
select customer_id,sum(amount) from payment
group by customer_id
having sum(amount)>100
limit 10;
结果如下
这个having的作用是只显示sum(amount)在100以上的行,此时不能用where,因为sum(amount)并不存在于原表中,这个值是算出来的。
having和where的不同
1.WHERE 子句作用于表和视图,HAVING 子句作用于组。
2.having一般跟在group by之后,执行记录组选择的一部分来工作的。where则是执行所有数据来工作的。
3.where中不能用聚合函数,having总是包含聚合函数。
网友评论