简介
MySQL 对 GROUP BY 的扩展子句允许选择未包含在分组中的列,这引发了有关遵守 SQL 标准的问题。本文探讨了这种偏差的历史背景和影响。
标准
在 SQL-2003 之前,标准做法是禁止选择非聚合不属于 GROUP BY 子句的列。此限制通过消除不明确的分组来确保一致的结果。
MySQL 的扩展
MySQL 引入了一个扩展,允许选择非聚合列,即使它们不属于分组依据。根据 MySQL 文档,这样做是为了通过避免不必要的排序和分组来优化性能。但是,它有一个警告:非聚合值可能是不确定的,这意味着服务器可以从每个组中选择任何值。
标准 SQL 解释
SQL-2003 标准允许选择列表中的非聚合列引用(如果它们在功能上依赖于分组列或包含在聚合参数中)。函数依赖确保对于分组列的每个值,非聚合列都有一个唯一的值。
MySQL 的实现
MySQL 的扩展偏离标准允许选择所有列,即使是那些在功能上不依赖于分组列的列。当非聚合值在组内变化时,这可能会导致意外结果。
MySQL 扩展的后果
MySQL 的实现有两个主要含义:
解决 MySQL 的偏差
MySQL用户可以通过将 sql_mode 设置为 ONLY_FULL_GROUP_BY 来禁用非标准行为。此外,MySQL 5.7 中还引入了改进,以更好地符合标准。 PostgreSQL 9.1 还提供了更严格的实现,严格遵守函数依赖性要求。
以上是MySQL 的非标准 GROUP BY 行为是否违反 SQL 标准?的详细内容。更多信息请关注PHP中文网其他相关文章!