私はこれが多く議論されていることを知っていますが、私の研究のどれも、MySQLの''句where
と' '句の違いを私に納得させることができませんでした。having
私が理解していることから、''を使用して'where'句で実行できるすべてのことを達成できますhaving
。たとえば。select * from users having username='admin'
。では、なぜ' where
'句が必要なのですか?whereを使用するとパフォーマンスに違いがありますか?
4 に答える
WHERE
句は、集計前にソースからのデータをフィルタリングしますが、句はHAVING
、が適用された後にデータをフィルタリングしますGROUP BY
。通常、これは、非集計フィルターがどちらの場所にも表示される可能性があることを意味しますが、クエリで参照されていない列がある場合は、WHERE
句でのみフィルター処理できます。
たとえば、次の表がある場合:
| ID | VALUE |
--------------
| 1 | 15 |
| 2 | 15 |
| 3 | 20 |
| 4 | 20 |
| 5 | 25 |
| 6 | 30 |
| 7 | 40 |
次のクエリを適用したいとします。
select value, count(value)
from Table1
group by value
ただし、。が含まれる行のみを含めたいと考えていますID > 2
。これをHAVING
句に入れると、句に含まれていないため、集計後に列を使用できないため、エラーが発生します。その場合、代わりに句を使用する必要があります。ID
SELECT
WHERE
select value, count(value)
from Table1
where id > 2
group by value
HAVING
fromWHERE
句の違いは、HAVING
集約された列をサポートWHERE
するのに対し、個々の行にのみ適用できるためサポートしないことです。、EG
SELECT ID
FROM tableName
GROUP BY ID
HAVING COUNT(ID) > 1 --- <<== HERE
MySQLドキュメントから、
「WHEREの代わりにHAVINGを使用する場合は、Aliasを使用できます。これは2つの句の定義された違いの1つです。Havingも遅く、最適化されませんが、このような複雑な関数を明らかに存在しない場所に配置する場合素晴らしいスピードは期待していません。」
whereは単一行レベルで評価されますが、haveはgroupby式に使用されます。
この句を使用すると、フェーズで発生する個々の
行をフィルタリングするのではなく、グループHAVING
をフィルタリングする条件を指定できます。句の論理式がTRUEと評価されたグループのみが、フェーズ
によって返されます。論理式が評価されるグループは除外されます。WHERE
HAVING
HAVING
FALSE or UNKNOWN
GROUP BY
が使用されていない場合、句HAVING
のように動作します。WHERE
性能比較についてはこちらの記事をご覧ください