SQL (九)分组数据(group by子句, having子句)

group by子句和having子句都是select子句

返回供应商DLL01的总产品数

select count(*) as num_prods, vend_id
from products
where vend_id = 'DLL01';

在这里插入图片描述

用分组把数据分为多个逻辑组,对每个组进行聚集计算

创建分组:select语句的group by子句

在这里插入图片描述

select vend_id, count(*) as num_prods
from products
group by vend_id;

group by指示DBMS按照vend_id分组数据,然后对每个组再聚集计算。
在这里插入图片描述

注意不用group by会报错:

select vend_id, count(*) as num_prods
from products;

过滤分组:having子句

在这里插入图片描述
厉害了,

  • having子句非常类似于where子句,目前学过的所有类型的where子句都可以用having替代
  • having也是过滤,但是过滤的是分组,而where过滤的是行
    在这里插入图片描述
    在这里插入图片描述

示例1

select cust_id, count(*) as orders
from orders
group by cust_id
having count(*) >=2;

在这里插入图片描述
如果没有having子句,则输出如下,所以having子句确实过滤了3个分组。这里的过滤是基于分组聚集值,而不是特定行的值
在这里插入图片描述

示例2:having和where一起用

select vend_id, count(*) as num_prods
from products
where prod_price >= 4
group by vend_id
having count(*) >= 2;

在这里插入图片描述
看看供应商和价格情况

select vend_id, prod_price
from products;

在这里插入图片描述

可以看到,where语句先过滤了价格小于4的,然后再根据行数大于2来聚集

分组的排序

在这里插入图片描述

使用group by应该也给出order by,不要只依赖group by

没有用order by

select order_num, count(*) as items
from orderitems
group by order_num
having count(*) >= 3;

出来的顺序不知道是什么顺序
在这里插入图片描述
给出order by,按照items数量先排序,items相同的再按照订单号排序

select order_num, count(*) as items
from orderitems
group by order_num
having count(*) >= 3
order by items, order_num;

在这里插入图片描述
在这里插入图片描述

select子句的顺序

终于要总结他们的顺序了
在这里插入图片描述

总结

  • 虽然having和where很相似,但是要记住,having一定要和group by一起用,是用于过滤分组;而where是用于普通的行级过滤
  • 掌握好where和having的差异
  • 掌握好order by 和group by 的差异
  • 掌握好设了select子句的顺序
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值