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。