关于SQL分组查询中d.name解析及GROUP BY规则的疑问
SQL分组查询核心疑问解答
疑问1:d.name 是如何解析的?SQL如何关联 e.DepartmentID 和 d.name?
因为Departments表的DepartmentID是主键,每个DepartmentID对应唯一的Name值。当你用e.DepartmentID分组时,同一组内的所有员工都属于同一个部门,关联后的d.name在这个组里是唯一确定的——每个DepartmentID只会对应一个部门名称,SQL直接取该分组对应的唯一d.name值,不存在“替换”的逻辑。
疑问2:select包含d.name但group by没指定,为何查询正常运行?
这是因为你的数据库(如MySQL、PostgreSQL 10+等)支持函数依赖判断:d.name完全依赖于group by中的e.DepartmentID——由于Departments.DepartmentID是主键,每个DepartmentID唯一对应一个name,逻辑上分组后的每个组对应的d.name是唯一的,不需要把它加到group by里也能确定取值。
注意:这不是所有SQL数据库都支持的特性,比如严格模式下的旧版MySQL、部分旧版本Oracle会报错,它们要求select里的非聚合字段必须出现在group by中,或能被证明函数依赖于分组字段。
数据库设置
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');
查询语句
select d.name, max(Salary) from Employees e join Departments d on e.departmentID = d.departmentID group by e.DepartmentID
查询结果
name max(Salary) Drs 3100 Accounting 2750 SRO 6000
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

