【问题标题】:MySQL Group By functionality in different versionMySQL Group By 不同版本的功能
【发布时间】:2016-08-28 20:43:50
【问题描述】:

下面是一个简单的 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 不兼容

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

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

谁能解释一下。

【问题讨论】:

    标签: mysql sql aggregate-functions mysql-error-1055


    【解决方案1】:

    首先请阅读Group by clause in mySQL and postgreSQL, why the error in postgreSQL?

    这不是 SQL 标准行为。

    12.16.3 MySQL Handling of 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 现在是 默认启用,禁止非确定性查询包含 不保证表达式在组内是唯一确定的。

    【讨论】:

    • ONLY_FULL_GROUP_BY 在 5.7 上默认启用(这是一件好事,但会破坏很多旧的 MySQL 应用程序)
    • @MichaelBerkowski 谢谢,我添加了这个来回答
    • @LukaszSzozda 你能解释一下为什么它不能在最新版本的 MySQL 8.0 中工作吗?
    • @sunil MySQL 8.0 默认也启用了 ONLY_FULL_GROUP_BY。您需要编写一个查询,其中所有列都在GROUP BY 中定义或使用聚合函数包装。
    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2022-06-14
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多