mysql中not?in隱含陷阱詳解
1、現(xiàn)象
1.1、使用not int 子查詢
SELECT * FROM `users` WHERE id NOT IN ( SELECT uid FROM role_user )
查詢結(jié)果為:

1.2、結(jié)果對(duì)嗎?
當(dāng)然不對(duì)
1.2.1、查詢一下role_user的uid結(jié)果
SELECT uid FROM role_user
查詢結(jié)果為:

1.2.2、查詢一下users表的數(shù)據(jù)
SELECT * FROM `users`

1.2.3、分析查詢結(jié)果
role_user表的數(shù)據(jù)uid只有一個(gè)1和null,所以說(shuō)應(yīng)該能查詢到users表的id=2的數(shù)據(jù)
實(shí)際執(zhí)行的sql為:
SELECT * FROM `users` WHERE id NOT IN ( 1,null )
但是查詢的結(jié)果依然為:

如果我把sql改一下:
SELECT * FROM `users` WHERE id NOT IN ( 1)

所以可以看到是由于not in 中的結(jié)果有null 導(dǎo)致無(wú)法查詢出數(shù)據(jù)的
2、為什么會(huì)產(chǎn)生這樣的結(jié)果?
2.1、null屬于什么?
2.2、not in 的底層實(shí)現(xiàn)
SELECT * FROM `users` WHERE id NOT IN ( 1,null )
not in 多個(gè)值的實(shí)現(xiàn)原理為
SELECT * FROM `users` WHERE id != 1 and id != null
第一反應(yīng)是不是覺(jué)得是符合的???users表的id是主鍵,所以說(shuō)都不為空值啊
但是為什么會(huì)這樣?
我們來(lái)執(zhí)行一個(gè)sql
select 1 !=null

可以看到查詢結(jié)果為Null,所以說(shuō)上面的sql里面的id!=null的結(jié)果也是null
由于Null無(wú)法參與boolean運(yùn)算,默認(rèn)為false,所以說(shuō)上面的條件中and后面的id!=null永遠(yuǎn)是false
3、結(jié)論
說(shuō)明not in中如果值有null,那么將查詢不到數(shù)據(jù)
到此這篇關(guān)于mysql中not in隱含陷阱的文章就介紹到這了,更多相關(guān)mysql not in隱含陷阱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
修改MySQL所有表的編碼或修改某個(gè)字段的編碼步驟詳解
這篇文章主要給大家介紹了關(guān)于修改MySQL所有表的編碼或修改某個(gè)字段編碼的相關(guān)資料,在進(jìn)行數(shù)據(jù)庫(kù)編碼更改之前,需要先確定目標(biāo)編碼格式,常見(jiàn)的編碼格式有UTF-8、GBK等,需要的朋友可以參考下2023-12-12
mysql中insert并發(fā)問(wèn)題(on?DUPLICATE?KEY?UPDATE)
本文主要介紹了mysql中insert并發(fā)問(wèn)題(on?DUPLICATE?KEY?UPDATE),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
MySQL中用通用查詢?nèi)罩菊页霾樵兇螖?shù)最多的語(yǔ)句的教程
這篇文章主要介紹了MySQL中用通用查詢?nèi)罩菊页霾樵兇螖?shù)最多的語(yǔ)句的教程,文中附帶了通用查詢?nèi)罩镜拈_(kāi)啟和清除技巧,需要的朋友可以參考下2015-12-12
MySQL時(shí)區(qū)查看及設(shè)置全過(guò)程
在服務(wù)器環(huán)境下,MySQL默認(rèn)時(shí)區(qū)可能是UTC,需注意應(yīng)用時(shí)區(qū)設(shè)置,若查詢條件使用Now()/sysdate(),會(huì)根據(jù)MySQL時(shí)區(qū)查詢,導(dǎo)致時(shí)間錯(cuò)亂,可使用`selectnow()`檢查時(shí)間準(zhǔn)確性,查看和修改MySQL時(shí)區(qū)的方法包括使用命令和修改配置文件2025-01-01
Mysql深入探索之Explain執(zhí)行計(jì)劃詳析
這篇文章主要給大家介紹了關(guān)于Mysql深入探索之Explain執(zhí)行計(jì)劃的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
MySQL存儲(chǔ)Json字符串遇到的問(wèn)題與解決方法
要在MySQL中存儲(chǔ)數(shù)據(jù),必須定義數(shù)據(jù)庫(kù)和表結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)Json字符串遇到的問(wèn)題與解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
MySQL 數(shù)據(jù)庫(kù)約束、聚合查詢和聯(lián)合查詢使用案例
這篇文章主要介紹了MySQL 數(shù)據(jù)庫(kù)約束、聚合查詢和聯(lián)合查詢使用案例,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08

