mysql 无法确定查询逻辑

3qpi33ja  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(86)

我正在学习SQL,对我所接触到的逻辑感到困惑。
我的主要问题是:

  1. d.name是如何解决的?SQL如何知道我需要将e.DepartmentID替换为名称d.name,以匹配group by
  2. 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
gwo2fgha

gwo2fgha1#

这被称为函数依赖。您按部门ID分组,因此每个部门得到一行。在department表中,每个部门只有一行,因此您可以访问departent行的所有值。这就是它在SQL标准中的定义。
某些DBMS不能检测函数依赖关系,并要求您将选择的所有列都放在GROUP BY子句中。MySQL不在其中。它支持函数依赖,因此此查询在MySQL中有效。

相关问题