MYSQL中NULL空值与空字符串区别详解及代码
NULL
是指没有值
而''
则表示值是存在的,只不过是长度为零
下面我们实际建立一个表来进行测试和区分。
CREATE TABLE `tb_test` (
`name` varchar(255) DEFAULT NULL,
`value` varchar(255) DEFAULT NULL,
`test` char(0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入表中几条数据:
insert into tb_test values('t1',null,null); ##创建一条value为空的数据
insert into tb_test values('t2','',''); ##创建一条为空字符的数据
insert into tb_test values('t2','111','');
insert into tb_test values('t2','111',null);
- 对NULL的判断
select * from tb_test where value is null;
select * from tb_test where ISNULL(value);
查询结果:
select * from tb_test where value is not null;
select * from tb_test where ISNULL(value)=0;
查询结果均为:
- 对空字符串的判断
select * from tb_test where LENGTH(value)=0;
select * from tb_test where value='';
查询结果均为:
select * from tb_test where LENGTH(test)=0;
select * from tb_test where test='';
查询结果均为:
- 同时剔除null 和空字符串
select * from tb_test
where ISNULL(value)=0 and LENGTH(trim(value))>0;
select * from tb_test where value is not null and value <>'';
查询结果均为:
- 对NULL的替换
select name,IFNULL(value,'我是NULL') from tb_test;
select name,COALESCE(value,'我是NULL') from tb_test;
查询结果:
-
在SQL中,NULL值与任何其它值的比较(即使是NULL)永远不会为“真”。
包含NULL的表达式总是会导出NULL值,除非在关于操作符的文档中以及表达式的函数中作了其他规定。下述示例中的所有列均返回NULL:
SELECT NULL, 1+NULL, CONCAT('test',NULL);
查询结果:
如果打算搜索列值为NULL的列,不能使用expr = NULL测试。下述语句不返回任何行,这是因为,对于任何表达式,expr = NULL永远不为“真”:
SELECT * FROM tb_test WHERE value = NULL;
查询结果:
另外MySQL数据库中执行SQL语句,需要小心几个陷阱:
一、空值不一定为空
-
TimesTamp
数据类型如果往这个数据类型的列中插入
Null
值,则其代表的就是系统的当前时间 -
具有auto_increment属性的列
如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列
-
而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。
二、Count等统计函数,在空值上也有特殊的应用
使用DISTINCT
、GROUP BY
或ORDER BY
时,所有NULL值将被视为等同的。
使用ORDER BY
时,首先将显示NULL值,如果指定了DESC按降序排列,NULL值将最后显示。
SELECT * FROM tb_test order by value;SELECT * FROM tb_test order by value desc;
查询结果分别为:
三、对于聚合(累计)函数,如COUNT()、MIN()和SUM(),将忽略NULL值。
对此的例外是COUNT(*)
,它将计数行而不是单独的列值。例如,下述语句产生两个计数。首先计数表中的行数,其次计数value列中的非NULL值数目:
代码如下:
SELECT COUNT(*), COUNT(value) FROM tb_test;
查询结果为: