数据库中isnull函数和sum函数先后顺序的区别

问题

仓库表(store)

storeIdname
1A区
2B区
3C区

库存表(stock)

stockIdnamecountstoreId
1螺丝51
2钉子42
3脚手架42
4衣架42
5铁衣架null2

现要求用sql语句取出每个仓库中的货物数量

SELECT 
SUM(ISNULL(K.count,0)) AS storeNum,
S.storeId
FROM
store AS S
LEFT JOIN
stock AS K
ON S.storeId = K.storeId
GROUP BY
S.storeId

我们使用sum(isnull(k.count,0))是为了将空数据的值返回0,而用上面的语句会发现仓库表中storeId为3的storeNum会为null而不是想象中的0

storeNumstoreId
51
122
null3

而使用

SELECT 
ISNULL(SUM(K.count),0) AS storeNum,
S.storeId
FROM
store AS S
LEFT JOIN
stock AS K
ON S.storeId = K.storeId
GROUP BY
S.storeId

得到的数据却是正常的0

storeNumstoreId
51
122
03

原因

首先,来分析下sum的工作原理,由于sum是在对列进行相加的时候会在对值为null的行跳过,若单独使用sum函数时只有null数据的时候会跳过这些数据返回null,而没有数据进行sum的时候也会返回null,在这个例子中我们用了group by对其进行分组,而仓库表storeId为3的数据与库存表左连接时是没有数据的,所以当我们使用sum(isnull(K.count,0))的时候其实isnull函数没有执行,所以sum函数在进行相加的时候是没有相加的还是会返回null。

结论

所以其实在sum有数据的时候,isnull在sum的外面和isnull在sum的里面是没有区别的,当sum函数没有数据的时候,则需要将isnull函数放在外面防止sum的无数据的时候isnull不起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪蜀黍客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值