成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

mysql查詢條件not in 和 in的區別及原因說明

瀏覽:2日期:2023-10-07 10:21:14

先寫一個SQL

SELECT DISTINCT from_idFROM codWHERE cod.from_id NOT IN (37, 56, 57)

今天在寫SQL的時候,發現這個查的結果不全,少了NULL值的情況,not in 的時候竟然把null也排除了

用 in 的時候卻沒有包含null

感覺是mysql設計的不合理

因為一直認為in 和 not in 正好應該互補才是,就像這樣查的應該是全部的一樣:

SELECT DISTINCT from_idFROM codWHERE cod.from_id NOT IN (37, 56, 57) or cod.from_id IN (37, 56, 57)

結果正如猜測的那樣,少了個null

后來上網上查了下,有一個解釋挺合理的,即:

null與任何值比較都是false

比如from_id有(37, 56, 57,28,null), not in (37, 56, 57)與28比較時是true,所以結果集中出現28,

null與not in (37, 56, 57)這個條件比較時,結果false,所以不出現在結果集中

補充:MySQL條件查詢IN和NOT IN左右兩側包含NULL值的處理方式

題目

給定一個表 tree,id 是樹節點的編號, p_id 是它父節點的 id 。

+----+------+| id | p_id |+----+------+| 1 | NULL || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 2 |+----+------+

樹中每個節點屬于以下三種類型之一:

葉子:如果這個節點沒有任何孩子節點。

根:如果這個節點是整棵樹的根,即沒有父節點。

內部節點:如果這個節點既不是葉子節點也不是根節點。

寫一個查詢語句,輸出所有節點的編號和節點的類型,并將結果按照節點編號排序。上面樣例的結果為:

+----+------+| id | TYPE |+----+------+| 1 | Root || 2 | INNER|| 3 | Leaf || 4 | Leaf || 5 | Leaf |+----+------+

解釋

節點 ‘1’ 是根節點,因為它的父節點是 NULL ,同時它有孩子節點 ‘2’ 和 ‘3’ 。

節點 ‘2’ 是內部節點,因為它有父節點 ‘1’ ,也有孩子節點 ‘4’ 和 ‘5’ 。

節點 ‘3’, ‘4’ 和 ‘5’ 都是葉子節點,因為它們都有父節點同時沒有孩子節點。

樣例中樹的形態如下:

1 / 2 3 / 4 5

首先先建表

1.建表

CREATE TABLE tree(id INT ,p_id INT )

下面是我的做法:

SELECT id,(CASE WHEN tree.p_id IS NULL THEN ’Root’ WHEN tree.id NOT IN ( -- id不在父結點p_id列時,認為是葉子結點,邏輯上沒有問題! SELECT p_id FROM tree GROUP BY p_id ) THEN ’Leaf’ ELSE ’Inner’END)TYPEFROM tree

我覺得當id不在父結點p_id列時,認為是葉子結點,這在邏輯上完全沒有任何問題,然而事情并沒有這么簡單,查詢結果如下:從id=3開始沒有查到我想要的結果!神奇吧!

mysql查詢條件not in 和 in的區別及原因說明

于是又過了一晚上,終于解決了問題,我先給出正確的做法:

SELECT id,(CASE WHEN tree.p_id IS NULL THEN ’Root’ WHEN tree.id NOT IN ( SELECT p_id FROM tree WHERE p_id IS NOT NULL -- 添加了一句SQL GROUP BY p_id ) THEN ’Leaf’ ELSE ’Inner’END)TYPEFROM tree

mysql查詢條件not in 和 in的區別及原因說明

為什么會這樣呢?

我們都知道

MySQL 中的 IN 運算符用來判斷表達式的值是否位于給出的列表中;如果是,返回值為 1,否則返回值為 0。

NOT IN 的作用和 IN 恰好相反,NOT IN 用來判斷表達式的值是否不存在于給出的列表中;如果不是,返回值為 1,否則返回值為 0。

一般情況下我們都是這樣用的,結果也是我們想要的。但是下面的特殊情況我們卻經常遇到!

(1)in和not in左右兩側都沒有NULL值的情況

【實例1】在 SQL 語句中使用 IN 和 NOT IN 運算符:

mysql> SELECT 2 IN (1,3,5,’thks’),’thks’ IN (1,3,5, ’thks’);+---------------------+---------------------------+| 2 IN (1,3,5,’thks’) | ’thks’ IN (1,3,5, ’thks’) |+---------------------+---------------------------+| 0 | 1 |+---------------------+---------------------------+1 row in set, 2 warnings (0.00 sec)mysql> SELECT 2 NOT IN (1,3,5,’thks’),’thks’ NOT IN (1,3,5, ’thks’);+-------------------------+-------------------------------+| 2 NOT IN (1,3,5,’thks’) | ’thks’ NOT IN (1,3,5, ’thks’) |+-------------------------+-------------------------------+| 1 |0 |+-------------------------+-------------------------------+1 row in set, 2 warnings (0.00 sec)

