MySQL 基礎篇
NULL 無值(no value),它與字段包含 0 、空字符串或僅僅包含空格不同。
數據庫字段允許空值,會遇到一些問題,這裏整理一些 MySQL 設置列允許爲 NULL 帶來的坑。
數據準備:
CREATE TABLE `teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4; insert into `teacher` (`id`, `name`, `age`) values('1','seven','18'); insert into `teacher` (`id`, `name`, `age`) values('2', NULL,'20'); insert into `teacher` (`id`, `name`, `age`) values('3','zhangsan', NULL);
問題一:負向查詢,不能獲取 NULL 值的行
比如查詢 age!=18 的數據,id=3 的數據獲取不到。
SELECT * FROM teacher WHERE age!=18;
NULL 與不匹配在通過過濾選擇出不具有特定值的行時,你可能希望返回具有 NULL 值的行。但是,不行。因爲未知具有特殊的含義,數據庫不知道它們是否匹配,所以在匹配過濾或不匹配過濾時不返回它們。
問題二:通配符不能匹配到列爲 NULL 的數據
比如我們執行如下語句:
SELECT * FROM teacher WHERE name LIKE '%';
注意 NULL 雖然似乎 % 通配符可以匹配任何東西,但有一個例外,即 NULL。即使是 WHERE name LIKE '%' 也不能匹配用值 NULL 作爲姓名的行。
問題三:分組時,NULL 將作爲單獨一個分組返回
如果分組列中具有 NULL 值,則 NULL 將作爲一個分組返回。如果列中有多行 NULL 值,它們將分爲一組。
問題四:聚集函數會忽略列值爲 NULL 的行
比如我們執行如下語句:
數據庫中有三條數據,上面的 SQL 值顯示2條數據。