Null是表示一种“未知”的类型,除了SQL已定义的数据类型外其余都是“未知”的类型。sql
Null不支持大小/相等判断express
Null是“未知”类型,既然“未知”类型,那就没法判断一个未知类型或一个已知类型与一个未知类型是否相等或大或小。因而下面这个sql语句返回的是NULL函数
select null > 0; select null < 0; select null = 0;
判读是不是Null的方式是使用is null 或者 is not nullcode
select 1 is not null;
[not] in 与 Null排序
例如:x not in (1,2,null) 等价于 x !=1 and x!=2 and x!=null 由于null与任何值比较都返回null因此一旦in后面的货号里有null值则整个查询结果都为null.io
相反的若是是x in (1,2,null),则等价因而x=1 or x=2 or x=null,同理这种状况null会被忽略.select
Null与排序与比较sql语句
在排序时可使用coalesce函数将Null转换成0,coalesce的功能:数据类型
COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即中止并返回该值。若是全部的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。方法
例如coalesce(age, 0)这样就能够将age为null的默认转换成0. 排序时若是排序字段为null则会排在最前面,若是不想让这些null值记录排在前面,就可使用coalesce函数消除null:
select * from user order by coalesce(age,0)
同理在比较的大小的时候也能够这样作,若是业务里Null等价于0(或者其余值)则能够用coalesce转换一下,例如:
select * from good where coalesce(price,0) > 55.5; select * from user where coalesce(age,0) in (,10,20,30);
被 0 除
除数为0是一个很是 egg-painfull 的错误。昨天还运行得好好的SQL,忽然被0除一会儿就出错了。一个经常使用的解决方法是先用 case 语句判断分母(denominator)是否为0,再进行除法运算。这种方式其实很难看,并且分母被重复使用了。若是是简单的状况还好,若是分母是个很复杂的表达式,那么悲剧就来了: 很难读,很难维护和修改,一不当心就是一堆BUG. 这是就可使用null来解决,由于null除任何数都是null,因此可使用nullif函数将能够能为0的值转出null(若是须要还能够再使用coalesce函数将null再转成其余值)
select coalesce(total_sales/nullif(num_users, 0), 0);