前置:本人测试使用的系统为windows,MySQL版本为5.7+,以下结果可能会受到影响,这里提前说明下。

表结构:

CREATE TABLE `ifnull_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `money1` decimal(10,2) DEFAULT NULL,
  `money2` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

表数据:

idmoney1money2
110.00(Null)
2(Null)-100.00
3150.0010.00

假设我要查询money1大于money2的,并且要把差值计算出来。SQL如下:

SELECT ( money1 - money2 ) AS money,money1,money2 FROM ifnull_test WHERE money1 > money2

但当表中数据存在null的情况下,不管是比较还是计算都会出问题,上面SQL的运行结果为:

moneymoney1money2
140.00150.0010.00

比我们预想的要差很多,按照我们的思维,表中的三条数据都是应该出现在结果中,这就需要用到IFNULL这个SQL函数了:

-- IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL(expression, alt_value)

这时我们就可以加上这个函数完善上面的查询语句:

SELECT ( IFNULL(money1,0) - IFNULL(money2,0) ) AS money,money1,money2 FROM ifnull_test WHERE IFNULL(money1,0) > IFNULL(money2,0)

查询结果:

moneymoney1money2
10.0010.00(Null)
100.00(Null)-100.00
140.00150.0010.00

end!