mysql如何更优雅地使用null值

理解NULL值对于SQL新手,NULL值的概念常常会造成混淆,他们常认为NULL与空字符串“”是相同的,然而事实并非如此。例如,下述语句就是完全不同的。mysqlINSERTINTOmy_table(phone)VALUES(NULL);mysqlINSERTINTOmy_table(phone)VALUES();这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串。第1条语句的含义可被解释为“电话号码未知”,而第2条语句的含义可被解释为“该人员没有电话,因此没有电话号码”。在SQL中,NULL值与任何其他值的比较(即使是NULL)永远都不会为“真”。为了进行NULL处理,可使用ISNULL和ISNOTNULL操作符。如,mysqlSELECT*FROMmy_tableWHEREphoneISNULL;使用LOADDATAINFILE读取数据时,对于空的或丢失的列,将用空字符串“”来更新它们。如果希望在列中具有NULL值,应在数据文件中使用\N。使用DISTINCT、GROUPBY或ORDERBY时,所有NULL值将被视为是等同的。使用ORDERBY时,首先将显示NULL值,如果指定了DESC按降序排列,那么NULL值将在最后面显示。对于聚合(累计)函数,如COUNT()、MIN()和SUM(),将忽略NULL值。对此的例外是COUNT(*),它将计数行而不是单独的列值。例如,下述语句会产生两个计数。首先计数表中的行数,其次计数age列中的非NULL值的数目:mysqlSELECTCOUNT(*),COUNT(age)FROMperson;对于某些列类型,MySQL将对NULL值进行特殊处理。如果将NULL值插入TIMESTAMP列,那么将插入当前日期和时间。如果将NULL值插入具有AUTO_INCREMENT属性的整数列,那么将插入序列中的下一个编号。

更好处理null避免异常

(1)使用CASE语句SELECTCASEWHENSUM(size)ISNULLTHEN0ELSESUM(size)ENDINTO

l_sum_volFROMtable_a;(2)使用COALESCE函数SELECTCOALESCE(sum(size),0)FROMtable_aCOALESCE(value,...)函数:返回值为列表当中的第一个非NULL值,在没有非NULL值的情况下返回值将为NULL。(3)使用IFNULL函数SELECTSUM(ifnull(size,0))FROMtable_a;IFNULL(expr1,expr2)函数:假如expr1不为NULL,则IFNULL()的返回值为expr1;否则其的返回值为expr2。IFNULL()的返回值是数字还是字符串取决于其所使用的语境。(4)使用IF函数SELECTSUM(IF(sizeisnull,0,size))AStotalsizeFROMtable_a;IF(expr1,expr2,expr3):如果expr1是TRUE,则IF()的返回值为expr2;否则返回值为expr3。IF()的返回值是数字还是字符串视其所在的语境而定。NULL值可能会导致MySQL的优化变得复杂,所以,一般建议字段应尽量避免使用NULL值。


转载请注明:http://www.aierlanlan.com/cyrz/7980.html