簡體   English   中英

MySQL-從in in語句中選擇

[英]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.IDBookNULL值引起的。 您可以通過兩種簡單的方法對其進行修復。 第一個是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM