私はこれが多く議論されていることを知っていますが、私の研究のどれも、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句に入れると、句に含まれていないため、集計後に列を使用できないため、エラーが発生します。その場合、代わりに句を使用する必要があります。IDSELECTWHERE
select value, count(value)
from Table1
where id > 2
group by value
HAVINGfromWHERE句の違いは、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と評価されたグループのみが、フェーズ
によって返されます。論理式が評価されるグループは除外されます。WHEREHAVINGHAVINGFALSE or UNKNOWN
GROUP BYが使用されていない場合、句HAVINGのように動作します。WHERE性能比較についてはこちらの記事をご覧ください