在实际数据库表查询中,常常需要跟据需求将数据进行分类,而且不仅仅是返回结果那种,因此需要用到新的字句——GROUP BY子句和HAVING子句。
返回结果分类:
SELECT COUNT(*) AS num_prods
FROM Products WHERE vend_id = ‘DLL01’;
#返回供应商为“DLL01”的数量记为vend_id。
创建分组:SELECT语句中的GROUP BY 子句建立的;
Select vend_id, count(*) as num_prods from products group by vend_id;
#返回vend_id分组的列并且各组计数。
Group by 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组;如果group by 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。
Group by 子句中列出的每一列都必须是检索列或者有效的表达式。如果在select中使用表达式,则必须在group by子句中指定相同的表达式。
过滤分组:having子句;
Select cust_id, count(*) as orders from orders group by cust_id having count(*) >= 2;
返回按照cust_id 分组,然后计数各组数量,并返回数量大于2的cust_id及数量值。
值得注意的是:这行代码中,where子句并不能达到效果,因为having过滤记于的是分组聚合值而不是字段内容,where子句在select语句之前执行,所以只可以用having。
Having 和 where 的差别
Where 在数据分组前进行过滤,having 在数据分组后过滤,where过滤掉的值不会出现在分组中,而having基于计算结果过滤分组。
根据需要,可以对where 和 having 进行选用或者联用。








暂无数据