数据库中GROUP BY语句详解、示例、注意事项

 更新时间:2024年06月14日 11:15:51   作者:CodeCharm——CC  
在Oracle数据库中GROUP BY是用于对结果集进行分组的一个关键字,这篇文章主要给大家介绍了关于数据库中GROUP BY语句详解、示例、注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、基本介绍

GROUP BY 语句在 SQL 中用于将来自数据库表的记录分组,以便可以对每个组执行聚合函数(如 COUNT()MAX()MIN()SUM()AVG() 等)。使用 GROUP BY 时,数据库会根据一个或多个列的值将结果集分为多个分组,在每个分组内可以独立地使用聚合函数。GROUP BY 通常与 SELECT 语句一起使用,以汇总每个分组的数据。

二、基本语法

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

这个 SQL 模板展示了一个结构化查询语言(SQL)的基本结构,用于从数据库中选择、汇总、分组和排序数据。下面逐步解释每个部分的功能和作用:

  • sql SELECT column_name(s), AGGREGATE_FUNCTION(column_name)SELECT 关键字用于指定要从数据库表中检索的列或字段。 column_name(s) 是你想从选定表中选择的列的名称。你可以选择一个列、多个列或所有列(使用 *)。
    AGGREGATE_FUNCTION(column_name) 是应用于某列的聚合函数。聚合函数对数据进行数学运算,如计算平均值(AVG)、总和(SUM)、最大值(MAX)、最小值(MIN)或计数(COUNT)。

  • sql FROM table_name

    FROM 关键字后面跟着的是表名,指示 SQL 从哪个表中检索数据。

  • WHERE condition WHERE子句是可选的,用于指定筛选条件,以限制哪些行应该被包括在你的结果集中。只有满足指定条件的行才会被选中参与后续的 GROUP BY 或聚合操作。

  • GROUP BY column_name(s)GROUP BY 关键字后面跟着的列名用于指定数据库应该如何将数据分组。在使用聚合函数时,GROUP BY使你能够将行分组成小的数据块,并对每个组分别计算聚合函数。如果有多个列,数据库将根据这些列的组合值进行分组。

  • ORDER BY column_name(s)ORDER BY 关键字用于指定结果集的排序方式。你可以根据一个或多个列进行排序。默认情况下,ORDER BY 会按照升序(ASC)排列数据,但你也可以指定降序(DESC)。

三、关键点

  • 分组列: GROUP BY 语句后面跟的是一个或多个列,数据库根据这些列的值将数据分组。同一组内的行在所有指定的列上都有相同的值。
  • 聚合函数: 在分组的结果上通常会使用聚合函数来进行计算,如求每组的平均值、最大值、总和等。
  • 选择列: SELECT 语句中可以包含分组列和聚合函数,但如果选择的列没有包含在 GROUP BY
    中,且没有使用聚合函数处理,那么查询可能会返回错误。

四、示例

  • 示例1
    假设有一个 orders 表,其中包含 order_date 和 amount 列。如果我们想知道每个日期的总销售额,可以这样写:

    SELECT order_date, SUM(amount)
    FROM orders
    GROUP BY order_date;
    

    这个查询会根据 order_date 列的值将 orders 表中的记录分组,并计算每个日期的总销售额。

  • 示例2

    假设有一个名为 employees 的表,它有 department 和 salary 两列。如果你想知道每个部门的平均薪资,并按部门名排序,你的 SQL 语句可能如下:

    SELECT department, AVG(salary)
    FROM employees
    WHERE salary > 0
    GROUP BY department
    ORDER BY department;
    

    这个查询将:

    • 1 、从 employees 表中选择记录(FROM employees)。
    • 2、只包括那些 salary 大于 0 的行(WHERE salary > 0)。
    • 3、按照 department 列的值将行分组(GROUP BY department)。
    • 4、计算每个部门的平均薪资(AVG(salary))。
    • 5、按部门名称对结果进行排序(ORDER BY department)。
      这样,你就可以得到每个部门的平均薪资,并且结果是按照部门名称排序的。

