淺析mysql中的not in中的結果為空
阿新 • • 發佈:2018-10-31
在使用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判斷..
所以,答案就出在這裡了..