在本教程中,您將學習如何過濾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 |
現(xiàn)在,不只是查找員工及其部門的名稱,還要查找沒有員工的部門的名稱。
對于小型表,您可以簡單地應(yīng)用左連接并手動檢查每個部門,但是假設(shè)一個表包含數(shù)千名員工,那將不是那么容易。
在這種情況下,可以將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;
如果執(zhí)行上面的語句,您將獲得如下輸出:
+------------------+-----------------+ | dept_name | total_employees | +------------------+-----------------+ | Customer Service | 0 | +------------------+-----------------+
提示:HAVING子句類似于WHERE子句,但僅適用于整個組,而WHERE子句適用于單獨的行。