SQLのHAVING句は、GROUP BY句でグループ化されたデータに対して条件を適用する際に利用されます。
本記事では、PostgreSQL、SQLServer、MySQL、Oracleの各データベースにおけるHAVING句の具体的な使用方法を、実装サンプルを交えながら解説します。
HAVING句とは
HAVING句は、SQLの集約関数を使ってグループ化されたデータにフィルタリングを行う際に使用される条件指定句です。
GROUP BY句で集約された後のデータに対して条件を適用することができ、WHERE句では対応できない集約結果に対する条件を設定できます。
HAVING句とWHERE句の違い
HAVING句とWHERE句はどちらも条件を指定するためのものですが、使用するタイミングが異なります。
WHERE句はGROUP BY句の前に適用され、HAVING句はGROUP BY句の後に適用されるという違いがあります。
これにより、WHERE句では集約関数を使えないのに対し、HAVING句では集約関数を用いた条件指定が可能です。
PostgreSQLでのHAVING句の使用例
PostgreSQLでHAVING句を使用する例を以下に示します。
まず、次のようなテーブルを使用します。
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100),
quantity INT,
sale_date DATE
);
INSERT INTO sales (product_name, quantity, sale_date)
VALUES
('Product A', 10, '2024-01-01'),
('Product B', 15, '2024-01-02'),
('Product A', 7, '2024-01-03'),
('Product B', 12, '2024-01-04'),
('Product C', 5, '2024-01-05');
上記のデータに対して、各商品ごとの合計販売数量が10以上の商品のみを取得するには、次のようにHAVING句を使用します。
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
GROUP BY product_name
HAVING SUM(quantity) >= 10;
SQLServerでのHAVING句の使用例
SQLServerでも、同様にHAVING句を使用してグループ化されたデータに対して条件を指定できます。
以下のサンプルでは、各商品の合計販売数量が特定の条件を満たすかどうかを確認します。
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
GROUP BY product_name
HAVING SUM(quantity) >= 10;
MySQLでのHAVING句の使用例
MySQLでも、HAVING句を使用する際の文法は他のデータベースと同様です。
以下に、MySQLでのHAVING句の使用例を示します。
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
GROUP BY product_name
HAVING SUM(quantity) >= 10;
OracleでのHAVING句の使用例
OracleにおけるHAVING句の使用も、PostgreSQLやSQLServer、MySQLと同様に行います。
次のSQL文は、Oracleデータベース上でのHAVING句の使用例です。
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
GROUP BY product_name
HAVING SUM(quantity) >= 10;
まとめ
HAVING句は、GROUP BY句によってグループ化されたデータに対してフィルタリングを行う強力なツールです。
WHERE句ではできない集約関数に基づく条件指定が可能なため、レポートやデータ分析などで重宝されます。
本記事では、PostgreSQL、SQLServer、MySQL、OracleにおけるHAVING句の使用方法と実装例を紹介しました。
データベースによって細かい文法の違いはほとんどなく、基本的な使い方は共通しているため、一度使い方を理解すればどのデータベースでも応用可能です。