MySQL 中 Group By 的用法

这篇具有很好参考价值的文章主要介绍了MySQL 中 Group By 的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL 中 Group By 的用法

Group By 是一种 SQL 查询语句,常用于根据一个或多个列对查询结果进行分组。在 Group By 子句中指定的列将成为分组依据,而在 Select 子句中指定的列必须是聚合函数(例如 SUM、AVG、COUNT 等)或分组列。

Group By 的语法如下: 

SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s);

其中,column_name 是需要返回的列名,table_name 是需要查询的表名,condition 是查询条件。使用 Group By 时,需要注意以下几点:

  • 如果在 Select 子句中没有指定聚合函数,则必须将该列也包含在 Group By 子句中。
  • 在 Group By 中指定的列可以是表达式或函数,但在 Select 子句中必须使用别名来引用这些列。

假设我们有一个存储用户订单信息的表 orders,其中包含了订单号、客户 ID、订单日期和订单金额四个字段。我们现在需要按照客户 ID 对所有订单进行分组,并计算每个客户的订单数和总金额。可以使用 Group By 如下:

SELECT customer_id, COUNT(order_number) AS order_count, SUM(order_amount) AS total_amount FROM orders GROUP BY customer_id;

在上面的示例中,我们使用 GROUP BY 子句指定了客户 ID 列作为分组依据,并在 Select 子句中使用了 COUNT 和 SUM 聚合函数来计算每个客户的订单数和总金额。

Group By 例子

以下是用于演示 Group By 的 SQL 语句以及相应的结果:

SELECT category, SUM(price) AS total_price FROM products GROUP BY category;

category total_price
Book 150
Pen 50
Pencil 20

在上面的示例中,我们使用 GROUP BY 子句指定了产品类别列作为分组依据,并使用了 SUM 聚合函数来计算每个类别的总价值。

相关的方法

除了 Group By 之外,还有一些与 Group By 用法相近的方法可以用于对查询结果进行聚合和分组。其中包括以下几种:

Having

Having 是一个可选的子句,在 Group By 后面使用,用于过滤分组后的结果。通常用于筛选特定的分组,或者根据聚合函数计算的结果进行过滤。

SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition;

在上面的语法中,column_name 是需要返回的列名,table_name 是需要查询的表名,condition 是查询条件。在使用 Having 时需要注意以下几点:

  • Having 子句中的条件是基于聚合函数计算的结果进行过滤的。
  • 如果在 Select 子句中没有使用聚合函数,则必须在 Group By 子句中包含该列。
  • 如果条件中只涉及到一个聚合函数,可以使用 WHERE 子句代替 Having 子句。

假设我们有一个存储学生成绩信息的表 scores,其中包含了学生姓名、科目和分数三个字段。我们现在需要查询分数在 60 分以上的每个学生在每个科目上的平均分数。可以使用 Having 如下:

SELECT student_name, subject, AVG(score) AS average_score FROM scores GROUP BY student_name, subject HAVING AVG(score) > 60;

在上面的示例中,我们首先使用 Group By 对学生姓名和科目进行分组,然后使用 Having 条件过滤了分数平均值在 60 分以上的结果。

Rollup

Rollup 是一种可选的子句,在 Group By 子句后面使用,用于生成分组汇总行。通过使用 Rollup,可以将多组数据汇总为单组数据,并生成具有层次结构的报告。

SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) WITH ROLLUP;

在上面的语法中,column_name 是需要返回的列名,table_name 是需要查询的表名,condition 是查询条件。使用 Rollup 时需要注意以下几点:

  • Rollup 子句可以用于生成多级汇总报告。
  • 对于每个分组列,Rollup 将生成一个子总计行。
  • 如果在 Group By 子句中指定了多个分组列,则 Rollup 将生成每个分组列的所有可能组合情况的子总计行。

假设我们有一个存储销售订单信息的表 orders,其中包含了订单日期、客户 ID 和订单金额三个字段。我们现在需要对订单日期和客户 ID 进行分组,并按照订单日期、客户 ID 和总金额生成汇总报告。可以使用 Rollup 如下:

SELECT order_date, customer_id, SUM(order_amount) AS total_amount FROM orders GROUP BY order_date, customer_id WITH ROLLUP; 文章来源地址https://www.toymoban.com/news/detail-637601.html

在上面的示例中,我们使用 Group By 按照订单日期和客户 ID 进行分组,并在 Select 子句中使用了 SUM 聚合函数来计算每个客户在每个日期的总销售额。接着,使用 Rollup 生成了按照日期、客户 ID 和总金额的汇总报告。

结论

