ON / WHEREでの条件ステートメントの適用
ここでは、論理クエリの処理手順について説明しました。
参照:Microsoft®SQL Server™2005 T-SQLクエリの
発行元: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:ONフィルターがVT1に適用されます。<join_condition>
がTRUE である行のみがVT2に挿入されます。
OUTER(結合):(CROSS JOINまたはINNER JOINではなく)OUTER JOINが指定されている場合、一致が見つからなかった1つまたは複数の保持されたテーブルの行が、VT2の行に外部行として追加され、生成されますVT3。FROM句に3つ以上のテーブルが表示される場合、すべてのテーブルが処理されるまで、最後の結合の結果とFROM句の次のテーブルの間にステップ1〜3が繰り返し適用されます。
WHERE:WHEREフィルターはVT3に適用されます。<where_condition>
がTRUE である行のみがVT4に挿入されます。
GROUP BY:VT4からの行は、GROUP BY句で指定された列リストに基づいてグループに配置されます。VT5が生成されます。
CUBE | ROLLUP:スーパーグループ(グループのグループ)がVT5からの行に追加され、VT6が生成されます。
HAVING:HAVINGフィルターはVT6に適用されます。<having_condition>
がTRUE であるグループのみがVT7に挿入されます。
SELECT:SELECTリストが処理され、VT8が生成されます。
DISTINCT:重複する行がVT8から削除されます。VT9が生成されます。
ORDER BY:VT9からの行は、ORDER BY句で指定された列リストに従ってソートされます。カーソルが生成されます(VC10)。
TOP:指定した行数または割合の行がVC10の最初から選択されます。テーブルVT11が生成され、呼び出し元に返されます。
したがって、(INNER JOIN)ONは、WHERE句を適用する前にデータをフィルター処理します(VTのデータカウントはここで削減されます)。後続の結合条件は、パフォーマンスを向上させるフィルター処理されたデータで実行されます。その後、WHERE条件のみがフィルター条件を適用します。
(ON / WHEREで条件ステートメントを適用しても、ほとんどの場合大きな違いはありません。これは、結合したテーブルの数と各結合テーブルで使用可能な行の数によって異なります)