SQL基础学习:七、数据分组


SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。如果要返回每个供应商提供的产品数目怎么办?此时Group by的功能就显现出来,或者返回只提供单项产品的供应商所提供的产品,此时Having的优势就显现出来。

本篇主要学习select的另外两个子句 Group by, Having。

products 表

在这里插入图片描述

1. group by

举例:返回每个供应商提供的产品数目

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

/*结果  
VEND_ID	        PROD_NUM
RR_001_factory	 1
RR_007_factory	 3
BV_001_factory	 1
BZ_002_factory	 1

GROUP BY子句指示DBMS按vend_id排序并分组数据。这导致对每个vend_id而不是整个表计算prods_num一次。

2. having

除了能用GROUP BY分组数据外,SOL还允许过滤分组,规定包括哪些分组,排除哪些分组。这就是having的过滤功能。

举例:筛选供应商提供的产品数目两个以上的产品信息

/*将产品按价格从高到低排序*/
select vend_id ,count(*) prod_num from products group by vend_id having count(*) >=2 ;
/*结果  
VEND_ID	        PROD_NUM
RR_007_factory	3
*/

注意

1.我们经常发现用GROUP BY分组的数据确实是以分组顺序输出的。但情况并不总是这样,它并不是SQL规范所要求的。所以一般给出相应的order by 语句。

2.正如所见,这里WHERE子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。

3.having和where的区别

HAVING和WHERE的区别 WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

举例:筛选供应商提供的产品价格超过1100且数目两个以上的产品信息

/*将产品按价格从高到低排序*/
select vend_id ,count(*) prod_num from products group by vend_id having count(*) >=2 ;
/*结果  
VEND_ID	        PROD_NUM
RR_007_factory	2
*/

直接早分组前筛选掉价格为1000的幻影,所以最终的数量是2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会飞的熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值