【MySQL】group by在MySQL中使用规则

news2024/9/23 11:20:11

一、group by在MySQL中使用规则

在MySQL中,GROUP BY 子句用于将取自数据库的记录集分组在一起,以便可以对每个组执行聚合函数(如 COUNT(), MAX(), SUM(), AVG() 等)。使用 GROUP BY 时,通常与 SELECT 语句中的聚合函数一起使用,以计算每个组的合计或统计值。

以下是在MySQL中使用 GROUP BY 的一些基本规则:

  1. 选择列表中的每个列:在 SELECT 语句中,除了聚合函数外,所有列都必须在 GROUP BY 子句中指定。

  2. 等价列:如果 SELECT 列表中的列与 GROUP BY 子句中的列完全相同,那么这些列可以省略在 GROUP BY 子句中。

  3. 聚合函数:可以在 SELECT 列表中使用聚合函数,而不需要在 GROUP BY 子句中包含它们。

  4. 分组聚合结果:可以使用 GROUP BY 对聚合函数的结果进行分组。

  5. 排序:即使使用了 GROUP BY,也可以在 ORDER BY 子句中对结果进行排序。

  6. 多列分组:可以在 GROUP BY 子句中使用多个列,以根据多个列的值对结果集进行分组。

  7. 分组空值GROUP BY 子句可以将空值(NULL)视为一个分组。

  8. 分组表达式:可以在 GROUP BY 子句中使用表达式,但这些表达式必须与 SELECT 列表中的表达式相同。

  9. 分组常量:可以在 GROUP BY 子句中使用常量,但这不是一个好的实践,因为它会导致每个分组只返回一个行。

  10. 分组子查询:不能在 GROUP BY 子句中直接使用子查询,但可以在 SELECT 列表中使用子查询。

以下是一个简单的 GROUP BY 使用示例:

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

在这个例子中,我们根据 department 列对员工进行分组,并计算每个部门的平均薪资。

如果你的 SELECT 列表中包含了不在 GROUP BY 子句中的列,MySQL会默认这些列是非聚合列,并且它们在每个组中必须是常数。从MySQL 8.0开始,如果查询包含 GROUP BY 子句,并且 SELECT 列表中包含非聚合列,那么这些非聚合列也必须在 GROUP BY 子句中明确指定。这被称为 “ONLY_FULL_GROUP_BY” SQL模式,它是MySQL 8.0的默认行为。

例如,以下查询在MySQL 8.0或以上版本中会失败,除非启用了 “ONLY_FULL_GROUP_BY” SQL模式:

SELECT department, salary FROM employees GROUP BY department;

要修复这个查询,你需要在 GROUP BY 子句中包含 SELECT 列表中的所有非聚合列:

SELECT department, salary FROM employees GROUP BY department, salary;

或者,你可以使用聚合函数来确保查询有效:

SELECT department, MAX(salary) AS max_salary FROM employees GROUP BY department;

在这个修复后的查询中,我们使用了 MAX() 聚合函数来确保 salary 列在 GROUP BY 子句中得到适当的处理。

二、在使用GROUP BY时,有哪些常见的错误我需要避免?

在使用 GROUP BY 子句时,以下是一些常见的错误和注意事项,你应该避免:

  1. 不包含所有非聚合列
    SELECT 语句中,如果使用了 GROUP BY,那么所有非聚合列必须在 GROUP BY 子句中指定。例如,如果你在 SELECT 列表中使用了 departmentsalary,那么这两个列都必须包含在 GROUP BY 子句中。

  2. GROUP BY 中使用错误的表达式
    如果你在 GROUP BY 子句中使用表达式,确保这些表达式与 SELECT 列表中的表达式完全一致。

  3. 忽略 ONLY_FULL_GROUP_BY SQL模式
    在MySQL 8.0及以上版本中,默认启用了 ONLY_FULL_GROUP_BY 模式,这要求 GROUP BY 子句必须包含 SELECT 列表中所有非聚合列。如果你的查询不符合这个要求,将会失败。

  4. GROUP BY 中使用子查询
    你不能直接在 GROUP BY 子句中使用子查询。如果你需要这样做,可以考虑将子查询重写为连接(JOIN)或者使用聚合函数。

  5. GROUP BY 中使用常量
    虽然可以在 GROUP BY 子句中使用常量,但这通常不是你想要的,因为它会导致每个分组只返回一个行。

  6. GROUP BY 的结果进行排序
    如果你想对 GROUP BY 的结果进行排序,确保使用 ORDER BY 子句,并且排序的列要么是 GROUP BY 子句中的列,要么是聚合函数。

  7. 使用 GROUP BY 子句中的列进行条件过滤
    HAVING 子句中,你可以使用 GROUP BY 子句中的列进行条件过滤,但是不能在 HAVING 子句中使用不在 GROUP BY 中的非聚合列。

  8. 混淆 GROUP BYORDER BY
    GROUP BY 用于逻辑分组,而 ORDER BY 用于物理排序。确保你清楚每个子句的用途,并且正确使用它们。

  9. GROUP BY 中使用别名
    不能在 GROUP BY 子句中直接使用 SELECT 列表中列的别名。必须使用原始列名或表达式。

  10. 过度使用 GROUP BY
    有时候,你可能不需要 GROUP BY,而是可以使用简单的 WHERE 子句来过滤数据。确保你真正需要分组数据时才使用 GROUP BY

  11. 性能问题
    在大型数据集上使用 GROUP BY 可能会导致性能问题,特别是如果没有适当的索引。确保对用于分组的列进行索引,以优化查询性能。

  12. 使用 GROUP BYDISTINCT
    如果你需要对结果进行去重并分组,确保正确使用 DISTINCT 关键字,它应该在 GROUP BY 之前使用。

