RDB, SQL

EXISTSとINの使い分け【SQL】

 

EXISTSとINは場合によって使い分ける。

間違うと遅くなる…🐱

結論として

  • 従属表の選択性が高い場合 → 従属表から先に絞り込むIN
  • 従属表の選択性が低い場合 → 主表から先に絞り込むEXISTS
  • 両方の選択性が低い場合 → EXISTS

本の検索による例

 

世界の本のデータベース
bookを主表、book_categoryを従属表とする

主表 bookテーブル

book_id 名前 発売年 販売数
1 ねこさんと一緒 1990 100000
・・・

 

 

従属表 book_categoryテーブル

book_category_id book_id 大カテゴリ 小カテゴリ
1 1 技術 it
2 20 料理 節約レシピ
・・・

 

 

 

 

EXISTSとINで書いてみる

2001年に100万冊以上売れた本で技術の本でないもの

 

EXISTSで書いた

SELECT
  books.book_id
FROM
  books
WHERE
  books.発売年 = 1990
AND
  books.発売数 > 1000000
EXISTS (
  SELECT
    1
  FROM
    book_category
  WHERE
    books.book_id = book_category.book_id
  AND
    book_category <> 技術
);

主表を絞りこんでから従属表の検索をかける形になる

 

INで書いたもの

SELECT
  books.book_id
FROM
  books
WHERE
  books.book_id IN (
  SELECT
    book_category.book_id
  FROM
    book_category
  WHERE
    book_category <> 技術
)
AND
  books.発売年 = 1990
AND
  books.発売数 > 1000000;

従属表で絞ってから主表を検索する形になる

 

 

2001年に100万冊以上売れた本技術の本でないもの

  • 2001年に100万冊以上売れた本(主表)
    2001年に → 選択性 低
    100万冊以上売れた本 → 選択性 高
  • 技術の本でないもの(従属表)
    →選択性 低

従属表の選択性が低いのでEXISTSを採用🐱

他の例

100万冊以上売れた本かつ技術の本

  • 100万冊売れた本 → 選択性 高
  • 技術のカテゴリー → 選択性 低


従属表をEXISTSで処理

 

2000年に発売した本でおせち料理の本

  • 2000年に発売した本 → 選択性 低
  • おせち料理の本 → 選択性 高


従属表をINで処理

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)