SQLの多くの文を選択クエリは、キーワードに基づいており、我々は簡単にSQLクエリのSELECTステートメントが最初に実行されていることを考えることができるように、開始します。しかし、私はこの問題は、ウィンドウ関数によって返される結果をフィルタリングすることができるかどうかが、時間の窓関数であり、最終的には窓関数の実装は、WHERE句とGROUP BY句の後でなければならないと結論付けた何人に説明しようとすると、 、それが再びフィルタウィンドウに関数によって返された結果ではありません。だから私は別の質問を考えた:SQLの実行が何を照会するためには何ですか?
これは彼がSQLクエリの数千人を書いていて、そのうちのいくつかは非常に複雑で、すべての後、非常に良い答えのようです。しかし、実際には、私はまだ正確に何のために言うことは非常に困難ですです。
SQLクエリの実行順序
私は、SQL文の実行のためにそれを調査したので、SELECTは最初に実行されますが、第五ではありません。
上の画像およびSQLのセマンティクスは約照会、あなたはどのようなクエリのリターンを知っているし、次の質問に答えます:
それはGROUP BYの後に使用することができます。1.?(いや、WHERE GROUP BYの前です!)
2.あなたは窓関数が返す行い、結果をフィルタリングすることができますか?(後ではありません、SELECT文でウィンドウ関数、WHEREおよびSELECT GROUP BY)
3.あなたは、GROUP BY ORDER BYに基づくことができるものを行いますか?(缶は、基本的には実行されBY最後のためには、何もORDER BYに基づくことができます)
4.LIMITは、どのような時に実行されますか?(最後に!)
しかし、彼らはより速く、クエリを実行するためにしているため、データベースエンジンは、このためのSQLクエリの実装に厳密に従って必ずしもではないが、いくつかの順序を作るために最適化を実行します。それは、パフォーマンスやクエリとインデックスに関連したものに来るとき言い換えれば、このチャートは適用されません。
ミックス要因:列の別名
あなたはこの構文を使用することができ、多くのSQLの実装があります。
SELECT CONCAT(first_nameの、' '、last_nameの)AS FULL_NAME、数(* ) FROM テーブル GROUP BY FULL_NAME
この文の観点から、それはSELECTで別名を参照しているため、GROUP BYは、SELECTの後に実行されるかのように。しかし、実際には必要性がこの方法ではない、データベースエンジンのクエリは次のように書き換えることができます。
SELECT CONCAT(first_nameの、' '、last_nameの)AS FULL_NAME、数(* ) FROM テーブル GROUP BY CONCAT(first_nameの、' '、LAST_NAME)
これはまだ最初の実装GROUP BYで、別のデータベースエンジンは、原料SELECTを確保するために、一連のチェックを行いますと、クエリが、全体的な実行計画を生成する前にチェックを行いますので、GROUP BYは、有効です。
データベースは、クエリー配列(最適化)を実行しない場合があります
実際には、データベースは必ずしも順番に実行されることはありませんJOIN、WHERE、GROUP BYクエリ、彼らはとてもクエリ実行が速くことを、実行順序を混乱させるために、最適化のシリーズを実施しますので、彼らは変更しないクエリ結果を行います。
あなたは異なる順序でクエリを実行する必要がある理由次の例は示しています。
SELECT * FROM 所有者 LEFT JOINの猫を ON owners.id = cats.owner cats.name = ' トミー'
あなたは名前だけのトミー猫を見つける必要がある場合は、クエリははるかに高速ですので、こと、そして、次の2つのテーブルの左のすべてのデータ接続を実行する必要がありますが、最初の接続前にフィルタリングされなければなりません。そして、このクエリのために、フィルタの最初の実装は、結果を変更しません。そこでここでは最高のデータベースエンジンは、対応する実施計画プログラムを生成し、実行効率の順位に応じて最適化されます。
「世界はそれだけの価値はないと感じ、赤い目にならないでください。」