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

Clausola SQL HAVING

In questa guida, imparerai come filtrare i gruppi restituiti dalla clausola GROUP BY.

Filtrare i gruppi in base alle condizioni

Di solito la clausola HAVING viene utilizzata conGROUP BYLa clausola HAVING può essere utilizzata insieme aSELECTEsempio di utilizzo delle clausole insieme.

Per rendere questo punto più facile da capire, diamo un'occhiata aemployeesEdepartmentsTabella.

+--------+--------------+------------+---------+
| 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             |
+---------+------------------+
Tabella: employees
Tabella: departments

Ora, non solo trovare il nome dei dipendenti e dei loro dipartimenti, ma anche trovare i nomi dei dipartimenti senza dipendenti.

Per tabelle di piccole dimensioni, è possibile applicare semplicementeJOIN a sinistraE controllare manualmente ogni dipartimento, ma se una tabella contiene migliaia di dipendenti, non sarà così facile.

In questo caso, è possibile utilizzare la clausola HAVING conGROUP BYEsempio di utilizzo delle clausole insieme, come segue:

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 |
+------------------+-----------------+
| Customer Service |               0 |
+------------------+-----------------+

提示:HAVING子句类似于WHERE子句,但仅适用于整个组,而WHERE子句适用于单独的行。

SELECT查询可以包含WHERE和HAVING子句,但是在这种情况下,WHERE子句必须出现在GROUP BY子句之前,而HAVING子句必须出现在GROUP BY子句之后但在ORDER BY子句之前。