サイトアイコン ITC Media

【SQL】HAVING句の完全理解ガイド:基本から応用まで

(最終更新月:2023年5月)

✔以下の疑問をお持ちの方へ向けた記事です

「SQLのHAVING句とは何で、どのように使うのだろうか?」

「SQLのHAVING句の使い方を学びたい」

「SQLのHAVING句の具体的な使用例を見て理解したい」

✔この記事を読むことで得られる知識

当記事では、SQLのHAVING句の基本的な使い方から、その応用法まで、具体的な例を交えて詳細に説明します。

ぜひ最後までお読みください。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

SQLのHAVING句を理解するための前提知識

こちらでは、SQLとHAVING句の重要性についてお伝えします。

SQLとは

SQL(Structured Query Language)は、データベース管理システム(DBMS)で使用されるプログラミング言語です。

リレーショナルデータベースという特定のタイプのデータベースを操作するために広く使用されています。

これには、データの挿入、クエリ(問い合わせ)、更新、削除などが含まれます。

SQLのHAVING句の重要性

HAVING句はSQLの中で特殊な役割を果たします。

GROUP BY句と一緒に使用し、グループ化されたデータに対して条件を適用できるからです。

これはデータ分析を行う際に非常に有用で、HAVING句の理解はSQLのスキルを大幅に向上させます。

GROUP BY句についてはこちらをご覧ください。

HAVING句とは

HAVING句について詳しく見ていきましょう。

HAVING句の定義

HAVING句は、GROUP BY句によって作成されたグループのうち、特定の条件を満たすものだけを選択するためのもの。

GROUP BY句と一緒に使用され、一般的に集計関数(SUM、COUNTなど)とともに使われます。

HAVING句の目的と主な使用ケース

HAVING句の主な目的は、GROUP BY句で生成された結果セットに条件を適用することです。

たとえば、特定の平均価格以上の商品を注文した顧客だけを抽出したい場合や、特定の商品を一定数量以上注文した顧客を特定したい場合などに、HAVING句を使用します。

HAVING句の使い方:基本ルールと構文

ここでは、HAVING句の使い方について説明します。

HAVING句の基本的な構文と使用法

HAVING句は通常、SELECT文中のGROUP BY句のあとに位置します。

その基本的な形式は以下の通りです。

SELECT
  column_name(s)
FROM
  table_name
WHERE
  condition
GROUP BY
  column_name(s)
HAVING
  condition
ORDER BY
  column_name(s);

HAVING句の中には、通常、集計関数を使用した条件が記述されます。

例えば、次のようになります。

HAVING SUM(column_name) > value;

HAVING句を用いた簡単なクエリ例

以下に、HAVING句を用いた簡単なクエリ例を示します。

SELECT
  COUNT(CustomerID),
  Country
FROM
  Customers
GROUP BY
  Country
HAVING
  COUNT(CustomerID) > 5;

このクエリでおこなっていることは以下のとおり。

HAVING句の具体的な使用例

次に、実際のデータを使用したHAVING句の使用例を見てみましょう。

実例で使用するテーブルのデータの紹介

今回使用するテーブルは、顧客の注文情報を保持しています。

以下のようなフィールド・レコードです。

CustomerIDCountryOrderCount
1Japan3
2USA5
3USA2
4Japan7
5UK1

各顧客は複数の注文を持っている可能性があります。

これらのデータを用いて、HAVING句の使用例を見ていきます。

具体的なクエリ例

以下のクエリでは、各国の顧客数をカウントし、顧客数が2以上の国を抽出しています。

SELECT
  COUNT(CustomerID),
  Country
FROM
  Customers
GROUP BY
  Country
HAVING
  COUNT(CustomerID) > 2;

結果の解説

上記のクエリを実行すると、顧客数が2以上の国のみが結果として表示されます。

HAVING句がグループ化されたデータに対して条件を適用し、条件に合致するグループのみを抽出しているのです。

このようにHAVING句は、集計結果に対するフィルタリングを可能にします。

WHEREとHAVINGの違い

HAVING句と似た機能を持つWHERE句との違いについて見てみましょう。

WHEREとHAVINGの定義

WHERE句とHAVING句は共に、特定の条件に基づいてデータをフィルタリングします。

ただし異なるのは、その適用するタイミングと対象です。

呼ばれるタイミングの違い

WHERE句は、データをグループ化する前の行レベルでフィルタリングをおこないます。

一方、HAVING句は、データがグループ化され、集計された後にフィルタリングをおこないます。

それぞれの使用ケース

WHERE句は、特定の行を抽出するために使用されます。

例えば、特定の顧客の情報を検索するときなどです。

一方、HAVING句は、特定の条件を満たすグループを抽出するために使用されます。

例えば、特定の売上平均を超える店舗を検索するときなどです。

SELECT
  StoreName,
  AVG(Sales) as AvgSales
FROM
  StoreSales
GROUP BY
  StoreName
HAVING
  AVG(Sales) > 10000;

HAVING句の注意点とAS句、WHERE句との併用

HAVING句を使用する際には、いくつかの注意点があります。

AS句やWHERE句との併用方法についても学んでみましょう。

HAVING句の使用時に注意する点

HAVING句はGROUP BY句と共に使用されることが多いですが、HAVING句を使用する際には必ずしもGROUP BY句が必要というわけではありません

GROUP BY句なしでHAVING句を使用すると、全ての行が単一のグループとして扱われます。

これは、意図しない結果をもたらす可能性があるので注意が必要です。

HAVING句とAS句の併用

HAVING句はAS句と共に使用することで、読みやすく効率的なクエリを作成できます。

AS句を使用して計算フィールドや集計フィールドにエイリアスを設定し、HAVING句ではそのエイリアスを参照することが可能です。

HAVING句とWHERE句の同時使用

HAVING句とWHERE句は同じクエリ内で同時に使用できます。

WHERE句が先に適用され、その結果に対してHAVING句が適用されることを覚えておきましょう

WHERE句で行をフィルタリングし、その後でGROUP BY句を使ってデータをグループ化、そしてHAVING句でグループをフィルタリングします。

HAVING句を使ったクイズ

ここで、学んだことを試すためのクイズをいくつか紹介します。

クイズの問題

  1. HAVING句とWHERE句の主な違いは何ですか?
  2. HAVING句はGROUP BY句なしでも使用できますか?
  3. HAVING句とAS句を併用するとどのような利点がありますか?

クイズの解答

まとめ

当記事を通じて、HAVING句の基本的な使い方と活用方法を学びました。

HAVING句は、グループ化されたデータに対してフィルタリングを適用する際に使われます。

WHERE句とは適用するタイミングが異なり、HAVING句はデータがグループ化された後にフィルタリングをおこないます。

HAVING句はAS句やWHERE句と併用することも可能で、これによりより複雑なクエリを効率的に書けます。

モバイルバージョンを終了