在聚合函数中指定列值与使用WHERE子句

时间:2018-07-31 06:02:17

标签: sql

我有一个数据库people如下所示:

我想计算state='CA'的出现。

我的第一次尝试是:

SELECT COUNT(state='CA')
FROM people 
;

这返回1行,值为1000。所以我认为数据库中有1000个人来自CA。

事实证明这是不正确的。我知道他们是127,我可以通过查询进行验证

SELECT COUNT(*)
FROM people 
WHERE state='CA'
;

返回1行,其值为127。

我了解第二个查询的工作方式。但是,我不明白第一个有什么问题。返回什么?

6 个答案:

答案 0 :(得分:4)

如果要查看发生了什么,请运行查询:

select state='CA' from people;

您将看到在人的每一行都会得到一个结果,值为0或1(或True / False)。您选择的是每一行是否为state ='CA',并且这些结果将与行数一样多。

您不能将COUNT语句约束在该语句中,而必须像第二个示例一样通过WHERE子句来完成。

答案 1 :(得分:2)

count不是一个总和..您的第一个查询是不正确的,因为不返回true或。不为空的行总数

如果要过滤器计数,则必须使用where条件(作为第二个查询),否则必须在sum()函数内使用if或select大小写,例如:

 Select sum(case 
          when state='CA' then 1 else 0
           end) as my_result from People;

或者如果您想计数..请使用null而不是0min计数

 Select count(case 
          when state='CA' then 1 else null
           end) as my_result from People;

答案 2 :(得分:1)

如果您在边数中使用case when,则第一个查询将起作用, 像下面的查询将返回CA的计数

SELECT sum( case when state='CA' then 1 else 0 end)
FROM people

答案 3 :(得分:1)

尝试以下操作:

Select count(case when state='CA' then 1 else null end) as xyz from People;

答案 4 :(得分:1)

在第一个查询中,它将为所有1000行的列状态分配值“ CA”,而不是对值进行过滤。 SELECT就是这样做的。 SELECT不过滤返回的行数,而是修改数据。

WHERE子句中,首先对行进行过滤,然后SELECT子句运行COUNT函数。

有一个运行查询的顺序。它从FROM开始,然后在WHERE的末尾运行GROUP BYORDER BYSELECT

答案 5 :(得分:1)

要回答实际问题-为什么得到1000?我猜数据库中有1000行,或者至少有1000行状态不为null。 Count将返回()中的内容不为null的行数,并且正如您的评论之一所说,()中的部分将返回true或false,都不返回null,因此将全部计数。第二个例子当然是正确的方法。