SQL EXISTS句のサンプル(存在判定/相関副問合せ)

SQLのEXISTS句のサンプルです。

目次

説明 exists句とは
サンプル テーブルを結合しない場合(存在判定)
  テーブルを結合する場合(相関副問合せ)

exists句とは

上記は、exists句を使用した図です。

whereの後にexistsがあり、exists内でSQLを記述できます。

この時、外側のSQLにあるテーブルとexists内のSQLにあるテーブルを結合する/しないで抽出されるデータが異なります。

1.結合しない場合、exists内のSQLで値が存在したとき、外側のSQLが実行されます。exists内のSQLで値が存在しないときは、外側のSQLは実行されません。(存在判定)

2.結合した場合、外側のSQLが実行されてexists内のSQLが実行されます。
これは相関副問合せと呼ばれます。

テーブルを結合しない場合(存在判定)

テーブルを結合しない場合のサンプルです。

以下、2つのテーブルがあるとします。
1つめのsyainテーブルです。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

2つめのsalesテーブルです。

salesテーブル
id name
2 みかん
4 りんご

SQL文

exits句内で、上記のsalesテーブルでidを指定します。

select * from syain
where exists (
	select * from sales
	where sales.id = 2)

1行目は、syainテーブルです。
4行目は、salesテーブルのidに2を指定しています。

この場合、exists句内のSQLを実行した結果、データが存在した場合、外側のSQLが実行されます。

結果

結果は、以下のとおりです。

id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

salesテーブルにid=2は存在するので外側のSQLが実行されsyainテーブルの全件数が抽出されます。

仮にid=5と指定した場合は、外側のSQLは実行されず、何も抽出されません。

テーブルを結合する場合(相関副問合せ)

テーブルを結合する場合のサンプルです。

以下、2つのテーブルがあるとします。
1つめのsyainテーブルです。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

2つめのsalesテーブルです。

salesテーブル
id name
2 みかん
4 りんご

SQL文

exits句内で、上記のsalesテーブルのidとsyainテーブルのidで結合します。

select * from syain
where exists (
	select 1 from sales
	where sales.id = syain.id)

1行目は、syainテーブルです。
4行目は、salesテーブルのidとsyainテーブルのidで結合しています。

exists句内(副問い合わせ)の中に外側のSQL(主問い合わせ)の項目(syain.id)があります。
→SQLは相関副問合せになります。

この場合、外側のSQL(主問い合わせ)を実行し、そこで取得した行でexists句内(副問い合わせ)のSQLを実行します。
3行目のselectの後の項目は使用されません。任意の値を設定できます。1はよく使われます。

結果

結果は、以下のとおりです。

id name romaji
2 田中 tanaka

syainテーブルとsalesテーブルの両方に存在するid2のsyainのデータが抽出されます。

関連の記事

SQL 副問合せのサンプル(サブクエリ)
SQL 相関副問合せのサンプル(相関サブクエリ)

△上に戻る