[英]MySQL - Select from with not in statement
我對MySQL有一個非常奇怪的情況。 我有2張桌子。 第一個表具有列ID(主鍵),並具有約560 000行。 第二個表具有IDBook列(來自ID列的第一個表的行),具有約259 000行。
如果我嘗試從第一個表中搜索
SELECT * FROM testovoe_zadanie_poisk_knig.book
where id=66764
然后返回一行。
如果我嘗試從第二張表搜索
SELECT * FROM testovoe_zadanie_poisk_knig.autors
where IDBook=66764
然后返回0行。
沒關系。
但。 如果我執行SQL腳本
SELECT count(b1.id) FROM testovoe_zadanie_poisk_knig.book b1
where b1.id not in (
select IDBook
from `testovoe_zadanie_poisk_knig`.`autors`
)
然后返回0。
為什么?
您的IDBook
列是否具有null
值?
嘗試這個:
SELECT COUNT(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE b1.id NOT IN (
SELECT IDBook
FROM `testovoe_zadanie_poisk_knig`.`autors`
WHERE IDBook IS NOT NULL
)
此問題通常是由autors.IDBook
的NULL
值引起的。 您可以通過兩種簡單的方法對其進行修復。 第一個是:
SELECT count(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE b1.id not in (select a.IDBook
from `testovoe_zadanie_poisk_knig`.`autors` a
where a.IDBook is not NULL
);
第二種是使用`NOT EXISTS:
SELECT count(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE NOT EXISTS (select a.IDBook
from `testovoe_zadanie_poisk_knig`.`autors` a
where b1.id = a.IDBook
);
帶有NULL
值的NOT IN
的語義有點違反直覺。 如果子查詢中的任何值為NULL
,則查詢將顯示“我不知道列表中是否有給定值”。 因此,它返回NULL
,將其視為false。 這是ANSI標准行為,並非特定於MySQL。
NOT EXISTS
表單具有您期望的語義。 如果子查詢中的值為NULL
,則將其忽略。 基於這個原因,我(和其他人)通常建議NOT IN
使用這種類型的比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.