推奨されます, 2019

エディターズチョイス

SQLのwhere句とhaving句の違い

WHERE句とHAVING句は主にSQLクエリのステートメントで使用されます。これらにより、特定の述語を使用して結果リレーションの組み合わせを制限できます。 WHEREとHAVINGの主な違いは、WHERE句がリレーションからタプル(行)を選択するための条件必要に応じて結合条件を含む)を指定することです。 一方、HAVING句は、個々のタプルではなく、選択されているグループに対する条件を指定します。

SQL構造化照会言語を表します。 データベースからデータにアクセスするために使用される包括的なまたは宣言的なデータベース言語です。

比較表

比較基準どこで持っている
基本行操作で実装されています。列操作で実装されています。
に適用されます単一行行またはグループの要約
データ取得条件に従って特定の行から特定のデータを取得するだけです。最初に、完全なデータが取り出されてから、条件に従って分離されます。
集約関数WHERE句には指定できません。HAVING句に書くことができます。
で使用SELECT、およびUPDATE、DELETE、あるいはそれらのいずれかなどの他のステートメント。SELECT文なしでは使用できません。
として作用しますプレフィルターポストフィルター
グループ化WHEREの後に来る。HAVINGの後に来る。

where句の定義

SQL WHERE句は、単一のテーブルからデータを取得するとき、または複数のテーブルと結合することによって条件を記述するために使用されます。 与えられた条件が満たされる場合にのみ、テーブルから特定の値を返します。 WHERE句は、レコードを透過して必要なレコードだけを取得するために使用されます。

SQLは論理接続詞andを実装し、WHERE句には含まれません。これはブール条件とも呼ばれます。 タプルを取得するには、条件が真でなければなりません。 論理接続詞式のオペランドには、 <<=>> == 、などの比較演算子が含まれます。 。 これらの比較演算子は、文字列と算術式を比較します。 これはSELECTステートメント、およびUPDATE、 DELETEステートメントで使用できます。

例を見てみましょう。 以下に示す「 Sales 」テーブルという名前のテーブルは、「 Product 」属性と「 Sales_amount 」属性で構成されています。

次の質問は電話と話者のTotal_salesを計算するために書かれることです。

 製品の選択、合計(Sales_amount)AS販売からの売上合計WHERE製品の( '電話'、 'スピーカー')GROUP BY製品; 

次の出力は、行が最初にフィルタリングされ、電話とスピーカーの行が取得され、その後集約関数が実行される結果の出力です。

節を持つことの定義

SQLには、 GROUP BY句と一緒に使用できるHAVING句があります。 このHAVING句は、特定の条件を満たすグループの値を取得するのに役立ちます。 WHERE句は、選択時にHAVING句と組み合わせて使用​​することもでき、WHERE句は個々の行をフィルタ処理します。 その後、行がグループ化され、集計計算が実行されます。最後にHAVING句によってグループがフィルタ処理されます。

GROUP BYキーワードが使用されていない場合は、WHEREと同じように動作します。 min、max、avg、sum、countなどのグループ関数は、SELECT句とHAVING句の2つの句にしか指定できません。 属性グループ内の各値に対応するタプルの条件を提供します。 条件を満たすレコードの唯一のセットが結果として表示されます。

ここでも、WHERE句と同じ例を取り、同じ「 Sales 」テーブルを検討しています。 HAVING句を使用して電話とスピーカーのTotal_salesを計算したい場合は、次のクエリを書きます。

 SELECT製品、合計(Sales_amount)AS販売グループの製品別の製品合計( '電話'、 'スピーカー')の製品。 

問合せでは、製品が最初に取得され、次に集計関数(sum)が実行され、最後にWHERE句とは異なりグループがフィルタ処理される次の出力が生成されます。

Total_salesが1000より大きい商品のみを検索する場合。クエリは次のように書くことができます。

 SELECT製品、合計(Sales_amount)AS売上グループの合計金額AS(製品の合計)AS(Sales_amount)> 1000。 

生成された出力は次のとおりです。

HAVINGにもかかわらず、WHERE句を使用してこれを実行することはできません。また、WHERE句は集約関数では使用できないため、エラーメッセージが生成されます。

where句と節を持つことの主な違い

  1. WHERE句は行操作で使用され、単一行に適用されますが、HAVING句は列操作に使用され、要約行または要約行に適用できます。
  2. WHERE句では、適用された条件に従って目的のデータが取得されます。 対照的に、HAVING句はデータ全体をフェッチしてから、条件に従って分離が行われます。
  3. min、sum、max、avgなどの集約関数は、WHERE句とともに使用することはできません。 反対に、これらの関数はHAVING句に現れることがあります。
  4. HAVING句はSELECT文なしでは使用できません。 逆に、WHEREはSELECT、UPDATE、DELETEなどと一緒に使用できます。
  5. WHERE句はプレフィルタとして動作し、HAVING句はポストフィルタとして機能します。
  6. WHERE句をGROUP BYと一緒に使用すると、GROUP BYの前に来ます。 これは、集計計算が実行される前にWHEREが行をフィルタリングすることを意味します。 一方、HAVINGはGROUP BYの後に来るため、集約計算の実行後にフィルタ処理されます。

結論

WHERE句とHAVING句は、HAVING句が一般的に使用される追加機能を除いて同じように機能します。 HAVING句は集約関数で効率的に機能しますが、WHEREは集約関数では操作できません。

Top