MySQL 的 GROUP BY
子句:没有聚合函数会出现意外结果
SQL 中的 GROUP BY
子句对于数据聚合至关重要。 然而,当 SUM
语句中没有聚合函数(如 AVG
、COUNT
、SELECT
等)使用时,它的行为可能是违反直觉的,尤其是在 MySQL 中。
让我们用一个例子来说明这一点。 考虑一个包含员工数据的表 emp
:
name | dept | salary |
---|---|---|
Jack | a | 2 |
Jill | a | 1 |
Tom | b | 2 |
Fred | b | 1 |
以下查询:
<code class="language-sql">SELECT * FROM emp GROUP BY dept;</code>
可能似乎意味着检索所有不同的部门。 然而MySQL的输出往往是:
name | dept | salary |
---|---|---|
Jill | a | 1 |
Fred | b | 1 |
为什么是吉尔和弗雷德,而不是杰克和汤姆?
MySQL 的 GROUP BY
优化是罪魁祸首。如果没有聚合函数,MySQL 可能会为 GROUP BY
子句中未包含的列选择任意值。 此优化优先考虑速度,假设(在本例中错误)非分组列在每个组内是一致的。
要记住的要点:
GROUP BY
子句中的列时,MySQL 对这些列的值选择是不可预测的。ORDER BY
不保证确定性: 添加 ORDER BY
子句不会使结果在这种情况下具有确定性。这个看似简单的查询凸显了在 GROUP BY
子句中显式包含所有非聚合列的重要性,以确保结果可预测且可靠。 否则,您可能会获得不一致且可能具有误导性的数据。
以上是为什么 MySQL 的 GROUP BY 子句在没有聚合函数的情况下会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!