English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL HAVING 子句

このチュートリアルでは、GROUP BY子句が返すグループをフィルタリングする方法を学びます。

条件に基づいてグループをフィルタリングします。

HAVING子句は通常、GROUP BY子句を同時に使用して、グループまたは集合のフィルタリング条件を指定します。HAVING子句はSELECT文を同時に使用します。

この概念を理解しやすくするために、以下を確認してみましょう:employeesおよびdepartmentsテーブル。

+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+

+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | Administration   |
|       2 | Customer Service |
|       3 | Finance          |
|       4 | Human Resources  |
|       5 | Sales            |
+---------+------------------+
テーブル: employees
テーブル: departments

今や従業員と部署の名前だけでなく、従業員がいない部署の名前も検索する必要があります。

小さなテーブルに対しては、単に左結合各部署を手動で確認することはできますが、数千人の従業員を含むテーブルがあるとすると、それは簡単ではありません。

この場合、HAVING子句とGROUP BY子句を同時に使用する場合、以下のようになります:

SELECT t1.dept_name, count(t2.emp_id) AS total_employees
FROM departments AS t1 LEFT JOIN employees AS t2
ON t1.dept_id = t2.dept_id
GROUP BY t1.dept_name
HAVING total_employees = 0;

上記のステートメントを実行すると、以下のような出力が得られます:

+------------------+-----------------+
| dept_name        | total_employees |
+------------------+-----------------+
| 顧客サービス |               0 |
+------------------+-----------------+

ヒント:HAVING子句はWHERE子句に似ていますが、WHERE子句は単独の行に適用されます。

SELECTクエリにはWHEREとHAVING子句が含まれることができますが、この場合、WHERE子句はGROUP BY子句の前に、HAVING子句はGROUP BY子句の後に現れる必要があります。ORDER BY子句の前に。