很多人喜欢把字段默认设置为空,然后用空去判断逻辑。比如select * from t where xx is null.其实这种做法有较大的问题。我们例举一下:如图1
图1
然后我们对不同的列分别聚合一下。如图2.
图2.
每个SQL都是全表查询。但是count的值却不一样。因为null 不计入。所以我们对列建立索引的时候,索引也不包括null。(一般来说都这样)
所以一般where xx is null也基本上用不到索引(极端情况另外再说)。这也就是我说不要用null作为业务判断的原因。
一般数据库都这样。比如MySQL 如图3.
图3
下面看两个存储过程。
如图4,分别执行这两个存储过程。
图4
这个存储过程不是我独创的,主要是说明null既不属于大于0也不属于小于0.
这就是其实我们一般对null 有一个误解。我们一直理解是空。但是实际上理解为 “不确定”更加好一些。如果这样理解,那么我们就不会去在程序中写is null了。