web-dev-qa-db-ja.com

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

WHERE句でGROUP BYおよびHAVINGを使用すると、SQLクエリの実行シーケンスと混同されます。最初に実行されるのはどれですか?シーケンスとは何ですか?

78
Aarti

順番に:

[〜#〜] from [〜#〜][〜#〜] join [〜#〜] s行の決定とフィルタリング
[〜#〜] where [〜#〜]行のフィルターを追加
GROUP BYは、これらの行をグループに結合します
[〜#〜] having [〜#〜]フィルターグループ
ORDER BY残りの行/グループを配置します
[〜#〜] limit [〜#〜]残りの行/グループのフィルター

161
KM.

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

7
Matthias Meid

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 から詳細を入手してください

7
Md. Suman Kabir

Matthiasが言ったように、エンジンに実装されていると思います:WHERE、GROUP BY、HAVING

シーケンス全体をリストする参照をオンラインで検索しようとしていました(つまり、「SELECT」が一番下に表示されます)が、見つかりません。 Solid Quality Learningが最近読んだ「Microsoft SQL Server 2005の内部」の本で詳しく説明しました。

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

2
AdaTheDev

以下の順序で

  1. FROM&JOIN
  2. [〜#〜] where [〜#〜]
  3. GROUP BY
  4. [〜#〜] having [〜#〜]
  5. [〜#〜] select [〜#〜]
  6. ORDER BY
  7. [〜#〜] limit [〜#〜]
1
GimmicksWorld

Oracle 12cでは、以下のいずれかのシーケンスで両方のコードを実行できます。

Where
Group By
Having

または

Where 
Having
Group by
1
Jim Chen

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

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

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

1
FerranB

句を持つことは、group by句の前/前に来る場合があります。

例: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行が選択されました。

教える、count()countを持っているtest_stdからcount()> TEACHによる1グループを選択します。

ティーチカウント


ランガー2ウィルズ4

0
manoj remala