Mysql查询IFNULL和想象的不一样

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的记录不存在,子查询将不会返回任何行。

现在让我们来分析两个SUMIFNULL的组合表达式:

  1. SUM(IFNULL(a, 0)) AS aaa

    • 这个表达式首先对子查询中的每一行执行IFNULL(a, 0),将NULL值替换为0
    • 然后,它计算所有行的a值(或者替换后的0)的总和。
    • 由于子查询没有返回任何行,SUM()函数没有值可以计算,因此aaa的结果将是NULL
  2. 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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值