MySQL-分组

分组是把数据分为几个逻辑组,以便对这些组分别进行聚集计算

先看一个例子,我们想看下供应商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;

这里写图片描述

看,非常优雅地解决了上面的问题。

现在来记一些规则

  1. GROUP BY 列出的每一列都必须是检索列或表达式(但不能是聚集函数),如果SELECT指定的是表达式,则GROUP BY要指定相同的表达式,不能用别名
  2. 如果分组列中具有NULL值,则NULL将作为一个分组,多个NULL也是一个分组
  3. 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;    #这里不能用别名

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值