MYSQL中NULL空值與空字符串區別詳解及代碼


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

  1. 對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;

查詢結果均為:

  1. 對空字符串的判斷
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='';

查詢結果均為:

  1. 同時剔除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 <>'';

查詢結果均為:

  1. 對NULL的替換
select name,IFNULL(value,'我是NULL') from tb_test;

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

查詢結果:

  1. 在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語句,需要小心幾個陷阱:

一、空值不一定為空

  1. TimesTamp數據類型

    如果往這個數據類型的列中插入Null值,則其代表的就是系統的當前時間

  2. 具有auto_increment屬性的列

    如果往這屬性的列中插入Null值的話,則系統會插入一個正整數序列

  3. 而如果在其他數據類型中,如字符型數據的列中插入Null的數據,則其插入的就是一個空值。

二、Count等統計函數,在空值上也有特殊的應用

使用DISTINCTGROUP BYORDER 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;

查詢結果為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM