在 MySQL SELECT 語句中,除了能使用 GROUP BY 子句分組資料外,還可以使用 HAVING 子句過濾分組,在結果集中規定了包含哪些分組和排除哪些分組。
語法格式如下:
HAVING <條件>
其中,
<條件>
指的是指定的過濾條件。
HAVING 子句和 WHERE 子句非常相似,HAVING 子句支援 WHERE 子句中所有的操作符和語法,但是兩者存在幾點差異:
-
WHERE 子句主要用於過濾資料行,而 HAVING 子句主要用於過濾分組,即 HAVING 子句基於分組的聚合值而不是特定行的值來過濾資料,主要用來過濾分組。
-
WHERE 子句不可以包含聚合函數,HAVING 子句中的條件可以包含聚合函數。
-
HAVING 子句是在資料分組後進行過濾,WHERE 子句會在資料分組前進行過濾。WHERE 子句排除的行不包含在分組中,可能會影響 HAVING 子句基於這些值過濾掉的分組。
【範例】根據 dept_id 對 tb_students_info 表中的資料進行分組,並顯示學生人數大於1的分組資訊,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT dept_id,GROUP_CONCAT(name) AS names
-> FROM tb_students_info
-> GROUP BY dept_id
-> HAVING COUNT(name)>1;
+---------+---------------+
| dept_id | names |
+---------+---------------+
| 1 | Dany,Jane,Jim |
| 2 | Henry,John |
| 3 | Green,Thomas |
| 4 | Susan,Tom |
+---------+---------------+
4 rows in set (0.07 sec)