一尘不染

不同版本的MySQL Group By功能

sql

以下是一个简单的SQL查询:

SELECT * FROM *table_name*
GROUP BY *column_name*

在我的系统中,我有MySQL 5.5。它工作正常。而在我朋友的系统中,他拥有MySQL 5.7,并且遇到以下错误:

错误1055(42000):SELECT列表的表达式#1不在GROUP
BY子句中,并且包含未聚合的列’testdb.assetentry.entryId’,该列在功能上不依赖于GROUP
BY子句中的列;这与sql_mode = only_full_group_by不兼容

可以清楚地看到这是由于版本不同而发生的。

但是我想知道的是这背后的原因。

谁能解释一下。


阅读 257

收藏
2021-03-10

共1个答案

一尘不染

这不是SQL标准的行为。

12.16.3 MySQL对GROUP BY的处理

要禁用MySQL GROUP BY扩展并启用标准SQL行为,请启用ONLY_FULL_GROUP_BY SQL模式
。在这种情况下,除非包含在聚合函数中,否则不能在选择列表或HAVING子句中使用GROUP BY子句中未命名的列。

看起来在第二台服务器上您具有激活ONLY_FULL_GROUP_BY模式。

SELECT @@sql_mode;

您可以在以下行为上模拟这种行为MySQL 5.5

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';

SELECT *
FROM tab
GROUP BY col;
-- tab.col2' isn't in GROUP BY

**[SqlFiddleDemo](http://sqlfiddle.com/#!9/558433/3/2)**


MySQL 5.7

已经使ONLY_FULL_GROUP_BY SQL模式的实现更加复杂,不再拒绝以前被拒绝的确定性查询。
因此,现在默认情况下启用ONLY_FULL_GROUP_BY,以禁止包含不确定保证在组内唯一确定的表达式的不确定查询。

2021-03-10