MySQL零基础教程13—分组查询(group by 和 having)
复习
上期学习的时聚合查询,其中涉及到了几个聚合函数,通过下方导图整体回顾复习一下:
分组
之前我们使用最多的就是where
子句,分组查询要学习两个新的子句:group by
和having
子句
group by子句
我们构建一个场景:假如在订单表中,我们需要获取到,每个人分别买了多少单,那么就需要以顾客为组,分别统计每个顾客的订单数量,这种情况就需要分组
select customer_name, count(*) as 订单数量 from orders group by customer_name;
在分组查询的时候,因为已经指定了分组条件,就不需要对count()再加条件了,系统会自动先分组再汇总
having子句:给分组加上条件
在之前我们给查询加条件都是通过where
子句,在分组查询的时候,也是可以增加过滤条件的,只不过需要使用的是having
子句,分组查询的时候where是不起作用的
where和having的区别:
- where过滤的时候,指定的是行,不是分组,where是没有分组的概念的
- having在用法上和where大同小异,区别就是having过滤的是“组”
或者这样理解:where是在分组前进行过滤,having是在分组后进行过滤
构建一个需要过滤的分组查询场景:
查询每位顾客的订单数量,但是只查询订单总数大于等于3的顾客:
select customer_name as 顾客姓名, count(*) as 订单数量 from orders group by customer_name having count(*)>=3;
上边提到where是在分组前进行过滤,having是在分组后进行过滤,我们可以写一个语句体会一下:
根据顾客分组,查询订单数量大于等于3,且姓张的顾客的数据:
select customer_name as 顾客姓名, count(*) from orders where customer_name like '张%' group by customer_name having count(*)>=3;
上边这个sql在分组前使用where,分组后使用having,两个子句就都生效了
分组后的排序
之前还学习了对查询数据的排序,比如以某一列的值为依据,对结果进行增序或者降序排列,分组后也是可以排序的,同样使用order by
子句
我们对上边的查询结果,根据订单数量进行增序排列(从低到高)
select customer_name, count(*) as 订单数量 from orders group by customer_name order by count(*) asc;
回顾select子句的顺序
截止现在,已经学习了不少子句了,我们汇总复盘一下:
子句 | 说明 | 是否必须使用 |
---|---|---|
select | 要返回的内容,列或者表达式 | 是 |
from | 从哪个表里边检索 | 如果从表中查询,则必须 |
where | 过滤行 | 否 |
group by | 分组 | 只有分组处理的时候使用 |
having | 组级别的过滤 | 否 |
order by | 对结果排序 | 否 |
limit | 限制查询结果行数 | 否 |