【SQL】WHERE句とHAVING句の使い分けで、データ抽出をもっと効率的に!

2024-04-08

SQLにおけるWHERE句とHAVING句の違い

WHERE句

WHERE句は、SELECT句で指定されたテーブルからデータを取得する際に、個々のレコードに対して条件を指定します。つまり、WHERE句で指定された条件を満たすレコードのみが抽出されます。

例:

SELECT * FROM employees WHERE department = 'Sales' AND salary > 100000;

この例では、department列がSalesで、salary列が100,000円より大きい従業員のレコードのみが抽出されます。

HAVING句

HAVING句は、GROUP BY句でグループ化されたデータに対して、グループ全体の条件を指定します。つまり、HAVING句で指定された条件を満たすグループのみが抽出されます。

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;

この例では、各部門の平均給与が100,000円より大きい部門のみが抽出されます。

WHERE句とHAVING句の主な違い

項目WHERE句HAVING句
適用対象個々のレコードグループ化されたデータ
タイミングデータ抽出前グループ化後
使用できる関数集計関数を含む全ての関数集計関数のみ
  • WHERE句は、個々のレコードに対して条件を指定する。
  • HAVING句は、グループ化されたデータに対して条件を指定する。
  • WHERE句とHAVING句は、組み合わせて使用することもできる。



WHERE句とHAVING句の比較

-- WHERE句

SELECT *
FROM employees
WHERE department = 'Sales'
AND salary > 100000;

-- HAVING句

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;
-- WHERE句

| id | name | department | salary |
|---|---|---|---|
| 1 | John Doe | Sales | 120000 |
| 2 | Jane Doe | Sales | 110000 |

-- HAVING句

| department | average_salary |
|---|---|
| Sales | 115000 |

WHERE句とHAVING句の組み合わせ

SELECT department, AVG(salary) AS average_salary
FROM employees
WHERE department IN ('Sales', 'Marketing')
GROUP BY department
HAVING AVG(salary) > 100000;

結果:

| department | average_salary |
|---|---|
| Sales | 115000 |
  • 特定の部門の従業員のうち、給与が最高額の従業員のみを抽出したい場合:
SELECT *
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;
  • 各部門の従業員数と平均給与を抽出したい場合:
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

WHERE句とHAVING句は、それぞれ異なる役割を持つため、状況に合わせて使い分けることが重要です。




WHERE句とHAVING句の使い分け

条件の種類

  • WHERE句は、比較演算子、論理演算子、IN演算子など、様々な条件を指定できます。
  • HAVING句は、集計関数を含む条件のみを指定できます。

処理のタイミング

  • WHERE句は、データ抽出前に処理されます。
  • HAVING句は、グループ化後に処理されます。

目的

  • WHERE句は、特定のレコードを抽出するために使用されます。
  • HAVING句は、グループ化されたデータの集計結果に基づいて、グループを抽出するために使用されます。
SELECT *
FROM employees
WHERE department = 'Sales'
AND salary > 100000;
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;

WHERE句とHAVING句以外にも、データ抽出条件を指定する方法があります。

  • CASE式: 特定の条件に基づいて、異なる値を返す式です。
  • EXISTS演算子: サブクエリが存在するかどうかをチェックする演算子です。

sql where-clause having


異なるWindowsユーザーでSQL Server Management Studioに接続する方法

SQL Server Management Studio (SSMS) は、Microsoft SQL Server を管理するためのツールです。デフォルトでは、SSMS は現在のWindowsユーザーの認証情報を使用してSQL Serverに接続します。しかし、異なるWindowsユーザーの認証情報を使用して接続したい場合もあります。...


【初心者でも安心】Oracle SQL Developerで参照関係を簡単操作!3ステップガイド

Oracle SQL Developer を使用して、特定の表を参照する他の表を簡単に見つけることができます。 これを行うには、依存関係ビューと呼ばれる特別なビューを使用します。 依存関係ビューには、参照している表と参照されている表に関する情報が含まれています。...


Java、SQL、Hibernateでパラメータ値付きクエリ文字列を出力する方法

Hibernateでクエリを実行する際には、パラメータを使用することができます。パラメータは、クエリ文字列に動的に値を挿入するのに役立ちます。このチュートリアルでは、Hibernateでパラメータ値を使用してクエリ文字列を出力する方法について説明します。...


データベースの整合性を守る!SQL Server トランザクションの正しい使用方法

SQL Server におけるトランザクションには、以下の3つの種類があります。明示的なトランザクション: BEGIN TRANSACTION と COMMIT TRANSACTION/ROLLBACK TRANSACTION を使用して明示的に開始と終了を指定するトランザクションです。...


PostgreSQLでCTEを使用して3つのテーブルに一度にデータを挿入する方法

PostgreSQLでは、CTE (Common Table Expression)と呼ばれる機能を使用して、複雑なクエリをより読みやすく、メンテナンスしやすいモジュール化された部分に分割することができます。CTEを使用して、3つのテーブルに一度にデータを挿入することもできます。...


SQL SQL SQL SQL Amazon で見る



これで完璧!WHERE句とHAVING句を使いこなしてデータ分析をマスターしよう

概要WHERE句WHERE句は、SELECT、UPDATE、DELETEなどのステートメントで使用できます。集計前に個々の行に対して条件を適用し、条件を満たす行のみを結果として返します。例:上記の例では、country列が日本である顧客のみが抽出されます。


SQLのHAVING句で集計後の絞り込み条件を設定:WHERE句との違いを理解して使い分ける

SQLにおける WHERE 句と HAVING 句はどちらもデータの絞り込み条件を定義するために使用されますが、適用されるタイミングと対象が異なります。WHERE句レコード全体を対象とした絞り込み条件を定義します。集計処理前に適用されます。