English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、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子句は単独の行に適用されます。