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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:22:39