GROUP BY 语法 Mysql - 省略可分组的列

GROUP BY Syntax Mysql - Leaving out a groupable column

我有 Table 个包含 X、Y、Z 列的 A。

X是外语,Y是描述。每个 X 都有一个对应的 Y。因此,如果 X 在多个记录中保持不变,则 Y 也保持不变。 所以可能有任意数量的记录 X 和 Y 相同。

现在我运行以下查询:

SELECT X, Y
FROM A
GROUP BY X;

这个查询有效吗? Y 应该与 X 一起分组,但我没有在查询中明确指定它。 MySQL 是否仍然隐含地以这种方式行事?这种行为是 reliable/standardized 吗? 此外,结果是否会根据 Y 的数据类型而有所不同。例如,如果 Y 是 VARCHAR、CHAR 或 INT,会有区别吗?如果是 int,结果会是分组记录的 SUM() 吗?

在这种情况下 MySQL 的行为是否会暴露 normed/standardized 我可以在哪里查找?

Each X has exactly one corresponding Y

SELECT X, Y FROM A GROUP BY X;

Will this query work?

从技术上讲,当您在 MySQL 下 运行 此查询时会发生什么取决于 sql 模式 ONLY_FULL_GROUP_BY 是否启用:

  • 启用后,查询报错:所有非聚合列必须出现在GROUP BY子句中(需要在[=16=中加上Y ] 条款)

  • 否则,查询将执行,并为每个 X 提供 任意 Y;但由于 Y 功能依赖于 X,该值实际上是可以预测的,所以这没问题。

一般来说,虽然 SQL 标准确实承认函数依赖列的概念,但最好始终在 GROUP BY 子句中包含所有非聚合列。这也是除 MySQL 之外的大多数数据库的要求(并且,从 MySQL 5.7 开始,默认情况下启用 ONLY_FULL_GROUP_BY)。这也可以防止您陷入各种陷阱和不可预测的行为。

使用 ANY_VALUE() 使查询既有效又明确其目的:

SELECT X, ANY_VALUE(Y) FROM A GROUP BY X;

请注意,如果您只想要 X, Y 的不同组合,使用 SELECT DISTINCT:

更简单
SELECT DISTINCT X, Y FROM A;

如果 Y 在功能上依赖于 X(取决于所使用的 SQL 模式),您的查询将有效,但如果您试图从中获取不同的 X,Y 对table,不如用DISTINCT。 GROUP BY 旨在与聚合函数一起使用。

所以你应该使用:

SELECT DISTINCT X, Y
FROM A;

您将使用 GROUP BY 的示例案例是聚合函数:

SELECT DISTINCT X, Y, COUNT(*)
FROM A
GROUP BY  X, Y;