为什么我们需要GROUP BY和AGGREGATE FUNCTIONS?

dav*_*ine 21 sql

我看到一个例子,其中有一份员工名单(表格)及其各自的月薪.我做了一笔工资,并在ouptput中看到完全相同的表!那很奇怪.

以下是必须要做的事情 - 我们必须找出这个月我们支付多少钱作为员工工资.为此,我们需要在数据库中汇总他们的工资金额,如图所示 -

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID
Run Code Online (Sandbox Code Playgroud)

我知道如果我不在上面的代码中使用group by,我会收到错误.这是我不明白的 -

我们从employee表中选择employeeid.SUM()被告知它必须从Employee表中添加MonthlySalary列.因此,它应该直接添加这些数字而不是将它们分组然后添加它们.

这是一个人如何做到这一点 - 查看员工表并添加所有数字.为什么他会麻烦地把它们分组然后加起来?

Abe*_*ler 49

如果您将GROUP BY视为"为每个人",为了便于解释,可能会更容易.查询如下:

SELECT empid, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID
Run Code Online (Sandbox Code Playgroud)

说:

"给我每个 empid 的MonthlySalary的总和"

所以如果你的表看起来像这样:

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|2    |300         |
+-----+------------+
Run Code Online (Sandbox Code Playgroud)

结果:

+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
Run Code Online (Sandbox Code Playgroud)

Sum似乎不会做任何事情,因为一个数字的总和就是那个数字.另一方面,如果它看起来像这样:

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|1    |300         |
+-----+------------+
|2    |300         |
+-----+------------+
Run Code Online (Sandbox Code Playgroud)

结果:

+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Run Code Online (Sandbox Code Playgroud)

然后它会因为有两个empid 1来总结.不确定这个解释是否有帮助,但我希望它能让事情变得更加清晰.


Mar*_*ers 7

如果你想要添加所有数字,你将没有GROUP BY:


SELECT SUM(MonthlySalary) AS TotalSalary
FROM Employee
Run Code Online (Sandbox Code Playgroud)
+-----------+
|TotalSalary|
+-----------+
|777400     |
+-----------+
Run Code Online (Sandbox Code Playgroud)

GROUP BY的要点是您为每位员工单独获得总额.

+--------+------+
|Employee|Salary|
+--------+------+
|John    |123400|
+--------+------+
|Frank   |413000|
+--------+------+
|Bill    |241000|
+--------+------+
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

可悲的是,有一个数据库支持您建议的语法:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee
Run Code Online (Sandbox Code Playgroud)

但是,MySQL 并没有按照您的预期执行。它返回每个人的 MonthlySalary 的总和,以及一个任意的 EmployeeId。唉。

您的问题是关于 SQL 语法的。答案是 SQL 是如何定义的,并且不会改变。从SELECT子句中确定聚合字段并非不合理,但这不是这种语言的定义方式。

不过,我对这个问题有一些同情。许多学习 SQL 的人认为“分组”是在对行进行排序的上下文中完成的。类似于“对美国的城市进行排序并在输出中按州对它们进行分组”。说得通。但是 SQL 中的“分组依据”实际上意味着“汇总依据”而不是“保持在一起”。