SQL ServerのGroup By、Having、およびWhere句の実行シーケンスは何ですか?


回答:


184

順番に:

FROMJOIN s行の決定とフィルタリング
WHERE行の追加のフィルター
GROUP BYはそれらの行をグループに結合します
HAVINGフィルターグループ
ORDER BYは残りの行/グループを配置します残りの行/グループの
LIMITフィルター


これへの参照はありますか?
Geshan

3
@月山、調べてSET SHOWPLAN_ALL ON
和基。

こんにちは、1つ質問があります。whereステートメントがwhere条件をオーバーライドする場合のcaseステートメント
MAX

1
select句についてはどうでしょうか。ラストですか?
MAX

短く簡潔な答え!ありがとうございました!
Abhishek Ghosh 2017

14

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

Microsoftから詳細情報を入手する


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valここでONは結合の後に来て、selectが最初に来ます、何か説明はありますか?
noob

これは、SQLステートメントを記述する構文にすぎません。私が言及したシーケンスは、SQLエンジンが評価する実際の順序です。つまり、クエリ構文が正しい場合は、エンジンがFROM最初に評価され、その後ONも同様に評価されます。
Md。Suman Kabir

1
@ShailajaGuptaKapoorこのブログ
Kabir

8

WHEREが最初で、次にクエリの結果をGROUPします。最後に、少なくともHAVING句を使用して、グループ化された結果をフィルタリングします。これは「論理的」な順序であり、これが技術的にエンジンにどのように実装されているかはわかりません。


2
オプティマイザが句を集計に依存しない場合、句をHAVINGからWHEREに移動する可能性があることを追加する価値があります。これは表示される結果には影響しません。
Damien_The_Unbeliever 2009

2

マティアスが言ったように、それはエンジンに実装されていると思います:WHERE、GROUP BY、HAVING

シーケンス全体をリストするリファレンスをオンラインで見つけようとしていました(つまり、「SELECT」が一番下に表示されます)が見つかりません。それについては、Solid Quality Learningが執筆した「Microsoft SQL Server 2005の内部」という本にそれほど詳しくはありません。

編集:リンクが見つかりました:http : //blogs.x2line.com/al/archive/2007/06/30/3187.aspx


あなたがリンクした非常に素晴らしい説明:-)。
sleske 2009

1
リンクが停止しています。あなたがそれを修正することができれば、それは素晴らしいでしょう:)
Akash KC 2017

2

Oracle 12cでは、以下のどちらの順序でもコードを実行できます。

Where
Group By
Having

または

Where 
Having
Group by

1

実装したい場合に何をする必要があるか考えてください:

  • WHERE:JOIN操作を実行する必要があります。
  • GROUP BY:結合の結果を「グループ化」するにはGroup byを指定し、JOIN操作の後、WHEREの使用後に行う必要があります。
  • HAVING:GROUP BY式が言うように、HAVINGはフィルタリング用です。次に、GROUP BYの後に実行されます。

順序はWHERE、GROUP BY、HAVINGです。


ここであなたが説明したことは素晴らしいです。それは私が持っていることについての私の疑問をクリアしました。要約すると、GROUP BY&HAVINGはSELECT&WHEREと同じように機能します。HAVING句は常に、図のGROUP BY条件とNOT ON GROUPEDデータを取るCOMPLETEテーブルデータに対して実行されます。
Naveen Kumar


0

条項があることは、条項ごとのグループの前/前に来ることがあります。

例: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


0

これはクエリのSQL実行順序です。

ここに画像の説明を入力してください

この記事の例で実行順序を確認できます

以下の質問については、この記事から直接得られた行が役立つかもしれません。

  1. GROUP BY-> WHERE制約が適用された後の残りの行は、GROUP BY句で指定された列の共通値に基づいてグループ化されます。グループ化の結果、その列には一意の値と同じ数の行しかありません。暗黙的に、これは、クエリに集計関数がある場合にのみ使用する必要があることを意味します。
  1. HAVING->クエリにGROUP BY句がある場合、HAVING句の制約がグループ化された行に適用され、制約を満たさないグループ化された行を破棄します。WHERE句と同様に、ほとんどのデータベースでは、この手順からエイリアスにアクセスすることもできません。

参照:-


-2

SELECTは
FROM
JOINの
WHERE
、GROUP BYを
HAVING
ORDER BYを


13
これは実際には間違っています。MS認定トレーナーと公式トレーニング資料によると、Order ByはSelectの後です。あなたがそれについて考えるとき、一種の論理的です。まだフェッチして接着していない仮想テーブルを注文するのは愚かです。:)
simme
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.