SQLで条件を指定するための「WHERE」ですが、それと似たもので、「HAVING」というのが存在します。今回はその「HAVING」についての記事となります。
この記事では以下のtestテーブルを例に説明します。
・testテーブル
id | customer_id | product | amount | date |
---|---|---|---|---|
1 | 101 | A | 500 | 2024-04-01 |
2 | 102 | B | 1200 | 2024-04-01 |
3 | 101 | C | 3000 | 2024-04-02 |
4 | 103 | A | 700 | 2024-04-02 |
5 | 102 | B | 4500 | 2024-04-03 |
Table of Contents
HAVINGの使い方
「HAVING」句は、GROUP BYによってグループ化された後の集計結果に条件を付けるために使用します。集計関数(SUM, AVG, COUNTなど)と組み合わせて使われるケースが一般的です。
例えば以下のSQLを実行してみます。
SELECT * FROM test
HAVING amount > 1000;
実行結果は以下です。
id | customer_id | product | amount | date |
2 | 102 | B | 1200 | 2024-04-01 |
3 | 101 | C | 3000 | 2024-04-02 |
5 | 102 | B | 4500 | 2024-04-03 |
上記SQLでは、HAVINGの部分をWHEREに変更しても同じ結果となります。ただ、WHEREの方が実行速度が速いということも言われていますので、特に指定がなければWHEREで指定しましょう。
次に、GROUP BYを含めたSQLを作成してみます。
SELECT customer_id, SUM(amount) as total_amount
FROM test
GROUP BY customer_id
HAVING SUM(amount) > 3100;
実行結果は以下となります。
customer_id | total_amount |
101 | 3500 |
102 | 5700 |
上記のHAVINGを含むSQLの場合は、グループ化された集計結果に対して、HAVING句の条件を適用しています。
また、WHEREの場合では、「~WHERE~GROUP BY~」の形式となり、WHERE句の条件適用後に、グループ化します。
これが、WHEREとHAVINGの大きな違いとなります。GROUP BYをどのタイミングで適用させたいかを判断して、適切な方を使用しましょう。
WHEREとHAVINGの同時使用
両方の句を1つのSQL内に共存させることができます。
例えば、amountが1000以上のデータのみを対象として、customer_idでグループ化してから、amountの合計が3100を超えるデータを抽出する場合は次のSQLになります。
SELECT customer_id, SUM(amount) as total_amount
FROM test
WHERE amount > 1000
GROUP BY customer_id
HAVING SUM(amount) > 3100;
実行結果は以下です。
customer_id | total_amount |
102 | 5700 |
このように、WHERE句とHAVING句を同時に使用することで、複数の条件に応じたSQL文を作成することができます。
まとめ
以上となります。「WHERE」句と「HAVING」句の違いを理解することで、SQLの可読性やパフォーマンスが大きく向上します。両者の役割を整理して、場面に応じた正しい使い方を身につけましょう。