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语句

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值。




转载请注明:http://www.aierlanlan.com/tzrz/2090.html