SQLで条件を指定するための「WHERE」ですが、それと似たもので、「HAVING」というのが存在します。今回はその「HAVING」についての記事となります。

この記事では以下のtestテーブルを例に説明します。

・testテーブル

idcustomer_idproductamountdate
1101A5002024-04-01
2102B12002024-04-01
3101C30002024-04-02
4103A7002024-04-02
5102B45002024-04-03

HAVINGの使い方

「HAVING」句は、GROUP BYによってグループ化された後の集計結果に条件を付けるために使用します。集計関数(SUM, AVG, COUNTなど)と組み合わせて使われるケースが一般的です。

例えば以下のSQLを実行してみます。

SELECT * FROM test
HAVING amount > 1000;

実行結果は以下です。

idcustomer_idproductamountdate
2102B12002024-04-01
3101C30002024-04-02
5102B45002024-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_idtotal_amount
1013500
1025700

上記の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_idtotal_amount
1025700

このように、WHERE句とHAVING句を同時に使用することで、複数の条件に応じたSQL文を作成することができます。

まとめ

以上となります。「WHERE」句と「HAVING」句の違いを理解することで、SQLの可読性やパフォーマンスが大きく向上します。両者の役割を整理して、場面に応じた正しい使い方を身につけましょう。