在mysql中,having关键字需要和select语句一起使用,用于对分组后的数据进行过滤,语法“select {*|字段列名} from 数据表名 having 查询条件;”。
本教程操作环境:windows7系统、mysql8版本、dell g3电脑。
mysql having:过滤分组在 mysql 中,可以使用 having 关键字对分组后的数据进行过滤。
使用 having 关键字的语法格式如下:
having 查询条件;
having 关键字和 where 关键字都可以用来过滤数据,且 having 支持 where 关键字中所有的操作符和语法。
但是 where 和 having 关键字也存在以下几点差异:
一般情况下,where 用于过滤数据行,而 having 用于过滤分组。
where 查询条件中不可以使用聚合函数,而 having 查询条件中可以使用聚合函数。
where 在数据分组前进行过滤,而 having 在数据分组后进行过滤 。
where 针对数据库文件进行过滤,而 having 针对查询结果进行过滤。也就是说,where 根据数据表中的字段直接进行过滤,而 having 是根据前面已经查询出的字段进行过滤。
where 查询条件中不可以使用字段别名,而 having 查询条件中可以使用字段别名。
下面通过实例让大家更直观的了解 where 和 having 关键字的相同点和不同点。
例 1
分别使用 having 和 where 关键字查询出 tb_students_info 表中身高大于 150 的学生姓名,性别和身高。sql 语句和运行结果如下。
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 关键字后已经查询出了 height 字段,所以 having 和 where 都可以使用。但是如果 select 关键字后没有查询出 height 字段,mysql 就会报错。
例 2
使用 having 和 where 关键字分别查询出 tb_students_info 表中身高大于 150 的学生姓名和性别(与例 1 相比,这次没有查询 height 字段)。sql 语句和运行结果如下。
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'
由结果可以看出,如果 select 关键字后没有查询出 having 查询条件中使用的 height 字段,mysql 会提示错误信息:“having子句”中的列“height”未知”。
例 3
根据 height 字段对 tb_students_info 表中的数据进行分组,并使用 having 和 where 关键字分别查询出分组后平均身高大于 170 的学生姓名、性别和身高。sql 语句和运行结果如下。
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
由结果可以看出,如果在 where 查询条件中使用聚合函数,mysql 会提示错误信息:无效使用组函数。
【相关推荐:mysql视频教程】
以上就是mysql having关键字怎么用的详细内容。
