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;
我有 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 correspondingY
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;