WHERE句でGROUP BYおよびHAVINGを使用すると、SQLクエリの実行シーケンスと混同されます。どちらが最初に実行されますか?シーケンスは何ですか?
WHERE句でGROUP BYおよびHAVINGを使用すると、SQLクエリの実行シーケンスと混同されます。どちらが最初に実行されますか?シーケンスは何ですか?
回答:
順番に:
FROM&JOIN s行の決定とフィルタリング
WHERE行の追加のフィルター
GROUP BYはそれらの行をグループに結合します
HAVINGフィルターグループ
ORDER BYは残りの行/グループを配置します残りの行/グループの
LIMITフィルター
SET SHOWPLAN_ALL ON
SQLサーバーの完全なシーケンスは次のとおりです。
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
したがって、上記のリストから、次の実行シーケンスを簡単に理解できますGROUP BY, HAVING and WHERE
。
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
ここでONは結合の後に来て、selectが最初に来ます、何か説明はありますか?
FROM
最初に評価され、その後ON
も同様に評価されます。
WHEREが最初で、次にクエリの結果をGROUPします。最後に、少なくともHAVING句を使用して、グループ化された結果をフィルタリングします。これは「論理的」な順序であり、これが技術的にエンジンにどのように実装されているかはわかりません。
マティアスが言ったように、それはエンジンに実装されていると思います:WHERE、GROUP BY、HAVING
シーケンス全体をリストするリファレンスをオンラインで見つけようとしていました(つまり、「SELECT」が一番下に表示されます)が見つかりません。それについては、Solid Quality Learningが執筆した「Microsoft SQL Server 2005の内部」という本にそれほど詳しくはありません。
編集:リンクが見つかりました:http : //blogs.x2line.com/al/archive/2007/06/30/3187.aspx
実装したい場合に何をする必要があるか考えてください:
順序はWHERE、GROUP BY、HAVINGです。
条項があることは、条項ごとのグループの前/前に来ることがあります。
例:select * FROM test_std; ROLL_NO SNAME DOB TEACH
1 John 27-AUG-18 Wills
2 Knit 27-AUG-18 Prestion
3 Perl 27-AUG-18 Wills
4 Ohrm 27-AUG-18 Woods
5 Smith 27-AUG-18 Charmy
6 Jony 27-AUG-18 Wills
Warner 20-NOV-18 Wills
Marsh 12-NOV-18 Langer
FINCH 18-OCT-18 Langer
9行が選択されました。
TEACHによってcount()> 1グループを持つtest_stdから、teach、count()countを選択します。
ティーチカウント
ランガー2ウィルズ4
これはクエリのSQL実行順序です。
以下の質問については、この記事から直接得られた行が役立つかもしれません。
- GROUP BY-> WHERE制約が適用された後の残りの行は、GROUP BY句で指定された列の共通値に基づいてグループ化されます。グループ化の結果、その列には一意の値と同じ数の行しかありません。暗黙的に、これは、クエリに集計関数がある場合にのみ使用する必要があることを意味します。
- HAVING->クエリにGROUP BY句がある場合、HAVING句の制約がグループ化された行に適用され、制約を満たさないグループ化された行を破棄します。WHERE句と同様に、ほとんどのデータベースでは、この手順からエイリアスにアクセスすることもできません。
参照:-