Having句はwhere句と同じ働きをしますが、where句は現在のテーブルの列のみで動作し、列は集約しません。Havingを同じ目的に使用できる場合でもwhere句を使用する理由
私たちは常にを使用できますか?を持つことができますか。
Having句はwhere句と同じ働きをしますが、where句は現在のテーブルの列のみで動作し、列は集約しません。Havingを同じ目的に使用できる場合でもwhere句を使用する理由
私たちは常にを使用できますか?を持つことができますか。
WHERE
とHAVING
は、MySQLデータベースと特定の状況で使用できる可能性があります。 ないを行い、MySQLのクエリで
GROUP BY
句を持っている、
HAVING
は
WHERE
が行うのと同じことを行うように思われます。次のクエリ考えてみましょう:上記のクエリで
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
彼らは、クエリの実行時に、DBMSがどうなる二つの異なる段階を反映しています。この例を見てみましょう:あなたがする必要がどのような
select person_id, count(distinct child_id)
from parenthood
where child_age > 6
group by person_id
having count(distinct child_id) > 1
は、そのクエリを書いたグループ
をフィルタリングし、残りの行
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
を使用することが予想される、とだけ集計関数に適用され、それ以外の場合はエラーを返します。 。
標準SQLは、すべてのクエリに必ずしも存在しない 'GROUP BY'節がある場合にのみ' HAVING'を使用できるように指示します。 –