在 MySQL 中,可以选择不包含在聚合函数或 GROUP BY 中的列子句,这可能会让来自其他 SQL 数据库的程序员感到困惑。此行为偏离 ANSI SQL 标准,该标准要求所有选定的列都成为分组的一部分或出现在聚合函数中。
不明确的查询和任意值选择
当MySQL遇到这样的查询时,它会默默地从每个组的列中返回一个任意值,通常是组中第一行或最后一行的值。此行为可能会导致不明确的结果,特别是当非分组列中的值在每个组内不一致时。
示例查询
考虑以下 MySQL 查询:
SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID;
在此查询中,col4 不是 GROUP BY 子句或聚合函数的一部分。 MySQL 将为每个组任意选择一个 col4 值。如果组中的不同行具有不同的 col4 值,这可能会出现问题。
函数依赖性和确定性结果
MySQL 允许在功能正常时选择非分组列取决于 GROUP BY 子句中的列。这意味着对于分组列的每个值,非分组列只有一个可能的值。在这种情况下,查询将返回确定性结果。
但是,需要注意的是,MySQL 对于模糊查询的行为可能会在未来版本中发生变化。因此,建议避免在 SELECT 子句中使用非分组列,除非它们显式包含在 GROUP BY 子句或聚合函数中。
"ONLY_FULL_GROUP_BY" SQL 模式
MySQL 5.7 引入了“ONLY_FULL_GROUP_BY”SQL 模式,该模式强制执行GROUP BY 查询的 ANSI SQL 标准。启用此模式后,选择没有聚合函数的非分组列将导致错误。
以上是为什么 MySQL 允许选择不在 GROUP BY 子句中的列?的详细内容。更多信息请关注PHP中文网其他相关文章!