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