MySQL中COUNT(字段='foobar' or null)的内部运行原理是什么
or null在count统计语句中的运行逻辑 你给出的SQL语句如下:
Select columnA, count(columnB = 'foobar' or null) as result from orders group by columnA
这个语法的运行机制可以拆解为3个核心规则来理解:
1. 基础规则前提
count(表达式)的统计逻辑:仅对表达式返回非NULL的行计数,返回NULL的行会直接忽略不计- SQL的布尔运算规则:
OR逻辑只要任意一侧结果为真,整体结果就为真;任意布尔表达式的结果只有TRUE/FALSE两种有效值 - NULL的运算特性:任何和NULL相关的普通逻辑运算,只要不能确定结果为真,最终就返回NULL
2. 不加or null的执行结果
当语句写为count(columnB = 'foobar')时,每一行的表达式返回结果只有TRUE或者FALSE,二者都不属于NULL,所以count会统计分组后的所有行,最终结果和count(*)完全一致,无法实现按条件计数的需求。
3. 加or null后的执行逻辑
加了or null之后,每一行的表达式会按如下规则计算:
- 如果当前行
columnB = 'foobar'判断结果为TRUE:TRUE OR NULL的运算结果为TRUE(非NULL,被count统计) - 如果当前行
columnB = 'foobar'判断结果为FALSE:FALSE OR NULL的运算结果为NULL(被count跳过不统计)
最终得到的result值,就是每组内columnB等于'foobar'的记录总数。
等价写法参考
这种写法是利用SQL特性的简化写法,和下面两种常见写法效果完全一致:
- 全数据库兼容写法:
sum(case when columnB = 'foobar' then 1 else 0 end) as result - 支持
filter语法的数据库(PostgreSQL等)可写为:count(*) filter (where columnB = 'foobar') as result
内容的提问来源于stack exchange,提问作者Kenzzz
相关产品推荐
相关产品推荐

