MySQL 的非标准 GROUP BY 扩展:允许非分组列选择
标准 SQL 语法禁止选择非聚合字段未在聚合查询的 GROUP BY 子句中显式分组。然而,MySQL 却偏离了这个标准,允许这样的选择。
标准 SQL 与 MySQL 的扩展
直到 1992 年,标准 SQL 规范禁止这种行为,确保聚合查询仅返回聚合值或在 GROUP BY 子句中分组的列。
但是,随着发布在 SQL-2003 中,该标准经过修改,允许选择功能上依赖于分组列的列。然而,MySQL 的扩展超越了这个标准,允许选择所有列,而不管它们的功能依赖性如何。
MySQL 扩展的含义
此扩展有几个含义:
MySQL 扩展的动机
MySQL 实现此扩展是为了符合 SQL-2003 标准,同时也解决了上面提到的性能和可维护性问题。然而,他们选择了一种简化的方法,允许选择所有列,而不是实现更复杂的机制来识别功能相关的列。
禁用扩展
如果如果需要,用户可以通过将 sql_mode 设置为 ONLY_FULL_GROUP_BY 来禁用该扩展。这将恢复更严格的 SQL-92 行为,确保在聚合查询中无法选择非分组列。
最新进展
2011 年,PostgreSQL 添加了更多此功能的限制性实现,更接近 SQL 标准。 MySQL 对 GROUP BY 的处理在 5.7 (2015) 版本中得到了进一步改进,纳入了识别函数依赖关系的机制,使其与标准更加一致。
以上是为什么 MySQL 允许在 GROUP BY 查询中使用非分组列?的详细内容。更多信息请关注PHP中文网其他相关文章!