为什么使用 GROUP BY 的 SQL 查询会产生更多的行?

Sab*_*ncu 4 mysql sql greatest-n-per-group

我有下表:

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

当我运行以下查询时:

SELECT id, MAX(rev) maxrev, content
FROM YourTable
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

我得到:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
| 2    |    1     | ...                                  |
+------+----------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除 GROUP BY 子句如下:

SELECT id, MAX(rev) maxrev, content
FROM YourTable;
Run Code Online (Sandbox Code Playgroud)

我得到:

+------+----------+--------------------------------------+
| id   | maxrev   | content                              |
+------+----------+--------------------------------------+
| 1    |    3     | ...                                  |
+------+----------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

这对我来说是违反直觉的,因为期望 GROUP BY 会通过消除重复值来减少结果数量。但是,在上述情况下,引入 GROUP BY 则相反。这是因为 MAX() 函数,如果是,如何?

PS:该表基于此处的 SO 问题:SQL select only rows with max value on a column。我试图理解这个问题的答案,在这个过程中,遇到了上述情况。

编辑:

我使用其 MySQL 5.6 引擎在 sqlfiddle.com 上获得了上述结果,没有自定义/配置。

Eas*_*ier 5

它根据您的 GROUP BY 子句使用您的 MAX() 函数。因此,对于您的第一个查询,您是说:Give me the maximum rev for each id,而第二个只是说 Give me the maximum rev in general

感谢 xQbert:

但这意味着你所得到的在后一种情况下,最大转速。它将从选择中的任何地方获取值用于您的 id 和内容字段。

您可以在此处阅读有关 SQL 如何处理 GROUP BY 语句的更多信息: 文档

  • 我喜欢关于此的文档:“在这种情况下,服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的,这可能不是您想要的。此外,选择添加 ORDER BY 子句不会影响每个组的值”它很好地解释了这一点:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html (2认同)
  • @easttonbornemeier 嘘!!!当您完全理解 mySQL 扩展时,有机会使用它们可以提高性能!例如,如果我知道所有按列分组的值都是相同的,那么引擎就没有将它们分组的开销,并且选择一个并不重要。由于引擎不必分组,因此减少了开销。这是一个有目的的功能;但很少正确使用;因此默认值被更改的原因。(在您更新的答案的最后一行结束评论) (2认同)