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

SQL HAVING 子句

在本教程中,您将学习如何过滤GROUP BY子句返回的组。

根据条件过滤组

HAVING子句通常与GROUP BY子句一起使用,以指定组或集合的过滤条件。HAVING子句只能与SELECT语句一起使用。

为了容易理解这一点,让我们来看看下面employeesdepartments表。

+--------+--------------+------------+---------+
| 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;

Si vous exécutez l'instruction ci-dessus, vous obtiendrez le résultat suivant :

+------------------+-----------------+
| dept_name        | total_employees |
+------------------+-----------------+
| Service client |               0 |
+------------------+-----------------+

Astuce :La clause HAVING est similaire à la clause WHERE, mais elle s'applique uniquement aux groupes entiers, etWHERELa clause s'applique aux lignes individuelles.

La clause SELECT peut inclure des clauses WHERE et HAVING, mais dans ce cas,WHERELa clause doit apparaître avant la clause GROUP BY, et la clause HAVING doit apparaître après la clause GROUP BY mais avantORDER BYAvant la clause.