MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
SQL Server - EXISTSのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
SQL Server - EXISTS
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 以下の例は、<code>EXISTS</code>句を使用している。<br> <code>WHERE</code>句の後に<code>EXISTS</code>句があり、<code>EXISTS</code>句内でSQL文を記述する。<br> <br> これは、副問い合わせである。<br> <br> <syntaxhighlight lang="sql"> SELECT * FROM <テーブル名> WHERE EXISTS (SELECT * FROM <テーブル名>); </syntaxhighlight> <br> この時、外部クエリにあるテーブルと<code>EXISTS</code>句内のSQL文にあるテーブルを結合するかどうかで抽出されるデータが異なる。<br> * 結合する場合 (相関副問い合わせ) *: 外部クエリを実行した後、<code>EXISTS</code>句内のSQL文を実行する。 *: <br> * 結合しない場合 (存在判定) *: <code>EXISTS</code>句内のSQL文 (内部クエリ) で値が存在する時、外部クエリが実行される。 *: <code>EXISTS</code>句内のSQL文 (内部クエリ) で値が存在しない時、外部クエリは実行されない。 <br><br> == IN句とEXISTS句の違い == パフォーマンスは、データベースエンジンの最適化機能に依存する。<br> また、インデックスの有無や統計情報によって実行計画が変わる可能性がある。<br> <br> また、多くのデータベースエンジンでは、IN句とEXISTS句を内部的に相互に変換することがある。<br> <br> ==== IN句 ==== サブクエリの結果を全て評価 (全走査) する。<br> <br> サブクエリの結果をメモリ上に一時テーブルとして保持する必要がある。<br> そのため、サブクエリの結果セットが小さい場合に効率的である。<br> <br> <syntaxhighlight lang="tsql"> /* IN句の場合 */ SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'Korea') </syntaxhighlight> <br> ==== EXISTS句 ==== 条件に一致するレコードが見つかった時点で評価を終了する。(Semi-join)<br> <br> 結果セットをメモリに保持する必要がない。<br> そのため、サブクエリの結果が大きい場合に効率的である。<br> <br> <syntaxhighlight lang="tsql"> /* EXISTS句の場合 */ SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM customers c WHERE c.id = o.customer_id AND c.country = 'Japan') </syntaxhighlight> <br> ==== EXPLAIN PLAN (実行計画) ==== EXPLAIN PLANは、クエリがどのように実行されるかを確認するための機能である。<br> <br> EXPLAIN PLANの読み方を以下に示す。<br> * 実行順序 *: 右から左、上から下に読む。 * 矢印の太さ *: データ量の大きさを表す。 * コストの% *: 各操作の相対的なコストを示す。 * 実際の操作 *: Table Scan、Index Seek、Sort等の具体的な処理内容 <br> EXPLAIN PLANにおいて、以下に示す情報を基に、必要に応じてインデックスの作成やクエリの書き換え等のチューニングを行う。<br> * テーブルスキャンの発生 * 適切なインデックスの使用 * 予想される行数 * 高コストな操作 <br> <syntaxhighlight lang="tsql"> /* 一般的な記述 */ SET SHOWPLAN_XML ON; -- または SET SHOWPLAN_TEXT ON; -- または SET STATISTICS PROFILE ON; SELECT * FROM Users WHERE Age > 20; SET SHOWPLAN_XML OFF; -- または SET SHOWPLAN_TEXT OFF; -- または SET STATISTICS PROFILE OFF; </syntaxhighlight> <br> <syntaxhighlight lang="tsql"> /* より詳細な情報が欲しい場合 */ /* I/O情報も含めた詳細な統計情報 */ SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * FROM Users WHERE Age > 20; SET STATISTICS IO OFF; SET STATISTICS TIME OFF; </syntaxhighlight> <br> <syntaxhighlight lang="tsql"> /* クエリを実行せずに実行プランのみ表示する場合 */ /* この場合、Management Studioの実行プランボタン ([Ctrl] + [L]キー) を押下、または */ /* クエリの前にEXPLAINと記述する代わりに実行プランボタンを使用する */ SELECT * FROM Users WHERE Age > 20; GO </syntaxhighlight> <br> -- MySQLの場合 EXPLAIN SELECT * FROM users WHERE age > 20; <br><br> == テーブルを結合する場合 (相関副問い合わせ) == 下表に示す2つのテーブルがある。<br> <center> {| class="wikitable" style="background-color:#fefefe;" |+ T_Employeeテーブル |- ! style="background-color:#66CCFF;" | ID ! style="background-color:#66CCFF;" | Name ! style="background-color:#66CCFF;" | Alpha |- | 1 || 鈴木 || Suzuki |- | 2 || 田中 || Tanaka |- | 3 || 佐藤 || Sato |} </center> <br> <center> {| class="wikitable" style="background-color:#fefefe;" |+ T_Salesテーブル |- ! style="background-color:#66CCFF;" | ID ! style="background-color:#66CCFF;" | Name |- | 2 || Orange |- | 4 || Apple |} </center> <br> 以下の例では、<code>EXISTS</code>句内において、T_SalesテーブルのIDとT_EmployeeテーブルのIDで結合している。<br> <syntaxhighlight lang="sql"> SELECT * FROM T_Employee WHERE Alpha LIKE '%a%' AND EXISTS ( SELECT 1 FROM T_Sales WHERE T_Sales.ID = T_Employee.ID ); </syntaxhighlight> <br> 1行目は、T_Employeeテーブルのレコードを抽出している。<br> 6行目は、T_SalesテーブルのIDとT_EmployeeテーブルのIDで結合している。<br> <br> <code>EXISTS</code>句内の副問い合わせに、外側のSQL文(主問い合わせ)のT_Employee.IDカラムを使用している。(SQL文は相関副問合せになる)<br> この場合、外側のSQL文(主問い合わせ)を実行した後、そこで抽出したレコードで<code>EXISTS</code>句内(副問い合わせ)のSQL文を実行する。<br> <br> 5行目の<code>SELECT</code>文の後の項目(1)は使用されない。(任意の値を設定できる)<br> <br> 結果は、以下の通りである。<br> ID Name Alpha 2 田中 Tanaka <br> まず最初に、外側のSQL文が実行されてT_EmployeeテーブルのAlphaカラムにaがある2行が抽出される。<br> 次に、T_EmployeeテーブルとT_Salesテーブルの両方に存在するIDカラムが2のT_Employeeテーブルのレコードが抽出される。<br> <br><br> == テーブルを結合しない場合 (存在判定) == 下表に示す2つのテーブルがある。<br> <center> {| class="wikitable" style="background-color:#fefefe;" |+ T_Employeeテーブル |- ! style="background-color:#66CCFF;" | ID ! style="background-color:#66CCFF;" | Name ! style="background-color:#66CCFF;" | Alpha |- | 1 || 鈴木 || Suzuki |- | 2 || 田中 || Tanaka |- | 3 || 佐藤 || Sato |} </center> <br> <center> {| class="wikitable" style="background-color:#fefefe;" |+ T_Salesテーブル |- ! style="background-color:#66CCFF;" | ID ! style="background-color:#66CCFF;" | Name |- | 2 || Orange |- | 4 || Apple |} </center> <br> <code>EXISTS</code>句内で、上記のT_SalesテーブルでIDカラムを指定する。<br> <syntaxhighlight lang="sql"> SELECT * FROM T_Employee WHERE EXISTS ( SELECT * FROM T_Sales WHERE T_Sales.ID = 2 ) AND Alpha = 'sato'; </syntaxhighlight> <br> 1行目は、T_Employeeテーブルのレコードを抽出している。<br> 2~6行目は、<code>EXISTS</code>句のSQL文で、条件でT_SalesテーブルのIDカラムに2を指定している。<br> この時、<code>EXISTS</code>句内のSQL文を実行した後、レコードが存在する場合は、外側のSQL文が実行される。<br> <br> 結果は、以下の通りである。<br> ID Name Alpha 3 佐藤 Sato <br> T_SalesテーブルのIDカラムにおいて、2は存在するため、外側のSQL文を実行した後、T_EmployeeテーブルのAlphaカラムのSatoのレコードが抽出される。<br> 例えば、T_SalesテーブルのIDカラムにおいて、5を指定した場合は、外側のSQL文は実行されずにレコードは1件も抽出されない。<br> <br><br> {{#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 page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:SQL_Server]]
SQL Server - EXISTS
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse