1. 程式人生 > >淺析mysql中的not in中的結果為空

淺析mysql中的not in中的結果為空

 在使用mysql中發現not in中的結果集並不是in的差集的時候,且not in的結果集是空的..感覺很鬱悶..所以就來找原因,

原因就是not in中不能有null值.

return;

想看原因的往下走...

下圖中:

#1和#3的結果集相同;

#2和#4的結果集不同.其中#2的結果集為空;

#1和#3互為差集;

#2和#4自然就不是差集了....#2是空集.

SELECT a.* from t_car a where a.owner  in (1,2,null);#1
SELECT a.* from t_car a where a.owner not  in (1,2,null);#2
SELECT a.* from t_car a where a.owner  in (1,2);#3
SELECT a.* from t_car a where a.owner not  in (1,2);#4

表t_car

 

 

mysql在解析sql語句的時候,會not in 和 in進行sql內部語法解析.其中

not in    等價於  <>all

in         等價於   =any

select * from t_car where owner <> null;#空結果集
select * from t_car where owner <> 2;#結果集不為空
select * from t_car where owner is not null;#結果集不為空

看上面三條sql中.....當出現   <> 與null進行比較時,所得出的結果集就是空....而<>與非null值(2)進行比較時,就會是正常的結果集..

所以.在mysql的語句解析中,我們可以看到判斷欄位是否為空的條件是

is null和is not null

而我們的in和not in又不會判斷你是否為null,sql

會認為都是有值的,所以會用<>比較.而不是is null 和is not null判斷..

所以,答案就出在這裡了..