由結果可以看到,IN 和 NOT IN 的返回值正好相反。

但是忽略了一個NULL值問題

對空值 NULL 的處理

當 IN 運算符的兩側有一個為空值 NULL 時,如果找不到匹配項,則返回值為 NULL;如果找到了匹配項,則返回值為 1。

(2)NULL值在in左右兩側

請看下面的 SQL 語句如下:

mysql> SELECT NULL IN (1,3,5,’thks’),10 IN (1,3,NULL,’thks’);+------------------------+-------------------------+| NULL IN (1,3,5,’thks’) | 10 IN (1,3,NULL,’thks’) |+------------------------+-------------------------+| NULL | NULL |+------------------------+-------------------------+1 row in set, 1 warning (0.00 sec)mysql> SELECT NULL IN (1,3,5,’thks’),10 IN (1,10,NULL,’thks’);+------------------------+--------------------------+| NULL IN (1,3,5,’thks’) | 10 IN (1,10,NULL,’thks’) |+------------------------+--------------------------+| NULL | 1 |+------------------------+--------------------------+1 row in set (0.00 sec)(3)NULL在NOT IN 的其中一側

NOT IN 恰好相反,當 NOT IN 運算符的兩側有一個為空值 NULL 時,如果找不到匹配項,則返回值為 NULL;如果找到了匹配項,則返回值為 0。

請看下面的 SQL 語句如下:

mysql> SELECT NULL NOT IN (1,3,5,’thks’),10 NOT IN (1,0,NULL,’thks’);+----------------------------+-----------------------------+| NULL NOT IN (1,3,5,’thks’) | 10 NOT IN (1,0,NULL,’thks’) |+----------------------------+-----------------------------+| NULL | NULL |+----------------------------+-----------------------------+1 row in set, 1 warning (0.00 sec)mysql> SELECT NULL NOT IN (1,3,5,’thks’),10 NOT IN (1,10,NULL,’thks’);+----------------------------+------------------------------+| NULL NOT IN (1,3,5,’thks’) | 10 NOT IN (1,10,NULL,’thks’) |+----------------------------+------------------------------+| NULL | 0 |+----------------------------+------------------------------+1 row in set (0.00 sec)

根據(3)NULL在NOT IN 的其中一側的結果,這就可以看出問題

先來查詢下面SQL語句,慢慢發現問題

SELECT p_idFROM treeGROUP BY p_id

上面查詢結果包含了NULL值

mysql查詢條件not in 和 in的區別及原因說明

所以查詢下面SQL語句就查不到任何東西,這是因為NOT IN返回了NULL

SELECT id FROM treeWHERE id NOT IN ( SELECT p_id FROM tree GROUP BY p_id )

mysql查詢條件not in 和 in的區別及原因說明

所以要想查詢出來結果就要先把NULL值給處理掉!好了,Bug搞定!

這題還有另外一種做法:

SELECT id,(CASE WHEN tree.p_id IS NULL THEN ’Root’ WHEN tree.id IN ( SELECT p_id FROM tree GROUP BY p_id ) THEN ’Inner’ ELSE ’Leaf’END)TYPEFROM tree

mysql查詢條件not in 和 in的區別及原因說明

