0

0

mysql如何进行分组查询_mysql group by语法解析

P粉602998670

P粉602998670

发布时间:2026-02-04 03:13:21

|

508人浏览过

|

来源于php中文网

原创

MySQL 8.0+ 要求 GROUP BY 必须包含 SELECT 中所有非聚合字段,否则报错;WHERE 用于行过滤,HAVING 用于分组后过滤;ORDER BY 推荐用别名排序;多字段分组时 NULL 被视为相同值但组合不同。

mysql如何进行分组查询_mysql group by语法解析

GROUP BY 后必须出现 SELECT 中的所有非聚合字段

MySQL 8.0+ 默认启用 sql_mode=ONLY_FULL_GROUP_BY,这意味着如果 SELECT 列表里有非聚合字段(比如 namestatus),它们必须显式出现在 GROUP BY 子句中,否则报错:Expression #1 of SELECT list is not in GROUP BY clause

常见错误写法:

SELECT id, name, COUNT(*) FROM users GROUP BY status;

这在 MySQL 5.7 之前可能“侥幸”通过,但结果不可靠——idname 取的是哪一行的值?MySQL 不保证。8.0+ 直接拒绝执行。

  • 正确做法:把所有非聚合列都放进 GROUP BY,例如 GROUP BY status, name
  • 或改用聚合函数包裹,如 MAX(id)ANY_VALUE(name)(需确认业务逻辑是否允许)
  • 不建议临时关掉 ONLY_FULL_GROUP_BY,它是为了防止隐式歧义而设的

WHERE 和 HAVING 的分工不能颠倒

WHERE 过滤行,HAVING 过滤分组,这是关键区别。很多人误把条件全塞进 HAVING,导致性能下降甚至逻辑错误。

比如查“每种状态的用户数超过 5 人的活跃用户”:

逻辑智能
逻辑智能

InsiderX:打造每个团队都能轻松定制的智能体员工

下载
SELECT status, COUNT(*) AS cnt
FROM users 
WHERE is_active = 1
GROUP BY status
HAVING cnt > 5;
  • is_active = 1 必须放 WHERE:提前过滤,减少参与分组的数据量
  • cnt > 5 必须放 HAVING:因为 cnt 是分组后才计算出的别名,WHERE 看不见它
  • 若把 cnt > 5 错写成 WHERE COUNT(*) > 5,会直接报错:Invalid use of group function

ORDER BY 中引用聚合结果要小心别名和字段位置

GROUP BY 查询中,ORDER BY 可以用列别名、序号或表达式,但不同 MySQL 版本行为略有差异。

例如:

SELECT status, COUNT(*) AS total FROM users GROUP BY status ORDER BY total DESC;
  • 用别名 total 排序是安全且可读的,推荐
  • 用位置序号如 ORDER BY 2 虽然合法,但一旦调整 SELECT 列顺序就容易出错
  • 避免在 ORDER BY 中重复写聚合表达式,比如 ORDER BY COUNT(*),虽然可行,但冗余且难维护
  • 注意:MySQL 允许 ORDER BY 引用未出现在 SELECT 中的字段(只要在 GROUP BY 里),但这种写法依赖隐式分组语义,易引发理解偏差

多字段分组时注意 NULL 值的分组行为

GROUP BY 包含多个字段,且其中某些值为 NULL,MySQL 把所有 NULL 视为“相同”,归入同一组。这和 WHERE col = NULL 永远为 false 不同,但容易被忽略。

例如:

SELECT dept, level, COUNT(*) FROM employees GROUP BY dept, level;
  • 如果 deptlevelNULL,它们各自形成独立的 NULL 组(即 (NULL, 'senior')('tech', NULL)(NULL, NULL) 是三个不同组)
  • 但单个字段为 NULL 的所有行,会全部聚到该字段对应的那个 NULL 组里
  • 若想排除 NULL 再分组,得加 WHERE dept IS NOT NULL AND level IS NOT NULL
  • COALESCE(dept, 'unknown') 替换 NULL 是常见补救手段,但要注意它改变了原始分组语义
实际写 GROUP BY 时,最常卡住的地方不是语法,而是没想清楚“我要按什么维度聚合”和“这个维度的空值代表什么”。这两个问题没理清,后面加再多 HAVINGORDER BY 都只是在掩盖逻辑漏洞。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

669

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

288

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

282

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

516

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

257

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

387

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

535

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

608

2023.08.14

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 821人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号