You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在GROUP BY语句中MAX函数能得到正确结果?

关于SQL执行顺序与GROUP BY、聚合函数的误解解答

数据集创建

首先是创建并插入数据的SQL代码:

Create table Departments (DepartmentID int primary key, Name text);

insert into Departments values
(1001,'SRO'),
(2001,'Drs'),
(3001,'Accounting');

Create table Employees 
(
  EmployeeID int not null, 
  DepartmentID int not null,
  ManagerID int,
  Name varchar(50) not null,
  Salary int not null,
  primary key(EmployeeID),
  foreign key (DepartmentID)
    references Departments(DepartmentID)
 );

insert into Employees values
(68319,1001,NULL,'Kayling','6000.00'),
(66928,3001,68319,'Blaze','2750.00'),
(67832,1001,68319,'Clare','2550.00'),
(65646,2001,68319,'Jonas','2957.00'),
(67858,2001,65646,'Scarlet','3100.00'),
(69062,2001,65646,'Frank','3100.00'),
(63679,2001,69062,'Sandrine','900.00'),
(64989,3001,66928,'Adelyn','1700.00'),
(65271,3001,66928,'Wade','1350.00');

查询需求与执行结果

要查询每个部门的最高薪资,执行了以下SQL:

SELECT max(Salary),DepartmentID 
FROM Employees
GROUP BY DepartmentID;

得到正确结果:

max(Salary) DepartmentID
6000        1001
3100        2001
2750        3001

疑问与解答

你之前查到的SQL执行顺序是错误的,正确的逻辑执行顺序应该是:

  1. FROM(含JOIN):确定要查询的数据源
  2. WHERE:过滤行数据
  3. GROUP BY:将过滤后的行按照指定字段分组,此时数据已经被拆分成多个组(每个部门一组)
  4. 聚合函数(比如MAX()):对每个分组内的数据计算聚合值
  5. SELECT:选择要输出的字段(包括聚合结果和分组字段)
  6. DISTINCT:去重(如果有)
  7. HAVING:过滤分组后的结果
  8. ORDER BY:排序结果
  9. LIMIT/OFFSET:限制输出行数

你之前的错误在于把SELECT放在了GROUP BY之前,实际上GROUP BY是在SELECT之前执行的,而且分组后聚合函数是针对每个分组单独计算,不是全表计算。所以MAX(Salary)会分别计算每个部门分组里的最高薪资,而不是全表的最大值。

另外,GROUP BY执行时不会随机保留每行,而是把相同DepartmentID的行归为一组,之后聚合函数就基于这些分组进行计算,这就是你能得到每个部门最高薪资的原因。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:23:34