3

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

SELECT * FROM *table_name*
GROUP BY *column_name*

在我的系统中,我有 MySQL 5.5。它工作得很好。而在我朋友的系统中,他有 MySQL 5.7,他收到以下错误:

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

很明显,这种情况正在发生,因为版本不同。

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

任何人都可以解释一下。

4

1 回答 1

5

首先,请阅读mySQL 和 postgreSQL 中的 Group by 子句,为什么 postgreSQL 中的错误?

这不是 SQL 标准行为。

12.16.3 MySQL 对 GROUP BY 的处理

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

看起来在第二台服务器上你有激活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


MySQL 5.7开始:

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

于 2016-05-03T17:14:59.530 回答