MySQL分组数据

说明:本文所使用的数据库样例表创建脚本下载地址:https://github.com/zhaoxd298/mysql_scripts

一、创建分组

  分组是在SELECT语句的GTOUP BY子句中建立的,先看一个分组的例子:

SELECT vend_id, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id;

执行结果:
这里写图片描述

  上面的SELECT指定了两个列,vend_id包含产品供应商的ID,num_prods为计算字段。GROUP BY子句指示MySQL按vend_id排序并分组数据。这样便会对每个vend_id计算num_prods一次。下面为使用GROUP BY的一些重要的规定:
  1.GROUP BY可以包含任意数据的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制;
  2.GROUP BY子句中列的每个列都必须是检所列有效表达式,但不能是聚集函数,如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名;
  3.如果分组列中鞠咏NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,将他们分为一组;
  4.GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

WITH ROLLP关键字:可以对所有分组进行汇总,用法如下:

SELECT vend_id, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id WITH ROLLUP;

执行结果:
这里写图片描述

二、过滤分组

  除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。
  MySQL通过HAVING子句来对分组进行过滤。HAVING的用法和WHERE的用法几乎一样。唯一的差别就是WHERE是对行进行过滤,是在分组前进行过滤,而HAVING是对分组进行过滤,是在数据分组之后过滤的。下面为对分组进行过滤的一个例子:

SELECT vend_id, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id
HAVING COUNT(*) >= 3;

执行结果:
这里写图片描述

下面为同时使用WHERE和HAVING对数据进行过滤的例子:

SELECT vend_id, COUNT(*) AS num_prod
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

执行结果:
这里写图片描述

三、分组和排序

  在本文的例子中,我们发现用GROUP BY分组的数据确实是以分组顺序输出的。但情况并不总是这样,因为它并不是SQL规范所要求的。此外,用户可能会要求以不同的分组的顺序排序。故,如果需要指定排序顺序的话一定要通过ORDER BY来排序,而不要依赖GROUP BY的输出顺序,下面先给出没有使用ORDER BY的例子:

SELECT order_num, SUM(quantity*item_price) AS order_total
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50;

执行结果:
这里写图片描述

下面为使用ORDER BY子句的例子:

SELECT order_num, SUM(quantity*item_price) AS order_total
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY order_total;

执行结果:
这里写图片描述

四、SELECT子句顺序

下表给出SELECT子句的顺序:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值