为何在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执行顺序是错误的,正确的逻辑执行顺序应该是:
FROM(含JOIN):确定要查询的数据源WHERE:过滤行数据GROUP BY:将过滤后的行按照指定字段分组,此时数据已经被拆分成多个组(每个部门一组)- 聚合函数(比如
MAX()):对每个分组内的数据计算聚合值 SELECT:选择要输出的字段(包括聚合结果和分组字段)DISTINCT:去重(如果有)HAVING:过滤分组后的结果ORDER BY:排序结果LIMIT/OFFSET:限制输出行数
你之前的错误在于把SELECT放在了GROUP BY之前,实际上GROUP BY是在SELECT之前执行的,而且分组后聚合函数是针对每个分组单独计算,不是全表计算。所以MAX(Salary)会分别计算每个部门分组里的最高薪资,而不是全表的最大值。
另外,GROUP BY执行时不会随机保留每行,而是把相同DepartmentID的行归为一组,之后聚合函数就基于这些分组进行计算,这就是你能得到每个部门最高薪资的原因。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

