MYSQL中NULL空值与空字符串区别详解及代码

本文探讨了SQL中NULL值与空字符串的区别,通过实例展示了如何在数据库中创建表并插入数据,以及如何进行NULL和空字符串的判断与过滤。还介绍了在查询中如何替换NULL值,并讨论了SQL中的NULL处理陷阱,如TimesTamp数据类型和具有auto_increment属性的列。此外,文章提到了COUNT()等统计函数在处理NULL值时的特殊行为,并给出了相关查询示例。
摘要由CSDN通过智能技术生成

NULL是指没有值
''则表示值是存在的,只不过是长度为零

下面我们实际建立一个表来进行测试和区分。

sql

CREATE TABLE `tb_test` (
  `name` varchar(255) DEFAULT NULL,
  `value` varchar(255) DEFAULT NULL,
  `test` char(0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入表中几条数据:

sql

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);

  1. 对NULL的判断

sql

select * from tb_test where value is null;

select * from tb_test where  ISNULL(value);

​ 查询结果:

sql

select * from tb_test where value is not null;

select * from tb_test where  ISNULL(value)=0;

查询结果均为:

  1. 对空字符串的判断

sql

select * from tb_test where LENGTH(value)=0;

select * from tb_test where value='';

查询结果均为:

sql

select * from tb_test where  LENGTH(test)=0;

select * from tb_test where test='';

查询结果均为:

  1. 同时剔除null 和空字符串

sql

select * from tb_test 
where ISNULL(value)=0 and LENGTH(trim(value))>0;

select * from tb_test where value is not null  and value <>'';

查询结果均为:

  1. 对NULL的替换

sql

select name,IFNULL(value,'我是NULL') from tb_test;

select name,COALESCE(value,'我是NULL') from tb_test;

查询结果:

  1. 在SQL中,NULL值与任何其它值的比较(即使是NULL)永远不会为“真”。

    包含NULL的表达式总是会导出NULL值,除非在关于操作符的文档中以及表达式的函数中作了其他规定。下述示例中的所有列均返回NULL:

    sql

    SELECT NULL, 1+NULL, CONCAT('test',NULL);

    查询结果:

如果打算搜索列值为NULL的列,不能使用expr = NULL测试。下述语句不返回任何行,这是因为,对于任何表达式,expr = NULL永远不为“真”:

SELECT * FROM tb_test WHERE value = NULL;

查询结果:

另外MySQL数据库中执行SQL语句,需要小心几个陷阱:

一、空值不一定为空

  1. TimesTamp数据类型

    如果往这个数据类型的列中插入Null值,则其代表的就是系统的当前时间

  2. 具有auto_increment属性的列

    如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列

  3. 而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。

二、Count等统计函数,在空值上也有特殊的应用

使用DISTINCTGROUP BYORDER BY时,所有NULL值将被视为等同的。

使用ORDER BY时,首先将显示NULL值,如果指定了DESC按降序排列,NULL值将最后显示。

sql

SELECT * FROM tb_test order by value;SELECT * FROM tb_test order by value desc;

查询结果分别为:

 

三、对于聚合(累计)函数,如COUNT()、MIN()和SUM(),将忽略NULL值。

​ 对此的例外是COUNT(*),它将计数行而不是单独的列值。例如,下述语句产生两个计数。首先计数表中的行数,其次计数value列中的非NULL值数目:

代码如下:

sql

SELECT COUNT(*), COUNT(value) FROM tb_test;

查询结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值