SQLのEXISTS句のサンプルです。
目次
説明 | exists句とは |
サンプル | テーブルを結合しない場合(存在判定) |
テーブルを結合する場合(相関副問合せ) |
exists句とは
上記は、exists句を使用した図です。
whereの後にexistsがあり、exists内でSQLを記述できます。
この時、外側のSQLにあるテーブルとexists内のSQLにあるテーブルを結合する/しないで抽出されるデータが異なります。
1.結合しない場合、exists内のSQLで値が存在したとき、外側のSQLが実行されます。exists内のSQLで値が存在しないときは、外側のSQLは実行されません。(存在判定)
2.結合した場合、外側のSQLが実行されてexists内のSQLが実行されます。
これは相関副問合せと呼ばれます。
テーブルを結合しない場合(存在判定)
テーブルを結合しない場合のサンプルです。
以下、2つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
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のデータが抽出されます。
関連の記事