分组是把数据分为几个逻辑组,以便对这些组分别进行聚集计算
先看一个例子,我们想看下供应商1003的所有产品
SELECT COUNT(*) AS prod_num
FROM products
WHERE vend_id = 1003;
可以知道供应商1003的产品一共有7个。那现在我想分别看一下每个供应商的产品数,难道要一个个像上面那样检索吗?如果供应商有100个我们就要打100次?想想就可怕。因此,分组GROUP BY就应运而生了。
SELECT vend_id, COUNT(*) AS prod_num
FROM products
GROUP BY vend_id;
看,非常优雅地解决了上面的问题。
现在来记一些规则
- GROUP BY 列出的每一列都必须是检索列或表达式(但不能是聚集函数),如果SELECT指定的是表达式,则GROUP BY要指定相同的表达式,不能用别名
- 如果分组列中具有NULL值,则NULL将作为一个分组,多个NULL也是一个分组
- GROUP BY 必须在WHERE之后,ORDER BY 之前
HAVING 过滤分组
WHERE 和HAVING的区别是: WHERE过滤行,HAVING过滤分组
我们先来看下所有顾客各自下的订单数
SELECT cust_id, COUNT(*) AS order_num
FROM orders
GROUP BY cust_id;
我们知道除了10001顾客有2单,其他都是1单。这是顾客比较少,才4个情况下我们可以一眼就看出来单子数,如果现在有1000个顾客,我想看超过1单的顾客数有多少,该怎么做?用HAVING过滤就好
SELECT cust_id, COUNT(*) AS order_num
FROM orders
GROUP BY cust_id
HAVING COUNT(*) > 1; #这里不能用别名