千家信息网

group by到底是什么

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,今天给大家介绍一下group by到底是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。本来今天是要接着整理日志系统
千家信息网最后更新 2026年11月04日group by到底是什么

今天给大家介绍一下group by到底是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。

本来今天是要接着整理日志系统的优化的,但是自己对梳理一些名词理解有些欠缺,思来想去还是想讨论下group by语法问题,这个问题我以前举例说明过,脑海里就一致这么认为:在SELECT 列表中所有未包含在组函数中的列都应该是包含在 GROUP BY 子句中的。

验证:


-- ------------------------------ Table structure for mytbl2-- ----------------------------DROP TABLE IF EXISTS `mytbl2`;CREATE TABLE `mytbl2` ( `id` int(11) NULL DEFAULT NULL, `NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `age` int(11) NULL DEFAULT NULL, `dept` int(11) NULL DEFAULT NULL) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ------------------------------ Records of mytbl2-- ----------------------------INSERT INTO `mytbl2` VALUES (1, 'zhangsan', 33, 101);INSERT INTO `mytbl2` VALUES (2, 'li4', 34, 101);INSERT INTO `mytbl2` VALUES (3, 'w5', 34, 102);INSERT INTO `mytbl2` VALUES (4, 'zhao6', 34, 102);INSERT INTO `mytbl2` VALUES (5, 't7', 36, 102);

目的:查询表中年龄最大的员工部门,名字

select `NAME`,dept,MAX(age)from mytbl2 GROUP BY dept;

此条sql看上去语义正确,但逻辑却错误,结果与预想不一致

分析:先找出表中最大年龄,作为临时表,再联查

SELECT *FROM mytbl2 m INNER JOIN (select dept,MAX(age) as maxagefrom mytbl2 GROUP BY dept)ab on ab.dept=m.dept and m.age=ab.maxage;

当然本表因为特殊表,存在单标自关联

1.语法为什么不会报错?

在高版本sql中,本语法是不会报错的

2.但是到底group by语法是怎样的?

查询官网:

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

一开始我考虑是不是版本问题,但实际5.7和8.0是针对此项毫无分别的

It is also possible to have more than one nonaggregate column in the SELECT list when employing ONLY_FULL_GROUP_BY. In this case, every such column must be limited to a single value in the WHERE clause, and all such limiting conditions must be joined by logical AND, as shown here:

在改变sql_mode的情况下,在WHERE子句中,每一个这样的列必须限制为一个值,并且所有这样的限制条件必须由逻辑and连接

正常的sql语句还是select与group by后的字段一致,或者后面跟随函数操作。官网知识提到了sql版本高了语法不会报错,在改变sql_mode的情况下,此语法错误,官网第一句话

SQL-92 and earlier does not permit queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are not named in the GROUP BYclause. For example, this query is illegal in standard SQL-92 because the nonaggregated name column in the select list does not appear in the GROUP BY:

示例:

SELECT o.custid, c.name, MAX(o.payment)  FROM orders AS o, customers AS c  WHERE o.custid = c.custid  GROUP BY o.custid;

group by 的是custid,但是select字段除函数操作外多了个name,this query is illegal,但只强调SQL-92版本,我以为是版本问题,但是SQL8.0与5.7一模一样啊,并没有找到高版本怎么解决这个问题

说起来这个sql_mode吧,我以前的例子提到过改变sql_mode,再执行语法是报错的

设定sql模式 set sql_mode='ONLY_FULL_GROUP_BY';

但其实这样还是不能证明这个问题,因为改动了sql_mode,

群里也讨论了

直到现在我还是不能理解此语法问题,只能说特殊场景会出现数据结果不准确问题,网上说,mysql进行了优化,没有group by的字段会随机返回一条,如果语义无错,就只能是逻辑错误了,所以难道我一开始举的例子并不正确?

以上就是group by到底是什么的全部内容了,更多与group by到底是什么相关的内容可以搜索之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下!

语法 问题 版本 还是 一致 内容 函数 字段 文章 逻辑 错误 最大 特殊 例子 子句 年龄 情况 更多 知识 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 互联网科技公司经营范围 互联网和科技技术 深圳恒合互联网络科技有限公司 互联网公司 科技公司 互联网金融科技平台 蓝色互联网科技 天速互联网络科技有限公司 华服互联网科技官网 互联网科技有哪些公司 互联网在线教育科技创业 互联网企业科技类企业如何做账 中国互联网有什么科技 广东工业互联网大赛深圳学泰科技 江苏互联网智能科技软件 上海创道互联网络科技有限公司 广州有谷有贝互联网科技有限公司 三亚科技创新互联网基地 优雇互联网科技有限公司 东风日产互联网科技公司叫什么 涨乐互联网科技 互联网科技的发展 互联网公司会议桌创意科技软装饰 新兴科技互联网创新大赛颁奖典礼 苏州铭阳互联网科技有限公司 互联网科技大奖都有哪些公司 明优互联网科技有限公司 江苏互联网智能科技软件 厦门江牛科技互联网 同城互联网络科技
0