MySQL – 选择不在分组依据中的列

本教程将介绍MySQL - 选择不在分组依据中的列的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

MySQL - 选择不在分组依据中的列 教程 第1张

问题描述

我正在尝试将功能添加到预先存在的应用程序中,我遇到了一个类似这样的 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;

好的,所以有一些聚合函数.您可以选择 personID,因为您正在按它进行分组.但它也会选择不在聚合函数中且不属于 GROUP BY 子句的列.这怎么可能???它只是选择一个随机值,因为每个组的值肯定不是唯一的吗?

我来自哪里(MSSQL Server),这是一个错误.有人可以向我解释这种行为以及为什么它在 MySQL 中是允许的吗?

推荐答案

确实,这个特性允许一些不明确的查询,并且默默地返回一个从该列中选择的任意值的结果集.在实践中,它往往是首先物理存储的组内行中的值.

如果您只选择在功能上依赖于 GROUP BY 条件中的列的列,则这些查询不会有歧义.换句话说,如果定义组的每个值只能有一个模糊"列的不同值,则没有问题.此查询在 Microsoft SQL Server(和 ANSI SQL)中是非法的,即使它在逻辑上不会导致歧义:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

此外,MySQL 有一个 SQL 模式,使其符合标准:ONLY_FULL_GROUP_BY

FWIW,SQLite 也允许这些模棱两可的 GROUP BY 子句,但它从组中的 行中选择值.

至少在我测试的版本中.意味着 MySQL 或 SQLite 将来可能会改变它们的实现,并有一些不同的行为.因此,在这种模棱两可的情况下,您不应依赖当前的行为方式.最好将您的查询重写为确定性而不是模棱两可.这就是 MySQL 5.7 现在默认启用 ONLY_FULL_GROUP_BY 的原因.

好了关于MySQL - 选择不在分组依据中的列的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。