ON / WHERE での条件ステートメントの適用
ここでは、論理クエリの処理手順について説明しました。
参照: Inside Microsoft® SQL Server™ 2005 T-SQL Querying
発行元: Microsoft Press
Pub 日付: 2006 年 3 月 7 日
印刷版 ISBN-10: 0-7356-2313-9
印刷版 ISBN-13: 978-0-7356-2313-2
ページ: 640
Microsoft® SQL Server™ 2005 T-SQL クエリの内部
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
他のプログラミング言語と異なる SQL の最初の顕著な側面は、コードが処理される順序です。ほとんどのプログラミング言語では、コードは記述された順序で処理されます。SQL では、処理される最初の句は FROM 句ですが、最初に現れる SELECT 句はほぼ最後に処理されます。
各ステップでは、次のステップへの入力として使用される仮想テーブルが生成されます。これらの仮想テーブルは、呼び出し元 (クライアント アプリケーションまたは外部クエリ) には使用できません。最後のステップで生成されたテーブルのみが呼び出し元に返されます。クエリで特定の句が指定されていない場合、対応するステップは単純にスキップされます。
論理問合せ処理フェーズの簡単な説明
今のところ、手順の説明があまり意味をなさないと思われる場合でも、あまり心配する必要はありません。これらは参照として提供されます。シナリオの例の後のセクションでは、手順についてさらに詳しく説明します。
FROM: FROM 句の最初の 2 つのテーブル間でデカルト積 (クロス ジョイン) が実行され、その結果、仮想テーブル VT1 が生成されます。
ON: VT1 に ON フィルターをかけます。が TRUEである行だけ<join_condition>
が VT2 に挿入されます。
OUTER (結合): OUTER JOIN が指定されている場合 (CROSS JOIN または INNER JOIN とは対照的に)、保存されたテーブルまたは一致が見つからなかったテーブルからの行は、外側の行として VT2 からの行に追加され、 VT3。FROM 句に 3 つ以上のテーブルがある場合、最後の結合の結果と FROM 句の次のテーブルの間で、すべてのテーブルが処理されるまで、手順 1 ~ 3 が繰り返し適用されます。
WHERE: VT3 に WHERE フィルターが適用されます。が TRUEである行だけ<where_condition>
が VT4 に挿入されます。
GROUP BY: VT4 からの行は、GROUP BY 句で指定された列リストに基づいてグループに配置されます。VT5 が生成されます。
キューブ | ROLLUP: VT5 からの行にスーパーグループ (グループのグループ) が追加され、VT6 が生成されます。
HAVING: VT6 に HAVING フィルターが適用されます。が TRUEのグループだけが<having_condition>
VT7 に挿入されます。
SELECT: SELECT リストが処理され、VT8 が生成されます。
DISTINCT: 重複行は VT8 から削除されます。VT9 が生成されます。
ORDER BY: VT9 の行は、ORDER BY 句で指定された列リストに従って並べ替えられます。カーソルが生成されます (VC10)。
TOP: VC10 の先頭から指定された数または割合の行が選択されます。テーブル VT11 が生成され、呼び出し元に返されます。
したがって、(INNER JOIN) ON は、WHERE 句を適用する前にデータをフィルター処理します (ここで VT のデータ数自体が減少します)。後続の結合条件は、パフォーマンスを向上させるフィルタリングされたデータで実行されます。その後、WHERE 条件のみがフィルター条件を適用します。
(ON / WHERE で条件ステートメントを適用しても、いくつかのケースでは大きな違いはありません。これは、結合したテーブルの数と、各結合テーブルで使用可能な行の数によって異なります)