SQL Server - EXISTS

提供: MochiuWiki : SUSE, EC, PCB

2021年6月12日 (土) 23:36時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == 以下の例は、<code>EXISTS</code>句を使用している。<br> <code>WHERE</code>句の後に<code>EXISTS</code>句があり、<code>EXISTS</code>句…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

以下の例は、EXISTS句を使用している。
WHERE句の後にEXISTS句があり、EXISTS句内でSQL文を記述する。

 SELECT * FROM <テーブル名>
 WHERE EXISTS (SELECT * FROM <テーブル名>);


この時、外側のSQL文にあるテーブルとEXISTS句内のSQL文にあるテーブルを結合するかどうかで抽出されるデータが異なる。

  • 結合する場合 (相関副問い合わせ)
    外側のSQL文を実行した後、EXISTS句内のSQL文を実行する。

  • 結合しない場合 (存在判定)
    EXISTS句内のSQL文で値が存在する時、外側のSQL文が実行される。
    EXISTS句内のSQL文で値が存在しない時、外側のSQL文は実行されない。



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

下表に示す2つのテーブルがある。

T_Employeeテーブル
ID Name Alpha
1 鈴木 Suzuki
2 田中 Tanaka
3 佐藤 Sato


T_Salesテーブル
ID Name
2 Orange
4 Apple


以下の例では、EXISTS句内において、T_SalesテーブルのIDとT_EmployeeテーブルのIDで結合している。

 SELECT * FROM T_Employee
 WHERE Alpha LIKE '%a%' AND
 EXISTS
 (
    SELECT 1 FROM T_Sales
    WHERE T_Sales.ID = T_Employee.ID
 );


1行目は、T_Employeeテーブルのレコードを抽出している。
6行目は、T_SalesテーブルのIDとT_EmployeeテーブルのIDで結合している。

EXISTS句内の副問い合わせに、外側のSQL文(主問い合わせ)のT_Employee.IDカラムを使用している。(SQL文は相関副問合せになる)
この場合、外側のSQL文(主問い合わせ)を実行した後、そこで抽出したレコードでEXISTS句内(副問い合わせ)のSQL文を実行する。

5行目のSELECT文の後の項目(1)は使用されない。(任意の値を設定できる)

結果は、以下の通りである。

ID     Name     Alpha
2      田中     Tanaka


まず最初に、外側のSQL文が実行されてT_EmployeeテーブルのAlphaカラムにaがある2行が抽出される。
次に、T_EmployeeテーブルとT_Salesテーブルの両方に存在するIDカラムが2のT_Employeeテーブルのレコードが抽出される。


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

下表に示す2つのテーブルがある。

T_Employeeテーブル
ID Name Alpha
1 鈴木 Suzuki
2 田中 Tanaka
3 佐藤 Sato


T_Salesテーブル
ID Name
2 Orange
4 Apple


EXISTS句内で、上記のT_SalesテーブルでIDカラムを指定する。

 SELECT * FROM T_Employee
 WHERE EXISTS
 (
    SELECT * FROM T_Sales
    WHERE T_Sales.ID = 2
 )
 AND Alpha = 'sato';


1行目は、T_Employeeテーブルのレコードを抽出している。
2~6行目は、EXISTS句のSQL文で、条件でT_SalesテーブルのIDカラムに2を指定している。
この時、EXISTS句内のSQL文を実行した後、レコードが存在する場合は、外側のSQL文が実行される。

結果は、以下の通りである。

ID     Name     Alpha
3      佐藤     Sato


T_SalesテーブルのIDカラムにおいて、2は存在するため、外側のSQL文を実行した後、T_EmployeeテーブルのAlphaカラムのSatoのレコードが抽出される。
例えば、T_SalesテーブルのIDカラムにおいて、5を指定した場合は、外側のSQL文は実行されずにレコードは1件も抽出されない。