exists句の使い方を解説 SQL入門

exists句とは?

サブクエリ内で実行されたクエリの結果を確認し、
条件に合致するもののみを利用する方法です。

参考文献

SQL初心者の人には、これが一番おすすめの本になると思います。
丁寧な解説から、練習問題も豊富に用意されているので、
これからSQLを使っていくという方には、ぜひ読んでいただきたい本になります。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

書き方

さて、exists句の書き方は、このようになります。

SELECT
    a,
    b,
    c
FROM
    table_A as A
WHERE EXISTS
    (
        SELECT
            d
        FROM
            table_B as B
        WHERE #table_Aのaとtable_Bのdというカラムを比較
            A.a = B.d
    )

サブクエリ内でtable_Bからdというカラムを抽出しました。
そして、table_Aのaとtable_Bのdというカラムを比較して、
同じ値が入っている(table_A.a = table_B.b)行のみ、利用されます。

具体例

先程ご紹介した、書籍が運営しているSQL練習サイトに移動し、
実際にexists句を使ってみましょう。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

対象テーブル

利用するテーブルは"家計簿"と"家計簿アーカイブ"というテーブルです。

家計簿

2013年2月の入出金が記録されているテーブルです。

f:id:gotto50105010:20181124184900p:plain

家計簿アーカイブ

過去の入出金が記録されているテーブルです。

f:id:gotto50105010:20181124184909p:plain

実践

家計簿と家計簿アーカイブテーブルの費目カラムを参照して、
家計簿アーカイブの費目に存在する値が家計簿テーブルに存在すれば利用する。

また、家計簿アーカイブの出金額テーブルを参照し、500円以上の費目を利用する。

この2つの条件を満たすクエリは以下のようになります。

select
    費目,
    出金額
from    
    家計簿アーカイブ as A
where
    exists
    (
        select
            *
        from    
            家計簿 as B
        where   
            出金額 > 500
        and
            A.費目 = B.費目
    )

実行結果

さて、実行結果はこのようになります。

f:id:gotto50105010:20181124184918p:plain

出金額が500円以上かつ、家計簿アーカイブの費目と家計簿の費目を比較して、
家計簿アーカイブの費目に存在する値のみ利用されております。

まとめ

このようにexists句を利用すると、サブクエリ内の結果を参照し、
条件に合致するものを用いて処理することができます。