select sum(ifnull(a,0)) aaa,ifnull(sum(a),0) bbb
from (select g.goodsid a
from goods g
where g.goodsid = 601 ) tmp
#注意 goodsid = 601 的不存在
返回的结果和想象中不同,解释如下
在您SQL查询中,创建了一个子查询(别名为tmp
),该子查询选择了goods
表中goodsid
等于601的记录的goodsid
列。由于注释中提到goodsid = 601
的记录不存在,子查询将不会返回任何行。
现在让我们来分析两个SUM
和IFNULL
的组合表达式:
-
SUM(IFNULL(a, 0)) AS aaa
:- 这个表达式首先对子查询中的每一行执行
IFNULL(a, 0)
,将NULL
值替换为0
。 - 然后,它计算所有行的
a
值(或者替换后的0
)的总和。 - 由于子查询没有返回任何行,
SUM()
函数没有值可以计算,因此aaa
的结果将是NULL
。
- 这个表达式首先对子查询中的每一行执行
-
IFNULL(SUM(a), 0) AS bbb
:- 这个表达式首先尝试计算子查询中所有行的
a
值的总和。 - 由于子查询没有返回任何行,
SUM(a)
的结果将是NULL
。 - 然后,
IFNULL
函数将NULL
替换为0
,因此bbb
的结果将是0
。
- 这个表达式首先尝试计算子查询中所有行的
总结来说,由于子查询没有返回任何行,aaa
将是NULL
,而bbb
将是0
。这是因为SUM(IFNULL(a, 0))
在没有行的情况下会返回NULL
,而IFNULL(SUM(a), 0)
则会将SUM
函数的NULL
结果替换为0
。