所以我试着运行这个简单的代码
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