之前面試的時候面試官問在數據庫中,兩個null是相等的嗎?當時天真的我回答應該是吧,其實null是一個空值,如果非要必要比較的話,兩個null比較應該還是null。在 MySQL 中,NULL 表示不知道的數據。
字段盡可能用NOT NULL,而不是NULL,除非特殊情況。

上圖是《高性能 MySQL》4.1節中對於null值的描述,由此看來,把null改為not null對於提升索引的性能並沒有什么顯著的提升。避免使用null值的目的,是為了代碼的可讀性和可維護性。也為了避免下文出現的一些稀奇古怪的問題。
如下建兩個表t1,t2,其中一個表的name字段允許為空,另一個表的name字段不允許為空,分別為name字段建立索引,SQL語句如下。




1、NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回非空行的結果集 1、NOT IN、!= 等負向條件查詢在有 NULL 值的情況下返回非空行的結果集
比如上例中的 t2,我執行如下 SQL 語句。
SELECT * from t2 where name != '張三'
預期返回id為1的行,結果啥都沒有。
再舉個例子
select * from t2 where name not in (select name from t2 where id!=1)
同樣也是返回空結果集。
2、使用 concat 函數拼接時,首先要對各個字段進行非 NULL 判斷,否則只要任何一個字段為空都會造成拼接的結果為 NULL
比如下面的SQL語句。
SELECT CONCAT("1",NULL);

3、當用count函數進行統計時,NULL 列不會計入統計

