「SQL Server - EXISTS」の版間の差分
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
(→概要) |
||
2行目: | 2行目: | ||
以下の例は、<code>EXISTS</code>句を使用している。<br> | 以下の例は、<code>EXISTS</code>句を使用している。<br> | ||
<code>WHERE</code>句の後に<code>EXISTS</code>句があり、<code>EXISTS</code>句内でSQL文を記述する。<br> | <code>WHERE</code>句の後に<code>EXISTS</code>句があり、<code>EXISTS</code>句内でSQL文を記述する。<br> | ||
<br> | |||
これは、副問い合わせである。<br> | |||
<br> | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT * FROM <テーブル名> | SELECT * | ||
FROM <テーブル名> | |||
WHERE EXISTS (SELECT * FROM <テーブル名>); | WHERE EXISTS (SELECT * FROM <テーブル名>); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
この時、外部クエリにあるテーブルと<code>EXISTS</code>句内のSQL文にあるテーブルを結合するかどうかで抽出されるデータが異なる。<br> | |||
* 結合する場合 (相関副問い合わせ) | * 結合する場合 (相関副問い合わせ) | ||
*: | *: 外部クエリを実行した後、<code>EXISTS</code>句内のSQL文を実行する。 | ||
*: <br> | *: <br> | ||
* 結合しない場合 (存在判定) | * 結合しない場合 (存在判定) | ||
*: <code>EXISTS</code> | *: <code>EXISTS</code>句内のSQL文 (内部クエリ) で値が存在する時、外部クエリが実行される。 | ||
*: <code>EXISTS</code> | *: <code>EXISTS</code>句内のSQL文 (内部クエリ) で値が存在しない時、外部クエリは実行されない。 | ||
<br><br> | <br><br> | ||
2024年11月26日 (火) 20:29時点における版
概要
以下の例は、EXISTS
句を使用している。
WHERE
句の後にEXISTS
句があり、EXISTS
句内でSQL文を記述する。
これは、副問い合わせである。
SELECT *
FROM <テーブル名>
WHERE EXISTS (SELECT * FROM <テーブル名>);
この時、外部クエリにあるテーブルとEXISTS
句内のSQL文にあるテーブルを結合するかどうかで抽出されるデータが異なる。
- 結合する場合 (相関副問い合わせ)
- 外部クエリを実行した後、
EXISTS
句内のSQL文を実行する。
- 外部クエリを実行した後、
- 結合しない場合 (存在判定)
EXISTS
句内のSQL文 (内部クエリ) で値が存在する時、外部クエリが実行される。EXISTS
句内のSQL文 (内部クエリ) で値が存在しない時、外部クエリは実行されない。
テーブルを結合する場合 (相関副問い合わせ)
下表に示す2つのテーブルがある。
ID | Name | Alpha |
---|---|---|
1 | 鈴木 | Suzuki |
2 | 田中 | Tanaka |
3 | 佐藤 | Sato |
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つのテーブルがある。
ID | Name | Alpha |
---|---|---|
1 | 鈴木 | Suzuki |
2 | 田中 | Tanaka |
3 | 佐藤 | Sato |
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件も抽出されない。