2017-03-29 7 views
0

Having句はwhere句と同じ働きをしますが、where句は現在のテーブルの列のみで動作し、列は集約しません。Havingを同じ目的に使用できる場合でもwhere句を使用する理由

私たちは常にを使用できますか?を持つことができますか。

+0

標準SQLは、すべてのクエリに必ずしも存在しない 'GROUP BY'節がある場合にのみ' HAVING'を使用できるように指示します。 –

答えて

1

WHEREHAVINGは、MySQLデータベースと特定の状況で使用できる可能性があります。 ないを行い、MySQLのクエリで

GROUP BY句を持っている、 HAVINGWHEREが行うのと同じことを行うように思われます。次のクエリ考えてみましょう:上記のクエリで

SELECT (a + b + c)/(d + e) AS some_computed_column 
FROM yourTable 
WHERE some_computed_column = 10 -- WRONG! 

を、我々はWHERE句で計算列の別名を使用しようとしましたが、それを離れて取得できませんでした。この理由は、WHERE句が評価された時点でエイリアスが使用可能になることをMySQLが保証することができないためです。これは、次のオプションを私たちに残しているように見えるでしょう:

SELECT (a + b + c)/(d + e) AS some_computed_column 
FROM yourTable 
WHERE (a + b + c)/(d + e) = 10 -- correct, but ugly 

上記のクエリを実行する、正しいですが、醜い、おそらく冗長で、我々は再び計算列のロジックを繰り返していたので。しかし、です。別名としてHAVING句を使用することは可能です。エイリアスはクエリのその時点で利用できるためです。したがって、次のように書くことができます:

ただし、すべてのデータベースが上記のクエリを受け入れるわけではありません。あなたは冗長性を回避するためのデータベースに依存しない方法をしたい場合は、サブクエリで元のクエリをラップし、そのを問い合わせることができ、例えば:

SELECT t.some_computed_column 
FROM 
(
    SELECT (a + b + c)/(d + e) AS some_computed_column 
    FROM yourTable 
) t 
WHERE t.some_computed_column = 10 
0

彼らは、クエリの実行時に、DBMSがどうなる二つの異なる段階を反映しています。この例を見てみましょう:あなたがする必要がどのような

select person_id, count(distinct child_id) 
from parenthood 
where child_age > 6 
group by person_id 
having count(distinct child_id) > 1 

は、そのクエリを書いたグループ

をフィルタリングし、残りの行

  • を集約し、総行
  • をフィルタリング

    1. ですlike

      select person_id, count(distinct child_id) 
      from parenthood 
      group by person_id 
      having child_age > 6 and count(distinct child_id) > 1 
      

      は、dbmsが実行するステップを変更しないため、クエリを少し分かりにくくします。

      は、MySQLの最新バージョンはgroup by、集計関数とhavingのいくつかの創造的combinatinosを許可しながら、実際には、ほとんどのDBMSはあなたがgroup byとの組み合わせでのみhavingを使用することが予想される、とだけ集計関数に適用され、それ以外の場合はエラーを返します。 。

  • 関連する問題