MySQL GROUP BY子句

GROUP BY子句是 SELECT 语句的可选部分,它将一组行记录按列或表达式的值分组成摘要行记录。GROUP BY子句返回每个分组的一个行记录。换句话说,它减少了在结果集中的行数。

我们经常使用GROUP BY子句在聚合函数中使用,如:SUM, AVG, MAX, MIN, 和 COUNT。聚合函数出现在SELECT子句中并提供有关每分组的信息。
以下说明了 GROUP BY 子句的语法:

SELECT c1, c2,..., cn, aggregate_function(ci)
FROMtable
WHEREwhere_conditions
GROUP BY c1 , c2,...,cn;

GROUP BY 子句必须在 FROM 和 WHERE 子句后出现。 在GROUP BY 关键字之后要使用逗号分隔列或表达式列表作为标准分组行。

MySQL GROUP BY示例

让我们来看看示例数据库中的orders表。

假设我们要使用 order 表中的 status 字段作为分组字段,使用 GROUP BY子句的 status 列如下面的查询所示:

SELECT status
FROMorders
GROUP BY status;

结果如下:

我们可以看到,GROUP BY子句返回 status 值的唯一匹配项。它的工作原理类似下面显示的 DISTINCT 运算符查询:

SELECT DISTINCTstatus
FROMorders;

MySQL GROUP BY与聚合函数

聚合函数允许我们执行某组行的计算并返回一个值。 GROUP BY子句通常与聚合函数来执行计算,并为每个分组返回一个值。

例如,如果我们想知道每一种状态有多少个订单,可以使用COUNT函数与 GROUP BY 子句如下:

SELECT status, COUNT(*)
FROMorders
GROUP BY status;

结果如下:

见下表ordersorderdetails表。

要通过订单状态查询所有订单的总金额,这里 order 表需要连接 order_detail 表,并使用SUM函数来计算总额。请参考下面的查询:

SELECT status, SUM(quantityOrdered * priceEach) AS amount
FROMordersINNER JOINorderdetails USING (orderNumber)
GROUP BY status;

结果如下:

下面的查询返回订单号和每个订单的总额。

SELECT orderNumber,SUM(quantityOrdered * priceEach) AS total
FROMorderdetails
GROUP BY orderNumber;

结果如下:

MySQL GROUP BY与表达式示例

除了列,我们可以通过表达式来进行分组行。下面的查询获取每月的销售总额。我们使用 YEAR 函数从订单日期(order_date 字段)中提取年份信息。我们只查询发货状态是完成的订单。请注意,该表达式出现在SELECT子句中必须与在 GROUP BY 子句中一样。

SELECT YEAR(orderDate) AS year,SUM(quantityOrdered * priceEach) AS total
FROMordersINNER JOINorderdetails USING (orderNumber)
WHEREstatus = 'Shipped'
GROUP BY YEAR(orderDate);

结果如下:

MySQL GROUP BY与HAVING

要筛选由 GROUP BY 子句返回分组行,我们使用 HAVING 子句。下面是使用 HAVING 子句查询2012年之后的年份的总销售额。

SELECT YEAR(orderDate) AS year,SUM(quantityOrdered * priceEach) AS total
FROMordersINNER JOINorderdetails USING (orderNumber)
WHEREstatus = 'Shipped'
GROUP BY year
HAVING year > 2003;

结果如下:

MySQL和标准SQL中的GROUP BY子句

标准SQL不允许我们在GROUP BY子句中使用别名,但MySQL支持这一点。下面的查询语句是从订单日期提取年份并计算每年的订单数量。year 被使用作为表达式 YEAR(orderDate) 的别名。我们用 year 这个别名在GROUP BY子句中。但是这样的用法在查询标准SQL中是非法的。

SELECT YEAR(orderDate) AS year, COUNT(orderNumber)
FROMorders
GROUP BY year;

结果如下:

MySQL也允许我们按升序或降序对分组的订单行记录进行排序,而标准SQL是不可以的,它默认顺序是升序。例如,如果我们想要查询每种订单状态的订单数量并按订单状态(status 字段)降序排列,可以使用GROUP BY 子句及 DESC,如下查询:

SELECT status, COUNT(*)
FROMorders
GROUP BY status DESC;

结果如下:

注意,我们使用 DESC 在GROUP BY子句之后,来按订单状态(status 字段)进行降序排序。我们可以在 GROUP BY 子句之后明确指定使用 ASC 来按订单状态(status 字段)升序排序。

