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つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato
salesテーブル
id name
2 みかん
4 りんご

 

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

select * from employee
where exists (
	select * from sales
	where sales.id = 2)
	and romaji = 'sato';

1行目は、employeeテーブルです。
2~4行目は、existsのSQLです。条件でsalesテーブルのidに2を指定しています。

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

 

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

id name romaji
3 佐藤 sato

salesテーブルにid=2は存在するので外側のSQLが実行されemployeeテーブルのromaji=satoのデータが抽出されます。

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

 

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

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

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

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato
salesテーブル
id name
2 みかん
4 りんご

 

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

select * from employee
where 
    romaji like '%a%'and
    exists (
	select 1 from sales
	where sales.id = employee.id);

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

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

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

 

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

id name romaji
2 田中 tanaka

最初に外側のSQLが実行されemployeeテーブルのromajiにaがある2行が抽出されます。
次にemployeeテーブルとsalesテーブルの両方に存在するid2のemployeeのデータが抽出されます。

関連の記事

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

△上に戻る