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


版权声明:本文为zyunxiaof原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。