我正在学习SQL,对我所接触到的逻辑感到困惑。
我的主要问题是:
d.name
是如何解决的?SQL如何知道我需要将e.DepartmentID
替换为名称d.name
,以匹配group by
d.name
没有在group by
中指定,我的理解是group by
语句必须在查询的选择部分包含d.name
,但我构建的查询在group by
语句中没有d.name
。这是怎么回事?
DB设立
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
1条答案
按热度按时间gwo2fgha1#
这被称为函数依赖。您按部门ID分组,因此每个部门得到一行。在department表中,每个部门只有一行,因此您可以访问departent行的所有值。这就是它在SQL标准中的定义。
某些DBMS不能检测函数依赖关系,并要求您将选择的所有列都放在
GROUP BY
子句中。MySQL不在其中。它支持函数依赖,因此此查询在MySQL中有效。