【发布时间】:2010-12-08 04:39:04
【问题描述】:
我有一个表emp,其结构和数据如下:
name dept salary
----- ----- -----
Jack a 2
Jill a 1
Tom b 2
Fred b 1
当我执行以下 SQL 时:
SELECT * FROM emp GROUP BY dept
我得到以下结果:
name dept salary
----- ----- -----
Jill a 1
Fred b 1
服务器根据什么决定返回 Jill 和 Fred 并排除 Jack 和 Tom?
我正在 MySQL 中运行此查询。
注意 1:我知道查询本身没有意义。我正在尝试调试“GROUP BY”场景的问题。我正在尝试了解此目的的默认行为。
注意 2:我习惯于编写与 GROUP BY 子句相同的 SELECT 子句(减去聚合字段)。当我遇到上述行为时,我开始想知道是否可以在以下情况下依赖它: 从 emp 表中选择工资在部门中最低/最高的行。 例如:这样的 SQL 语句适用于 MySQL:
SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept
我没有找到任何描述这种 SQL 为何有效的材料,更重要的是,如果我能始终如一地依赖这种行为。如果这是一个可靠的行为,那么我可以避免这样的查询:
SELECT A.* FROM emp AS A WHERE A.salary = (
SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept)
【问题讨论】:
-
能否请您发布您希望的结果。 GROUP BY 为 GROUP BY 列的每个唯一组合返回一行。由于您仅指定了一列 dept,因此每个部门将仅返回一行。如果您从查询中列出您需要的内容,人们可能会提供更多帮助。
-
告诉我们您的期望,我们将能够为您提供帮助。
-
我的猜测是每组的最后一行
-
请注意,在基于 MVCC 的数据库上,行顺序会重新洗牌,如果您更新第一行,第一行可以成为最后一行
-
我在问题的“备注”部分提供了其他信息。