在mysql中,having關(guān)鍵字需要和SELECT語句一起使用,用于對分組后的數(shù)據(jù)進(jìn)行過濾,語法“SELECT {*|字段列名} FROM 數(shù)據(jù)表名 HAVING 查詢條件;”。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
MySQL HAVING:過濾分組
在 MySQL 中,可以使用 HAVING 關(guān)鍵字對分組后的數(shù)據(jù)進(jìn)行過濾。
使用 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ù)分組前進(jìn)行過濾,而 HAVING 在數(shù)據(jù)分組后進(jìn)行過濾 。
-
WHERE 針對數(shù)據(jù)庫文件進(jìn)行過濾,而 HAVING 針對查詢結(jié)果進(jìn)行過濾。也就是說,WHERE 根據(jù)數(shù)據(jù)表中的字段直接進(jìn)行過濾,而 HAVING 是根據(jù)前面已經(jīng)查詢出的字段進(jìn)行過濾。
-
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ù)進(jìn)行分組,并使用 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ù)。
【相關(guān)推薦:mysql視頻教程】