【SQL】EXISTSの基本構文からよく使うサンプルまで徹底解説!

【SQL】 EXISTSの基本構文から よく使うサンプルまで徹底解説! データベース
スポンサーリンク

はじめに

ぴんくうさぎ
ぴんくうさぎ

最近、SQLの勉強を始めたんだけど、

EXISTSがなかなか理解できないよ〜

みどりがめ
みどりがめ

EXISTS句は初心者が躓きやすい分野の一つだね。

今回はEXISTSの基本から実践例まで解説していくよ!

以下でSQL学習のおすすめUdemy講座を紹介しています。是非、ご覧ください。

EXISTSの基本構文

EXISTS句とは?

EXISTSは、ある条件を満たすデータがデータベース内に存在するかどうかを確認するためのものです。具体的には、別のデータの集合(サブクエリ)が空でない場合に条件が成り立ちます。例えば、「商品IDが5の商品が注文されているかどうかを調べたい」という場合に、EXISTSを使って確認できます。

EXISTS句の特徴と使用例

EXISTS句は「実行結果が存在するかどうかを判定したい」ときに利用します。
exists句はよく下記のような使い方をします。exists句をwhere句の条件として記述し、主問合せ(メインクエリ)のテーブル列を参照する方法が一般的となっています。

このSQLは「テストテーブルのユーザーIDが存在するユーザーのみ取得する」ものです。
詳しく書くと、、

  1. EXISTS句の引数で、testテーブルのデータを抽出しています。(条件:user_idがuserテーブルのデータと一致する)
  2. 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もフォローしていただけると嬉しいです。

コメント