我正在学习 SQL 并在 MySQL 中创建了以下数据集:
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');
我想找到每个部门的最高工资,研究了我看到的许多建议MAX
以这种形式运行的文章:
SELECT max(Salary),DepartmentID
FROM Employees
GROUP BY DepartmentID;
但是,鉴于此处答案中描述的操作顺序
FROM, including JOINs
WHERE
SELECT the row obtained by from and where in a temporary area for others
operation (and build the column alias)
DISTINCT
GROUP BY
HAVING
ORDER BY
LIMIT and OFFSET
return the final result
该MAX
函数在 之前调用GROUP BY
,这意味着MAX
将会在执行之前在整个表中工作GROUP BY
,根据我的理解,这应该导致表中存在单个最大值,该最大值应该是6000。然而,事实并非如此,我看到的结果在我想要的正确结构中令人困惑:
max(Salary) DepartmentID
6000 1001
3100 2001
2750 3001
不知怎的,该MAX
函数在 a 之后工作GROUP BY
,但也在由于GROUP BY
删除多个组行而丢失所有行之前工作。
如果我继续这种理解,就会给我带来更多问题。
如果GROUP BY
操作发生在 之前,SELECT
那么GROUP BY
将会删除每个行的所有行,只留下随机选择的DepartmentID
一行,这意味着当函数有机会运行时,它只会看到一个工资值,该值可以是任意值。值而不是每个部门的最大值。MAX
SELECT
我错过了什么使我的理解变得复杂?
诸如 MAX(或 SUM、MIN、COUNT 等)之类的聚合函数将应用于由
GROUP BY
子句创建的集合。在您的示例中,每个部门的工资被分为单独的组,并且 MAX 函数应用于每个组,给出每个部门的最大工资。
当我们评估查询时,我们需要理解的是,在 之前有一个投影,在之后也
group by
有一个投影。group by
在
group by
我们定义要从什么关系进行分组之前。这可能是整个表、投影表(列与最初定义的列不同)、过滤表(where
子句和联接)甚至是临时表(如 (select 1 as foo union select 2 as foo union select 3 as foo
))。GROUP BY
是汇总结果的过程。这意味着默认情况下,在对结果有贡献的记录未完全评估之前,类似MAX()
or的东西(尽管有索引)是不可评估的。MIN()
AVG()
那么,您如何评估某物的 MAX 值,例如:
(伪代码)
这就是你的情况发生的情况。
MAX(yourfield)
标记对于该字段,您需要找出结果集的最大值是多少。如果存在GROUP BY
,那么伪代码将更改为如下所示:因此,记录已取消分组并正在处理中。随着组的建立,单独的聚合值也被分别建立。