MYSQL数据分组(十三)GROUP BY相关推荐

  1. mysql 数据分组_详解MySQL 数据分组

    创建分组 分组是在select语句中的group by 子句中建立的. 例: select vend_id, count(*) as num_prods from products group by ...

  2. 【Python数据分析与处理 实训03】 --- 酒类消费信息分析(数据分组聚合 group().agg()应用)

    [Python数据分析与处理 实训03] - 酒类消费信息分析(数据分组聚合 group().agg()应用) 探索酒类消费信息 对于下面的数据集进行简单的一些数据的分析训练 若需要源数据请私信~ 1 ...

  3. MySQL数据分组与查询

    一 . 多表连接查询: 连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获得数据 N个表相连时,至少需要N-1个连接条件 笛卡尔积: select emp.empno,emp ...

  4. MySQL入门 - 数据分组之 group by

    作者:汤圆学Java 个人博客:https://www.javalover.cc/ 前言 group by 用来对数据进行分组,即按照指定的字段或者表达式进行分组: 目录 group by 语句介绍 ...

  5. MySQL数据库分组查询group by(having)

    1. 分组查询介绍 分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组. 分组查询基本的语法格式如下: GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP ...

  6. mysql的select的排序_mysql数据分组和排序及SELECT子句顺序

    mysql分组和排序 虽然 GROUP BY 和 ORDER BY 经常完成相同的工作,但它们是非常不同的.下表汇总了它们之间的差别. 表中列出的第一项差别极为重要.我们经常发现用 GROUP BY ...

  7. MySQL:基础—数据分组

    MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...

  8. mysql单列去重复group by分组取每组前几条记录加order by排序

    <div class="post"><h1 class="postTitle"><a id="cb_post_title ...

  9. mysql 分组查询例子_分组查询GROUP BY用法例子详解

    GROUP BY在mysql中是分组查询了,那么你对于GROUP BY有了解多少呢,下面我们来看一篇关于GROUP BY使用例子,具体的细节如下所示. 在SQL中使用GROUP BY来对SELECT的 ...

最新文章

  1. 用Js的eval解析JSON中的注意点
  2. boost::callable_traits的remove_member_reference_t的测试程序
  3. [转]C#中多路IP摄像机的视频监控系统
  4. 李航《统计学习方法》之HMM隐马尔可夫模型
  5. 详解HelloWorldBasic实例
  6. mybatis注解开发_Spring Boot 中集成 MyBatis
  7. 微信小程序|开发实战篇之九-image-picker图片选择器组件及其子组件
  8. WPF通用窗体模板【2】
  9. 用python求两个人的平均身高_黄哥Python:分治算法(Divide-and-Conquer)
  10. memcached部署安装文档
  11. 全网首发:成功在loongarch64上编译成功jogamp(提供下载库)
  12. java jquery分页_如何最简单的实现java分页
  13. Ubuntu下gcc安装及使用
  14. 摩申网络:浅析网络棋牌游戏用户群体
  15. 使用containerd管理容器【同docker】【或称之为docker替代品】
  16. ios 拍照上传到服务器_iOS 上传图片到服务器
  17. mysql8.017安装教程_mysql 8.0.17 安装图文教程
  18. 计算机网络应用赛甘肃省,关于举办第三届“甘肃省大学生创新杯计算机运用能力竞赛”预赛的.doc...
  19. Linux负载均衡脚本,linux负载均衡软件设置(一)
  20. Linux从头开始搭建Redis集群(三种方式)

热门文章

  1. 使用计算机求解雷达方程,关于雷达方程
  2. 状态压缩 动规 海贼王 大作业
  3. matlab三元函数泰勒展开,如何用matlab绘制三元函数f(x,y,z)=x^2 y^3 z^4在[-1,1]x[-2,2]x[-3,3] 上的各...
  4. ubuntu虚拟机使用笔记——5、vim保存并退出
  5. 基于HTML5 Canvas 点击添加 2D 3D 机柜模型
  6. 探索人工智能音乐的未来:从算法到文化
  7. TeamViewer经验介绍
  8. CISSP复习笔记-第8章 业务连续性与灾难恢复
  9. html简易颜色选择器,HTML颜色选择器实现代码
  10. 浪潮服务器文件管理nas,架构浪潮NAS与SAN网络存储方案(图)