通过避免这些常见的错误,你可以确保你的 GROUP BY 查询更加准确和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM的基本概念

目录 一、JVM的内存划分 二、JVM的类加载过程 三、JVM的垃圾回收机制(GC) 四、分代回收 一、JVM的内存划分 一个运行起来的Java进程,就是一个Java虚拟机,就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域&…

Maven笔记(一):基础使用【记录】

Maven笔记(一)-基础使用 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有IDE(eclipse、myeclipse、IntelliJ IDEA 等 项目开发工具) 使…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于,UI开发拿来即用,提高开发效率 正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果(用于登录使用&#xf…

【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

(学习记录)使用 STM32CubeMX——GPIO引脚输入配置

STM32F103C8T6的GPIO引脚输入配置 时钟配置 (学习记录)使用 STM32CubeMX——配置时钟(入门)https://blog.csdn.net/Wang2869902214/article/details/142423522 GPIO 引脚输出配置 (学习记录)使用 STM32…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询,非诚勿扰; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结

在macos中, pyenv 是一款用来管理多版本python 的工具, 我们常用的tk图形库是一个独立的工具库,我们在python里面使用的tkinter模块仅是调用这个独立的tk图形库, 所以如果我们希望在python里面使用它, 就必须要先安装t…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去,很不安全,外部可以随意调用 所以取消public,封闭它,我们可以自己书写两个方法,供外部注册与注销,委托调用在子方法里调用,这样封装委托变量可以使它更安全,这个就叫…

金融加密机的定义与功能

金融加密机是一种用于保护金融交易数据和信息安全的重要安全设备。它通过硬件和软件的多重保障,确保金融交易中的敏感数据不被泄露或篡改。以下是关于金融加密机的详细介绍: 一、定义与功能 金融加密机是一种硬件安全设备,通过实现各种密码算…

深度deepin初体验(一)系统详细安装过程 | 国产系统

这里写自定义目录标题 深度deepin初体验(一)系统详细安装过程1.介绍2.安装要求3.环境4.创建虚拟机/系统升级系统选择语言硬盘分区备份文件拷贝系统重启常规设置 深度deepin初体验(一)系统详细安装过程 1.介绍 深度deepin是在debi…

Python开发深度学习常见安装包 error 解决

Python Python 是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库,Python 成为了数据科学、机器学习、网络开发、自动化脚…

气膜馆:新型场馆的盈利之道—轻空间

气膜馆作为一种创新的场馆形式,凭借其先进的技术和灵活的应用,正在快速崛起,展现出广阔的市场前景与丰富的盈利潜力。通过多元化的经营模式,气膜馆为创业者提供了前所未有的商机。本文将深入分析气膜馆的盈利模式及其在市场中的竞…

气膜储煤棚:未来能源管理的新选择—轻空间

在全球对可持续发展与环保的日益重视下,传统的煤炭储存方式面临着诸多挑战。气膜储煤棚应运而生,成为现代煤炭储存的理想解决方案。本文将深入探讨气膜储煤棚的优势与应用,为企业提供新的思路。 先进的技术设计 气膜储煤棚采用创新的气膜技术…

AcWing算法基础课-790数的三次方根-Java题解

大家好,我是何未来,本篇文章给大家讲解《AcWing算法基础课》790 题——数的三次方根。本题考查算法为浮点数二分查找。本文详细介绍了一个使用二分法计算浮点数三次方根的算法。通过逐步逼近目标值,程序能够在给定的区间内精确计算出结果&…

关闭小广告【JavaScript】

在 JavaScript 中实现关闭小广告的功能&#xff0c;可以通过监听点击事件来隐藏广告元素。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport&q…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

如何在Chrome最新浏览器中调用ActiveX控件?

小编最近登陆工商银行网上银行&#xff0c;发现工商银行的个人网银网页&#xff0c;由于使用了ActiveX安全控件&#xff0c;导致不能用高版本Chrome浏览器打开&#xff0c;目前只有使用IE或基于IE内核的浏览器才能正常登录网上银行&#xff0c;而IE已经彻底停止更新了&#xff…

Tile View Kanban Board平铺视图和看板

Goto 数据网格和视图入门 平铺视图&#xff08;TileView 类&#xff09;将数据记录显示为平铺。此视图类型可以以任何自定义方式排列多个元素&#xff08;bound 和 unbound&#xff09;。用户可以按如下方式编辑瓦片&#xff1a; 使用模态 Edit Form。利用 HTML-CSS 平铺模板…

VScode配置连接远程服务器configure ssh Hosts

VScode配置连接远程服务器&#xff0c;具体步骤 一、点击VScode左下脚这两个∟的按钮 二、点击完上面的按钮后&#xff0c;出现如下的下拉选项&#xff0c;选择“Connect to Host” 三、选择“Connect to Host”后&#xff0c;下拉选项会更新&#xff0c;选择“Configure SSH …