Group By 是一种常用的 SQL 查询语句,用于根据一个或多个列对查询结果进行分组。除了 Group By 之外,还有一些与 Group By 用法相近的方法可以用于对查询结果进行聚合和分组,例如 Having 和 Rollup。在使用这些方法时,需要根据实际需求选择合适的语句,以达到最佳的查询效果。

示例代码

以下是用于演示 Group By、Having 和 Rollup 的 SQL 语句以及相应的结果:

Group By 示例

SELECT customer_id, COUNT(order_number) AS order_count, SUM(order_amount) AS total_amount FROM orders GROUP BY customer_id;

customer_id order_count total_amount
1 2 400
2 1 200
3 1 100

Having 示例

SELECT student_name, subject, AVG(score) AS average_score FROM scores GROUP BY student_name, subject HAVING AVG(score) > 60;

student_name subject average_score
Alice Math 70.5
Bob English 70
Linda Science 80
Tom Math 65
Tom Science 70

Rollup 示例

SELECT order_date, customer_id, SUM(order_amount) AS total_amount FROM orders GROUP BY order_date, customer_id WITH ROLLUP;

order_date customer_id total_amount
2022-01-01 1 200
2022-01-01 2 100
2022-01-01 NULL 300
2022-01-02 1 200
2022-01-02 NULL 200
NULL NULL 500

到了这里,关于MySQL 中 Group By 的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法

    目录层级 MySQL数据库,从入门到精通:第一篇——MySQL概念详解 MySQL数据库,从入门到精通:第二篇——MySQL关系型数据库与非关系型数据库的比较 MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句 MySQL数据库,从入门到精通:第四篇——MySQL中常用的运

    2024年02月08日
    浏览(89)
  • mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

    1、项目记录表project_record的结构和数据如下: 以下为项目记录表 project_record 的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录) 2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。

    2023年04月08日
    浏览(40)
  • kettle工具连接MySQL数据库报错 Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error

            前几天为了修复MySQL数据库漏洞,项目上从5.7.41版本升级到了5.7.43,今天在使用kettle时发现数据库突然连不上了,测试连接报如下错误:            Error connecting to database: (using class org.gjt.mm.mysql.Driver) Communications link failure The last packet successfully received from the serve

    2024年02月06日
    浏览(50)
  • Mysql group by使用示例

    总数据: 索引情况:

    2024年02月11日
    浏览(33)
  • MySQL Group by 优化查询

      使用的是临时表,加文件排序(数据量小用内存排序) 注意:这里加的索引一般不会仅仅是group by后面的字段索引(大多数多少条件是一个以 该字段开头联合索引 ,方便使用覆盖索引或者索引下推)。如果该字段是一个varchar类型, 最好 加个int冗余字段,建立索引的字段,

    2024年02月05日
    浏览(44)
  • mysql GROUP BY 怎么 order by 排序

    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排序顺序。例如: 在这个例子中,SELECT 语句选择了表 table1 中的列 column1 和

    2024年02月16日
    浏览(53)
  • MySQL——GROUP BY详解与优化

    在 MySQL 中,GROUP BY用于将具有指定列中相同值的行分组在一起。这是在处理大量数据时非常有用的功能,允许对数据进行分类和聚合。 以下是GROUP BY子句的基本语法: \\\"\\\"\\\" \\\"\\\"\\\" 其中,col1, col2, ...是要分组的列名,aggregate_function是用于聚合数据的函数,如SUM, AVG, MAX, MIN等。table_

    2024年02月16日
    浏览(33)
  • MySQL查询分组Group By原理分析

    日常开发中,我们经常会使用到group by: 你是否知道group by的工作原理呢? group by和having有什么区别呢? group by的优化思路是怎样的呢? 使用group by有哪些需要注意的问题呢? 使用group by的简单例子 group by 工作原理 group by + where 和 having的区别 group by 优化思路 group by 使用注意

    2023年04月16日
    浏览(46)
  • mysql distinct 和 group by 去重

    MySQL中常用去重复数据的方法是使用 distinct 或者 group by group by 分组后,如果没有对分组后的数据进行操作,如使用聚合函数/分组函数:count、sum、avg、max 、min,分组后直接显示该分组的第一条数据。 说明: 有一个事件评论表,针对每个事件,用户都可以发表评论,每发表一

    2024年02月04日
    浏览(38)
  • mysql group by 字段 与 select 字段

    表数据如下: 执行SQL语句1: SELECT * FROM `z_course` GROUP BY NAME,SEX  结果:   执行SQL语句2: SELECT * FROM `z_course` GROUP BY NAME    sql 1 根据 name,sex 两个字段分组,查询 所有字段,返回结果 sql 2 根据 name 字段分组,查询所有字段,返回结果 sql2 和 sql1 的区别是 分组少了 sex字段,那

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包