我想计算state='CA'
的出现。
我的第一次尝试是:
SELECT COUNT(state='CA')
FROM people
;
这返回1行,值为1000。所以我认为数据库中有1000个人来自CA。
事实证明这是不正确的。我知道他们是127,我可以通过查询进行验证
SELECT COUNT(*)
FROM people
WHERE state='CA'
;
返回1行,其值为127。
我了解第二个查询的工作方式。但是,我不明白第一个有什么问题。返回什么?
答案 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 BY
,ORDER BY
,SELECT
。
答案 5 :(得分:1)
要回答实际问题-为什么得到1000?我猜数据库中有1000行,或者至少有1000行状态不为null。 Count将返回()中的内容不为null的行数,并且正如您的评论之一所说,()中的部分将返回true或false,都不返回null,因此将全部计数。第二个例子当然是正确的方法。