はじめに
最近、SQLの勉強を始めたんだけど、
EXISTSがなかなか理解できないよ〜
EXISTS句は初心者が躓きやすい分野の一つだね。
今回はEXISTSの基本から実践例まで解説していくよ!
以下でSQL学習のおすすめUdemy講座を紹介しています。是非、ご覧ください。
EXISTSの基本構文
EXISTS句とは?
EXISTS
は、ある条件を満たすデータがデータベース内に存在するかどうかを確認するためのものです。具体的には、別のデータの集合(サブクエリ)が空でない場合に条件が成り立ちます。例えば、「商品IDが5の商品が注文されているかどうかを調べたい」という場合に、EXISTS
を使って確認できます。
EXISTS句の特徴と使用例
EXISTS句は「実行結果が存在するかどうかを判定したい」ときに利用します。
exists句はよく下記のような使い方をします。exists句をwhere句の条件として記述し、主問合せ(メインクエリ)のテーブル列を参照する方法が一般的となっています。
このSQLは「テストテーブルのユーザーIDが存在するユーザーのみ取得する」ものです。
詳しく書くと、、
- EXISTS句の引数で、testテーブルのデータを抽出しています。(条件:user_idがuserテーブルのデータと一致する)
- 1で取得した条件に合致するデータをuserテーブルから取得しています。
SELECT user_id FROM user u
WHERE EXISTS (SELECT * FROM test t WHERE u.user_id = t.user_id);
上記の例を見ていただけると納得いただけると思いますが、
EXISTS句の引数はサブクエリを取ります。言い換えるのならば、行の集合(表)です。
これはEXISTS句のみが持つ特徴ですので、意識しておくと良いでしょう。
また、EXISTS句の戻り値は真偽値(true、false、unknown)です。あくまでWHERE句の条件と指定するものです。
EXISTS句の使い方
存在判定
EXISTS句の中では、clubテーブルにidが2のものがあるか判定しています。この判定がtrueの場合、外側のSQLが実行されます。
ユーザーテーブルのnameがNULLではないカラムが抽出されます。
SELECT * FROM user
WHERE EXISTS (
SELECT * FROM club
where club.id = 2)
and name IS NOT NULL;
相関副問い合わせ
一番よく使う書き方です。冒頭で例として挙げたSQLが該当するので、再掲します。
外側の最終的に取得するテーブルをA、EXISTS句内のテーブルをBとすると、「Bにも存在するAのデータを取ってくる」と表現できます。
SELECT user_id FROM user u
WHERE EXISTS (SELECT * FROM test t WHERE u.user_id = t.user_id);
二重否定(NOT EXISTS)を使う
EXISTS句は否定系で使う方がシンプルになる場面も多いと思います。
SQLの条件が複雑になると思ったら、二重否定文に変換してみましょう。
たとえばこんな感じです。
「全ての教科が70点以上の生徒」
↓
「70点未満の教科が一つも存在しない生徒」
これをNOT EXISTSで表現すると、、
SELECT DISTINCT st_id FROM test t1
WHERE NOT EXISTS (
SELECT * FROM test t2
where t1.st_id = t2.st_id)
and t2.score < 70);
全ての行が当てはまる→一つも当てはまらないの変換がポイントです。
終わりに
本記事はここまでとなります。ご覧いただきありがとうございました。
ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです。
コメント