首頁 > 軟體

mysql中not in隱含陷阱詳解

2022-04-12 19:01:22

1、現象

1.1、使用not int 子查詢

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( SELECT uid FROM role_user )

查詢結果為:

1.2、結果對嗎?

當然不對

1.2.1、查詢一下role_user的uid結果

SELECT uid FROM role_user

查詢結果為:

1.2.2、查詢一下users表的資料

SELECT * FROM `users` 

1.2.3、分析查詢結果

role_user表的資料uid只有一個1和null,所以說應該能查詢到users表的id=2的資料

實際執行的sql為:

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1,null )

但是查詢的結果依然為:

如果我把sql改一下:

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1)

所以可以看到是由於not in 中的結果有null 導致無法查詢出資料的

2、為什麼會產生這樣的結果?

2.1、null屬於什麼?

2.2、not in 的底層實現

SELECT
	* 
FROM
	`users` 
WHERE
	id NOT IN ( 1,null )

not in 多個值的實現原理為

SELECT
	* 
FROM
	`users` 
WHERE
	id != 1
	and id != null

第一反應是不是覺得是符合的啊?users表的id是主鍵,所以說都不為空值啊

但是為什麼會這樣?

我們來執行一個sql

select 1 !=null

可以看到查詢結果為Null,所以說上面的sql裡面的id!=null的結果也是null

由於Null無法參與boolean運算,預設為false,所以說上面的條件中and後面的id!=null永遠是false

3、結論

說明not in中如果值有null,那麼將查詢不到資料

到此這篇關於mysql中not in隱含陷阱的文章就介紹到這了,更多相關mysql not in隱含陷阱內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com