MySQL 对 GROUP BY 的扩展:遵守还是偏离 SQL 标准?
简介
传统上,在 SQL Server 和其他 RDBMS 中,选择非聚合SQL 标准禁止不属于聚合查询中 GROUP BY 子句的列。然而,在 MySQL 中,这种行为偏离了标准,引发了对 MySQL 遵守情况的质疑。
MySQL 的扩展 GROUP BY
在 1992 年之前的 SQL 版本中,标准确实禁止选择未包含在 GROUP BY 子句中的非聚合字段。然而,从 SQL-2003 开始,该标准允许选择功能上依赖于分组列的列。
MySQL 急于实现这一新标准,扩展了 GROUP BY 以允许选择所有列,而不仅仅是那些功能上依赖于分组列的。虽然此扩展符合最新的 SQL 标准,但其实现偏离了预期行为。
MySQL 扩展的后果
允许 SELECT 列表中的所有列,甚至是那些列不依赖于功能,如果非分组依据列在组内包含不同的值,则可能会导致不确定的结果。这种与标准的偏差可能会给用户带来混乱和不可预测的行为。
为了解决这个问题,MySQL 引入了 ONLY_FULL_GROUP_BY sql_mode,它禁用 MySQL 的扩展 GROUP BY 行为并恢复为更严格的 SQL -92 标准。
MySQL 的基本原理和比较其他 RDBMS
MySQL 进行此扩展的基本原理是性能优化。通过允许 SELECT 列表中的所有列,MySQL 可以避免不必要的排序和分组,从而提高性能。
但是,其他 RDBMS,例如 PostgreSQL 和更高版本的 MySQL(5.7)已经实现了更符合标准的方法通过识别函数依赖性并相应地限制 SELECT 列表中的非聚合列。这确保了性能并遵守 SQL 标准。
结论
MySQL 的扩展 GROUP BY 虽然受到 SQL 标准的启发,但偏离了其预期的实现。这种扩展可能会导致不确定的结果,并且需要对函数依赖性有更细致的理解。通过设置 ONLY_FULL_GROUP_BY sql_mode,用户可以恢复到更严格的 SQL-92 行为。 MySQL 的更高版本 (5.7) 改进了 GROUP BY 的处理,以更好地符合标准。
以上是MySQL 的'GROUP BY”扩展符合 SQL 标准还是偏差?的详细内容。更多信息请关注PHP中文网其他相关文章!