等待下一个秋

  • Spark
  • Flink
  • Hive
  • 数据仓库
  • ClickHouse
  • 收徒弟
  • Java
    • Spring
    • Mybatis
    • SpringBoot
    • 面试题
  • Python
    • Python基础
    • 爬虫
    • Numpy
    • matplotlib
    • Flask
  • 技术杂谈
    • Linux知识
    • Docker
    • Git教程
    • Redis教程
    • mysql
    • 前端
    • R语言
    • 机器学习
  • 关于我
  • 其它
    • 副业挣钱
    • 资料下载
    • 资料文档
专注于Hadoop/Spark/Flink/Hive/数据仓库等
关注公众号:大数据技术派,获取更多学习资料。
  1. 首页
  2. 技术杂谈
  3. mysql
  4. 正文

MySQL group by having与聚合函数count sum使用实例讲解

2021年10月13日 3289点热度 0人点赞 0条评论

摘要:在本教程中,我们将学习如何使用MySQL GROUP BY子句基于列或表达式的值对行记录进行分组。

 

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)
FROM
    table
WHERE
    where_conditions
GROUP BY c1 , c2,...,cn;

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

 

MySQL GROUP BY示例

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

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

SELECT 
    status
FROM
    orders
GROUP BY status;

结果如下:

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

SELECT DISTINCT
    status
FROM
    orders;

 

MySQL GROUP BY与聚合函数

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

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

SELECT 
    status, COUNT(*)
FROM
    orders
GROUP BY status;

结果如下:

见下表orders和orderdetails表。

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

SELECT 
    status, SUM(quantityOrdered * priceEach) AS amount
FROM
    orders
        INNER JOIN
    orderdetails USING (orderNumber)
GROUP BY status;

结果如下:

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

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

结果如下:

 

MySQL GROUP BY与表达式示例

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

SELECT 
    YEAR(orderDate) AS year,
    SUM(quantityOrdered * priceEach) AS total
FROM
    orders
        INNER JOIN
    orderdetails USING (orderNumber)
WHERE
    status = 'Shipped'
GROUP BY YEAR(orderDate);

结果如下:

 

MySQL GROUP BY与HAVING

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

SELECT 
    YEAR(orderDate) AS year,
    SUM(quantityOrdered * priceEach) AS total
FROM
    orders
        INNER JOIN
    orderdetails USING (orderNumber)
WHERE
    status = '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)
FROM
    orders
GROUP BY year;

结果如下:

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

SELECT 
    status, COUNT(*)
FROM
    orders
GROUP BY status DESC;

结果如下:

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

 

在本教程中,我们向您展示了如何使用MySQL GROUP BY子句根据列或表达式的值将行分组到子组中,希望本教程对大家有一定的价值。


标签: mysql
最后更新:2021年10月13日

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

搜一搜
微信
最新 热点 随机
最新 热点 随机
深入理解ClickHouse跳数索引 ClickHouse主键索引最佳实践 Java和Python操作Clickhouse ChatGPT 注册教程 ChatGPT可以做什么 ClickHouse 自定义分区键
Hive 分析函数lead、lag实例应用 ClickHouse ReplacingMergeTree引擎 MySQL group by having与聚合函数count sum使用实例讲解 mysql 下载与安装 hive中orc格式表的数据导入 黑客与画家 1.为什么书呆子不受欢迎
标签聚合
Java 书籍 大数据 挣钱 Python Hive 算法 Flink 数据仓库 Redis mysql R语言
文章归档
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2022年12月
  • 2022年11月
  • 2022年9月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年5月
  • 2020年4月
  • 2020年1月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年1月
  • 2018年12月
  • 2017年5月

©2022 ikeguang.com. 保留所有权利。

鄂ICP备2020019097号-1

鄂公网安备 42032202000160号