五、注意事项

  • 选择非聚合列:在 SELECT 子句中,除了聚合函数计算的列外,所有列都应该在 GROUP BY 子句中列出。如果你选择了一个没有包含在
    GROUP BY 中的列,这通常会导致错误,因为没有聚合函数应用于它,数据库不知道如何为每个组选择一个值。
  • NULL 值的分组:在分组时,GROUP BY 会将 NULL 值视为相同的值进行分组。这意味着所有 NULL 值会被归入同一组。
  • 聚合函数的使用:在 SELECT 语句中可以使用多种聚合函数来计算每个组的统计信息,如 SUM()、AVG()、MAX()、MIN() 和 COUNT()。每个聚合函数都有其特定用途,选择合适的聚合函数可以帮助你获得需要的信息。
  • HAVING 子句:如果你需要对分组后的结果进行过滤,应该使用 HAVING 子句而不是 WHERE 子句。WHERE
    子句在数据分组前进行过滤,而 HAVING 子句在数据分组后对分组的结果进行过滤。
  • 性能考虑:GROUP BY 操作可能会涉及大量的数据处理,特别是在处理大型数据集时。合理地选择分组列和优化聚合函数的使用可以帮助提高查询的性能。
  • 分组顺序:在 GROUP BY 子句中列出多个列时,数据首先按照第一个列的值进行分组,然后是第二个列的值,以此类推。分组顺序可能会影响到输出结果的排序,但不会影响到分组聚合的结果。
  • 与ORDER BY共用:虽然 GROUP BY 会对输出结果进行一定的排序(按照分组列排序),但如果你需要特定的排序顺序,应明确使用 ORDER BY 子句。

附:mysql group by 和 having 使用注意事项

 如果一条sql使用了 group by 那么 select  后面可以显示的字段可以有

          1 group by 的字段(多个)

          2 聚合函数, 函数体中字段任意,只要是表中的字段就行,不需要非得是group by 后面的字段

如果需要对分组后的每一组数据做细化的筛选,那么可以在group by 后面接having() 函数,having函数体多为聚合函数 。

特别需要注意的是,group by 分组后,只能显示合法数据,一般都是每一组中的其中一条,违反这个规则, 一定会报语法错误。

举例如下:

现在要查询同一个 task_code下的最大的event_id数据,sql如下

select task_code,max(event_id) from ad_task_event GROUP BY task_code

要查询同一个 task_code下的最大的event_id,并且要event_id>12的数据,只是having() 就要出场了

select task_code,max(event_id) from ad_task_event GROUP BY task_code having(max(event_id)>12)

到此这篇关于数据库中GROUP BY语句详解、示例、注意事项的文章就介绍到这了,更多相关数据库GROUP BY语句详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php后台经常提示无法连接mysql 刷新后又可以访问的解决方法

    php后台经常提示无法连接mysql 刷新后又可以访问的解决方法

    这几天有一台MySQL数据库服务器出现了频繁的掉线情况,通过排查,并没有排查出哪个网站被攻击,百思不得其解中的时候,群里有个朋友说是因为微软KB967723造成的,网上搜索了一下,果然很多人都是这样的问题,都是windows系统下安装的MySQL造成的
    2011-05-05
  • MySQL外键使用详解

    MySQL外键使用详解

    两天有人问mysql中如何加外键,今天抽时间总结一下。mysql中MyISAM和InnoDB存储引擎都支持外键(foreign key),但是MyISAM只能支持语法,却不能实际使用。
    2015-03-03
  • Mysql中LIMIT语句的具体使用

    Mysql中LIMIT语句的具体使用

    本文主要介绍了Mysql中LIMIT语句的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • MySQL的WHERE语句中BETWEEN与IN的使用教程

    MySQL的WHERE语句中BETWEEN与IN的使用教程

    这篇文章主要介绍了MySQL的WHERE语句中BETWEEN与IN的使用教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-12-12
  • 教你如何让spark sql写mysql的时候支持update操作

    教你如何让spark sql写mysql的时候支持update操作

    spark提供了一个枚举类,用来支撑对接数据源的操作模式,本文重点给大家介绍如何让spark sql写mysql的时候支持update操作,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-02-02
  • MySQL OOM 系统二 OOM Killer

    MySQL OOM 系统二 OOM Killer

    前面一节重点分享了Linux的内存分配策略,基于上述的分配策略,为了规避超售的风险,Linux采了一种OOM Killer的机制,即系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存
    2016-07-07
  • MySQL存储文本和图片的方法

    MySQL存储文本和图片的方法

    今天小编就为大家分享一篇关于MySQL存储文本和图片的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • MySQL 数据库常用命令 简单超级实用版

    MySQL 数据库常用命令 简单超级实用版

    MySQL 数据库常用命令,都是一些比较基础的东西,更多的命令可以查看相关文章里面的文字。
    2010-07-07
  • 详解MySQL中数据类型和字段类型

    详解MySQL中数据类型和字段类型

    这篇文章主要为大家详细介绍了MySQL中数据类型和字段类型的使用,文中的示例代码讲解详细,对我们学习MySQL有一定帮助,需要的可以参考一下
    2022-09-09
  • 设置MySQLroot账户密码报错ERROR 1064 (42000): You have an error in your SQL syntax;的解决方案

    设置MySQLroot账户密码报错ERROR 1064 (42000): You 

    在安装mysql的时候,设置root账户密码出现了ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds..错误,本文小编给大家介绍了相关的解决方案,需要的朋友可以参考下
    2023-12-12

最新评论