首页 > 解决方案 > GROUP BY 语法 Mysql - 省略可分组的列

问题描述

我有带有 X、Y、Z 列的表 A。

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

现在我正在运行以下查询:

SELECT X, Y
FROM A
GROUP BY X;

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

MySQL 在这种情况下会暴露的行为是规范/标准化的吗?我在哪里可以查到它?

标签: mysqlsqlgroup-bydistinct

解决方案


每一个X都有一个对应的Y

SELECT X, Y FROM A GROUP BY X;

这个查询会起作用吗?

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

  • 如果启用,查询错误:所有非聚合列必须出现在GROUP BY子句中(您需要添加YGROUP BY子句中)

  • 否则,查询将执行,并为您提供一个任意Yfor each X; 但由于Y函数依赖X,因此该值实际上是可预测的,所以这没关系。

GROUP BY通常,尽管 SQL 标准确实承认函数依赖列的概念,但在子句中始终包含所有非聚合列是一种很好的做法。它也是 MySQL 以外的大多数数据库的要求(从 MySQL 5.7 开始,ONLY_FULL_GROUP_BY默认启用)。这也可以防止您陷入各种陷阱和不可预测的行为。

UsingANY_VALUE()使查询对于其目的既有效又明确:

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

请注意,如果您只想要 的不同组合X, Y,则使用起来更简单SELECT DISTINCT

SELECT DISTINCT X, Y FROM A;

推荐阅读