新聞中心
在 MySQL 中,可以使用
HAVING 關(guān)鍵字對分組后的數(shù)據(jù)進行過濾。

為全南等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及全南網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、做網(wǎng)站、全南網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
使用 HAVING 關(guān)鍵字的語法格式如下:
HAVING <查詢條件>
HAVING 關(guān)鍵字和 WHERE 關(guān)鍵字都可以用來過濾數(shù)據(jù),且 HAVING 支持 WHERE 關(guān)鍵字中所有的操作符和語法。
但是 WHERE 和 HAVING 關(guān)鍵字也存在以下幾點差異:
- 一般情況下,WHERE 用于過濾數(shù)據(jù)行,而 HAVING 用于過濾分組。
- WHERE 查詢條件中不可以使用聚合函數(shù),而 HAVING 查詢條件中可以使用聚合函數(shù)。
- WHERE 在數(shù)據(jù)分組前進行過濾,而 HAVING 在數(shù)據(jù)分組后進行過濾 。
- WHERE 針對數(shù)據(jù)庫文件進行過濾,而 HAVING 針對查詢結(jié)果進行過濾。也就是說,WHERE 根據(jù)數(shù)據(jù)表中的字段直接進行過濾,而 HAVING 是根據(jù)前面已經(jīng)查詢出的字段進行過濾。
- WHERE 查詢條件中不可以使用字段別名,而 HAVING 查詢條件中可以使用字段別名。
下面通過實例讓大家更直觀的了解 WHERE 和 HAVING 關(guān)鍵字的相同點和不同點。
例 1
分別使用 HAVING 和 WHERE 關(guān)鍵字查詢出 tb_students_info 表中身高大于 150 的學(xué)生姓名,性別和身高。SQL 語句和運行結(jié)果如下。
mysql> SELECT name,sex,height FROM tb_students_info
-> HAVING height>150;
+--------+------+--------+
| name | sex | height |
+--------+------+--------+
| Dany | 男 | 160 |
| Green | 男 | 158 |
| Henry | 女 | 185 |
| Jane | 男 | 162 |
| Jim | 女 | 175 |
| John | 女 | 172 |
| Lily | 男 | 165 |
| Susan | 男 | 170 |
| Thomas | 女 | 178 |
| Tom | 女 | 165 |
+--------+------+--------+
10 rows in set (0.00 sec)
mysql> SELECT name,sex,height FROM tb_students_info
-> WHERE height>150;
+--------+------+--------+
| name | sex | height |
+--------+------+--------+
| Dany | 男 | 160 |
| Green | 男 | 158 |
| Henry | 女 | 185 |
| Jane | 男 | 162 |
| Jim | 女 | 175 |
| John | 女 | 172 |
| Lily | 男 | 165 |
| Susan | 男 | 170 |
| Thomas | 女 | 178 |
| Tom | 女 | 165 |
+--------+------+--------+
10 rows in set (0.00 sec)
上述實例中,因為在 SELECT 關(guān)鍵字后已經(jīng)查詢出了 height 字段,所以 HAVING 和 WHERE 都可以使用。但是如果 SELECT 關(guān)鍵字后沒有查詢出 height 字段,MySQL 就會報錯。
例 2
使用 HAVING 和 WHERE 關(guān)鍵字分別查詢出 tb_students_info 表中身高大于 150 的學(xué)生姓名和性別(與例 1 相比,這次沒有查詢 height 字段)。SQL 語句和運行結(jié)果如下。
mysql> SELECT name,sex FROM tb_students_info
-> WHERE height>150;
+--------+------+
| name | sex |
+--------+------+
| Dany | 男 |
| Green | 男 |
| Henry | 女 |
| Jane | 男 |
| Jim | 女 |
| John | 女 |
| Lily | 男 |
| Susan | 男 |
| Thomas | 女 |
| Tom | 女 |
+--------+------+
10 rows in set (0.00 sec)
mysql> SELECT name,sex FROM tb_students_info HAVING height>150;
ERROR 1054 (42S22): Unknown column 'height' in 'having clause'
由結(jié)果可以看出,如果 SELECT 關(guān)鍵字后沒有查詢出 HAVING 查詢條件中使用的 height 字段,MySQL 會提示錯誤信息:“having子句”中的列“height”未知”。
例 3
根據(jù) height 字段對 tb_students_info 表中的數(shù)據(jù)進行分組,并使用 HAVING 和 WHERE 關(guān)鍵字分別查詢出分組后平均身高大于 170 的學(xué)生姓名、性別和身高。SQL 語句和運行結(jié)果如下。
mysql> SELECT GROUP_CONCAT(name),sex,height FROM tb_students_info
-> GROUP BY height
-> HAVING AVG(height)>170;
+--------------------+------+--------+
| GROUP_CONCAT(name) | sex | height |
+--------------------+------+--------+
| John | 女 | 172 |
| Jim | 女 | 175 |
| Thomas | 女 | 178 |
| Henry | 女 | 185 |
+--------------------+------+--------+
4 rows in set (0.00 sec)
mysql> SELECT GROUP_CONCAT(name),sex,height FROM tb_students_info WHERE AVG(height)>170 GROUP BY height;
ERROR 1111 (HY000): Invalid use of group function
由結(jié)果可以看出,如果在 WHERE 查詢條件中使用聚合函數(shù),MySQL 會提示錯誤信息:無效使用組函數(shù)。
網(wǎng)站名稱:創(chuàng)新互聯(lián)數(shù)據(jù)庫教程:MySQLHAVING:過濾分組
文章網(wǎng)址:http://fisionsoft.com.cn/article/ccdccji.html


咨詢
建站咨詢
