Mysql 在SQL中理解CASE WHEN语句时遇到问题
在上面的陈述中,那么1是什么?1代表什么? 之后的值“1”如何影响输出Mysql 在SQL中理解CASE WHEN语句时遇到问题,mysql,Mysql,在上面的陈述中,那么1是什么?1代表什么? 之后的值“1”如何影响输出 如果提升为或=2000,则查询将只返回1,否则它将返回NULL(这对于字段的布尔表示完全有用,因为NULL表示0), 现在返回值将设置为计数\u高海拔\u机场首先,请注意这三个表达式是等效的: SELECT state, COUNT(CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END) as count_high_elevation_aiports FRO
如果
提升
为
或=
2000,则查询将只返回1,否则它将返回NULL
(这对于字段的布尔表示完全有用,因为NULL表示0),
现在返回值将设置为
计数\u高海拔\u机场
首先,请注意这三个表达式是等效的:
SELECT state,
COUNT(CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END) as count_high_elevation_aiports
FROM airports
GROUP BY state;
如果高程>=2000,则表达式的计算结果为“1”,否则表达式的计算结果为NULL
“1”通常用作布尔值true,您可以用等效结果替换上述表达式中的MySQL literaltrue
。。。但这不是“1”的意义
与COUNT()
一起使用时,在这种情况下,1
的唯一真正意义在于它不是NULL
这一点很重要,因为与流行的观点相反,COUNT()
不计算行数。它计算值。
有什么区别NULL
在技术上不是一个值。相反,它是一个表示没有值的标记,因此COUNT(expr)
只对expr不为null的行进行计数
通过使用类似于此处的表达式,您要求服务器计算高程=>2000的行,您可以通过为不希望计算的行提供count()
aNULL
来完成此操作。。。和一个非空的行值
对值进行运算——而NULL
,同样不是这种意义上的值
另一个使这一原理更加清晰的聚合函数是AVG()
。如果你有3排。。。值为5、NULL和10。。。平均值是多少?如果你说7.5,那是正确的:这3行的平均值是(5+10)÷2=5,因为这3行只有两个值NULL
不是0,否则平均值将是(5+0+10)÷3=5,而不是
所以,这就是它的工作方式和原因
之后的值“1”如何影响输出
事实并非如此。您也可以很容易地说计数(如果标高>=2000,则为“cat视频有趣”,否则为空结束)
,因为,就像文字1
,文字字符串'cat视频有趣”
也不是空值,非空值——任何非空值——都是计数的值
新手可能会尝试使用计数(高程>=2000)
来完成此任务,但这给出了错误的答案,因为高程<2000的行的0(false)不是null,因此这些行仍然会被计数
然后您可能会问,“为什么不直接使用COUNT(*)…其中高程>=2000
?”这是一个好问题。原因各不相同,但是如果您按状态分组,并且存在没有与WHERE
匹配的行的状态,这些状态将从结果中完全消除,这通常不是您想要的。此查询包含它们,计数为零
请注意,顶部的第三个示例表达式((高程>=2000)或NULL)
,实际上不需要括号。我之所以把它们包括进来,是因为这种形式乍一看不一定是直观的。如果简单地编写高程>=2000或NULL
,操作的自然优先级将导致正确计算。此表达式与其他两个表达式等效,因为elevation>=2000
首先计算为1(如果为真)、0(如果为假)或NULL(如果高程为空)。然后计算优先级较低的或
,得到以下结果之一:1或NULL=>1
<代码>0或NULL=>NULL
NULL或NULL=>NULL
。。。在编写带有计数(高程>=2000或NULL)的查询时,您可能会被互联网长者授予SQL向导徽章。NULL
在这里并不“代表0”,1等同于布尔值true只是巧合。我相信您可能忽略了一个事实,即这里使用了聚合函数,或者可能忽略了其中一个含义。
CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END
IF(elevation >= 2000, 1, NULL)
((elevation >= 2000) OR NULL)