MySQL 的 GROUP BY
子句:理解非聚合查询
MySQL 的 GROUP BY
子句在 SELECT
语句中不使用聚合函数时,会表现出独特的行为。 虽然看似允许从分组中省略列,但此功能依赖于一个关键假设:省略的列在每个组中必须具有相同的值。
不确定的结果:遗漏的陷阱
如果省略的列在组内包含不同的值,则结果将变得不可预测。 MySQL 从每组中为省略的列选择任意值。 这意味着输出并不始终可靠。
MySQL 的优化及其启示
MySQL 的优化技术有时允许省略 GROUP BY
中的列以提高性能。 然而,这种优化取决于前面提到的每组内恒定值的假设。 违反这个假设会导致上面讨论的不确定结果。
确保可靠GROUP BY
查询
为了获得可预测且可靠的结果,最佳实践是在 GROUP BY
子句中显式包含所有相关列。或者,如果汇总数据是目标,请使用聚合函数(如 MAX
、MIN
、AVG
、SUM
等)来获得确定性结果。
更具确定性的方法
为了避免隐式 GROUP BY
行为的歧义,请考虑以下替代查询:
<code class="language-sql">SELECT A.* FROM emp AS A WHERE A.salary = ( SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept );</code>
这种方法直接根据每个部门内的最高工资选择行,提供清晰一致的结果。
以上是在没有聚合函数的情况下,MySQL 的'GROUP BY”子句如何表现?的详细内容。更多信息请关注PHP中文网其他相关文章!