MySQL 5.7 及以后版本对 GROUP BY 子句的处理与早期版本有显著区别,主要体现在 SQL 模式的严格性上。
在 MySQL 5.7 之前的版本中,GROUP BY 子句的行为较为宽松:
示例:
-- 在5.7之前可以执行,但name的值不确定
SELECT id, name, COUNT(*) FROM users GROUP BY id;
从 MySQL 5.7 开始,默认启用了 ONLY_FULL_GROUP_BY
SQL 模式,对 GROUP BY 有更严格的要求:
示例:
-- 5.7及以后版本会报错,因为name不在GROUP BY中
SELECT id, name, COUNT(*) FROM users GROUP BY id;
-- 正确写法
SELECT id, name, COUNT(*) FROM users GROUP BY id, name;
sql
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
建议保持 ONLY_FULL_GROUP_BY
模式启用,因为它能确保查询结果的确定性和一致性,避免潜在的数据不一致问题。