count() without GROUP BY



所以我试着运行这个简单的代码

select COUNT(Ename),BOSS
from EMPLOYEE
WHERE BOSS=7839

但似乎我没有得到输出,除非我使用";分组依据";下面的老板。我不明白为什么我不能在没有";分组依据";。

有人能用外行的话解释吗。非常感谢。

Count是一个聚合函数。当您在旁边使用Count(或任何其他聚合函数,如Count、Sum、Max、Min(进行选择时,则其他列项目必须按分组。如果您仅使用

select COUNT(Ename) -- there is no BOSS
from EMPLOYEE

那么你就不必使用GroupBy。假设你有5列:1-COUNT(Ename(,2-BOSS,3-column3,4-column4,5-column5。然后你将不得不写选择代码如下:

select COUNT(Ename),BOSS, column3, column4, column5
from EMPLOYEE
WHERE BOSS=7839
GROUP BY
BOSS, column3, column4, column5

SELECT COUNT(*) FROM employee WHERE boss=7839应该可以工作。

COUNT()AVG()MIN()MAX()一样,是一个聚合函数:它占用几行,只输出一行。因此,由于一行可以有多个列,其中一列的值由函数建立;在许多行中,为其他每一列选择的值必须以某种方式指定。这通常使用GROUP BY来完成。

如果您询问COUNT(*), name,该请求将无法满足,因为哪个员工的name将跨行返回?第一个员工的?最后一个?一个随机的?——因此会引发一个错误:除非按其分组,否则无法选择字段。一些RDBMS可能允许跳过此规范,并使用前面的任何选项(我认为MySQL使用第一行(来解决歧义。

如果您询问COUNT(*), boss,则请求是可满足的,即使是无用的,因为WHERE条件指定了boss=7389。所以没有歧义。。。这实际上与询问CCD_ 11相同但是RDBMS可能没有足够的洞察力来理解这一点,因为这是一种边缘情况(否则它是合法的SQL,它可能会发生,但除了人为的情况外,它并不常见(;并且可能在一般原理上提出与以前相同的错误。

您可以单独指定COUNT(),也可以请求COUNT(),boss,但后者意味着GROUP BY

COUNT((是一个";聚合函数";,这意味着,与常规函数(可以对每一行进行评估(不同,这些函数等待数据集完成后才能给出答案。SUM((、MIN((、MAX((或者只要它涉及一整列,都是这种情况。

这意味着,在分析数据集时,您不能询问它们的值,因此,不能将它们的结果显示在字段的当前值之外(此处为"老板"(,因为这毫无意义。它们应该显示为数据本身之后的底线。

但是,您可以根据给定的条件进行一些分组,这些分组将对您的表进行排序,然后形成一些子组,每个子组都具有与您在GROUP BY中指定的字段相同的值。这些组都将充当一个小表,您可以在该小表上评估聚合函数。

当我们使用聚合函数时,它返回一个值。在单个查询中使用多个聚合函数也是可以的,但当我们将聚合和正常混合在一起时,就会出现不匹配。如果我们想把它们混合在一起,那么我们需要让其他人通过在组上列

您需要GROUP BY,因为COUNT()是一个聚合函数。实际上,最好的方法是使用HAVING命令:
SELECT COUNT(ename), boss
FROM employee
GROUP BY boss
HAVING boss = 7839

最新更新