理解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语句
SELECT
CASE
WHENSUM(size)ISNULLTHEN0
ELSESUM(size)
END
INTO
l_sum_volFROMtable_a;(2)使用COALESCE函数
SELECTCOALESCE(sum(size),0)FROMtable_a
COALESCE(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值。