為什么是對的?留給大家想想吧~

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲视频免费观看| 亚洲国产精品99久久久久久久久| 欧美福利视频一区| 亚洲成av人片在线观看无码| 一本久道综合久久精品| 欧美激情一区二区在线| eeuss鲁片一区二区三区在线看| 欧美色视频一区| 天天影视色香欲综合网老头| 日韩五码在线| 亚洲丝袜精品丝袜在线| av欧美精品.com| 欧美一区日韩一区| 国模冰冰炮一区二区| 一本一道波多野结衣一区二区| 一区二区三区蜜桃网| 伊人久久大香线蕉综合热线 | 国产91丝袜在线播放0| 欧美丝袜自拍制服另类| 美国av一区二区| 在线观看一区二区视频| 婷婷综合在线观看| 色哟哟在线观看一区二区三区| 亚洲综合色成人| 国产精品一区二区欧美| 亚洲精品成人a在线观看| 99精品久久久| 亚洲香蕉伊在人在线观| 国产视频不卡| 亚洲一卡二卡三卡四卡无卡久久| 一区二区三区|亚洲午夜| 亚洲女厕所小便bbb| 久久99国产精品麻豆| 欧美日韩一区精品| 精品一区二区在线视频| 欧美日韩美女一区二区| 国产在线精品一区在线观看麻豆| 69精品人人人人| 风间由美中文字幕在线看视频国产欧美| heyzo一本久久综合| 久久久www成人免费无遮挡大片| 91网站最新网址| 欧美—级在线免费片| 欧美午夜国产| 亚洲欧美偷拍卡通变态| 国产精品亚洲综合久久| 午夜精品久久久久久久久久| 色婷婷久久久久swag精品| 蜜臀国产一区二区三区在线播放| 在线观看免费视频综合| 久久精品国产在热久久| 91麻豆精品国产| 国产一区二区三区免费播放| 日韩欧美一区二区不卡| av中文一区二区三区| 精品国产免费一区二区三区四区| 91香蕉视频污| 亚洲视频一区在线观看| 久久国产精品一区二区三区| 久久超碰97中文字幕| 精品奇米国产一区二区三区| 欧美日韩在线一二三| 一区二区视频免费在线观看| 看欧美日韩国产| 国产一区二区三区免费看| 精品电影一区二区| 黄色日韩精品| 石原莉奈一区二区三区在线观看 | 久久午夜老司机| 在线成人av| 天堂成人免费av电影一区| 4438x成人网最大色成网站| 99视频超级精品| 亚洲精品乱码久久久久久黑人| 色噜噜狠狠成人中文综合| 国产mv日韩mv欧美| 中文字幕在线视频一区| 久久精品首页| 丁香另类激情小说| 亚洲免费视频中文字幕| 91极品视觉盛宴| 99热精品一区二区| 亚洲午夜日本在线观看| 欧美一区二区三区免费大片 | 亚洲成人在线视频网站| 日韩成人一区二区| 久久综合狠狠综合| 国产精品美女xx| 国产不卡高清在线观看视频| 国产精品久久久久久福利一牛影视| 久久亚洲图片| 99久久久国产精品| 午夜欧美视频在线观看| 欧美一级日韩不卡播放免费| 好吊色欧美一区二区三区视频| 日韩国产精品久久久久久亚洲| 欧美大片顶级少妇| 亚洲欧美日韩综合国产aⅴ| 高清成人在线观看| 一区二区免费视频| 日韩女同互慰一区二区| 国产精品美女黄网| 不卡电影一区二区三区| 亚洲高清中文字幕| 精品999在线播放| 欧美综合二区| 欧美在线观看天堂一区二区三区| 石原莉奈在线亚洲三区| 日本一区二区在线不卡| 欧美视频在线播放| 亚洲国产免费| 国产高清在线精品| 一区二区三区国产精华| 欧美哺乳videos| 狼狼综合久久久久综合网| 欧美在线三区| 精品一区二区三区在线播放 | 久久这里只有精品首页| 免费在线播放第一区高清av| 99视频超级精品| 久久精品99久久久| 综合久久久久久| 日韩欧美国产一区二区在线播放| 久久av免费一区| 亚洲无线一线二线三线区别av| 国产精品一二三四五| 亚洲男帅同性gay1069| 精品国产乱码久久久久久久| 91精品福利视频| 亚洲精品1区2区| 99国产欧美久久久精品| 美女视频黄久久| 一区二区三区高清在线| 精品国产成人系列| 欧美日韩国产一二三| 国产午夜精品一区二区三区欧美| av资源网一区| 久久av老司机精品网站导航| 亚洲乱码日产精品bd| 精品成人在线观看| 欧美日本一区二区在线观看| 国产精品美女久久久| 国产一区在线免费观看| 成人成人成人在线视频| 裸体一区二区三区| 亚洲福利国产精品| 综合在线观看色| 国产亚洲综合在线| 欧美一级二级三级蜜桃| 色一区在线观看| 国产欧美大片| 伊大人香蕉综合8在线视| 99久久精品免费看国产免费软件| 精品一区二区三区在线播放| 日韩电影在线观看电影| 亚洲一区二区在线免费看| 中文字幕日韩一区| 国产日本亚洲高清| 精品国产凹凸成av人网站| 日韩一区二区三区在线观看| 欧美在线一区二区三区| 久久本道综合色狠狠五月| 亚洲三级影院| 国内精品嫩模av私拍在线观看| 欧美呦呦网站| 91在线观看一区二区| 成人黄色在线视频| 丁香婷婷深情五月亚洲| 国模无码大尺度一区二区三区| 久久国产剧场电影| 蜜桃一区二区三区四区| 日韩主播视频在线| 午夜精品久久久久久久99樱桃| 亚洲妇女屁股眼交7| 亚洲成av人片一区二区梦乃| 亚洲综合视频在线| 亚洲综合无码一区二区| 亚洲综合色噜噜狠狠| 亚洲一区中文日韩| 樱花影视一区二区| 亚洲免费在线视频| 亚洲午夜激情av| 午夜精品一区二区三区免费视频| 图片区小说区国产精品视频| 日本成人在线视频网站| 日本视频一区二区三区| 丝袜亚洲另类欧美| 日韩不卡一二三区| 麻豆国产欧美一区二区三区| 美女高潮久久久| 久久99在线观看| 国产一区二区不卡| 国产精品 日产精品 欧美精品| 经典三级一区二区| 国产一区二区三区黄视频| 国产精品一级在线| 92国产精品观看| 欧美日韩三区四区| 亚洲欧洲日韩综合二区| 国产欧美一区二区色老头|