MySQL中having关键字详解以及与where的区别

 更新时间:2024年07月23日 11:00:54   作者:睡竹  
在MySQL中HAVING和WHERE是用于过滤数据的两个重要的关键字,它们在查询语句中的位置和功能有所不同,这篇文章主要给大家介绍了关于MySQL中having关键字详解以及与where区别的相关资料,需要的朋友可以参考下

1、having关键字概览

1.1、作用

  • 对查询的数据进行筛选

1.2、having关键字产生的原因

  • 使用where对查询的数据进行筛选时,where子句中无法使用聚合函数,所以引出having关键字

1.3、having使用语法

  • having单独使用(不与group by一起使用,在Oracle中会报错),单独使用时,大部分场合与where相同
  • having与group by一起使用,这是having关键字产生的初衷,对分组之后的数据再进行筛选

1.4、having与where的区别

  • 一般情况下,where用于过滤数据行,而having用于过滤分组(能用where的地方,不要使用having)
  • where中不能出现聚合函数,而having可以使用聚合函数作为条件
  • where在数据分组前进行过滤,而having在数据分组后进行过滤(因此where效率一般比having高);where是数据从磁盘读入内存时筛选,而having是在内存中筛选
  • where是对数据库文件过滤(过滤条件是表中的字段),而having是对select中查询的字段进行过滤
  • where子句中不能使用字段别名,而having子句中可以使用字段别名
  • 多表关联查询时,where先筛选再联接,having先联接再筛选

2、having案例

初始化表(以student表为例):

create table if not exists student
(
	id int null,
	name varchar(50) null,
	age int null,
	sex varchar(2) null,
	score double null
)
comment '学生表';

INSERT INTO student (id, name, age, sex, score) VALUES (1, '张三', 18, '男', 70);
INSERT INTO student (id, name, age, sex, score) VALUES (2, '李四', 17, '男', 60);
INSERT INTO student (id, name, age, sex, score) VALUES (3, '王五', 19, '男', 80);
INSERT INTO student (id, name, age, sex, score) VALUES (4, '赵六', 16, '男', 90);
INSERT INTO student (id, name, age, sex, score) VALUES (5, '七七', 16, '女', 95);
INSERT INTO student (id, name, age, sex, score) VALUES (6, '九九', 17, '女', 85);
INSERT INTO student (id, name, age, sex, score) VALUES (7, '十一', 18, '女', 80);
INSERT INTO student (id, name, age, sex, score) VALUES (8, '小明', 19, '男', 90);
INSERT INTO student (id, name, age, sex, score) VALUES (9, '小军', 17, '男', 55);
INSERT INTO student (id, name, age, sex, score) VALUES (10, '小雷', 19, '女', 60);

2.1、having单独使用

案例1:查询学生表中,成绩在80分以上的数据

select * from student having score >= 80

等同于:

select * from student where score >= 80

having使用的错误:

select 
    id
    ,name
    ,age 
from student 
having score >= 80 -- 报错,score筛选条件没有出现在select中

where使用的错误:

select
       id
     ,name
     ,age
     ,score as fenshu
from student
where fenshu >= 80 -- 报错,where子句中不能使用字段别名

2.2、having与group by一起使用

案例2:求各个年龄段的平均分和年龄

select age,avg(score) from student group by age

如下:

 案例3:求学生平均分大于80分的年龄段及平均分

  • 这里只能使用having,对平均分进行筛选,使用where会报错
select
       age
     ,avg(score)
from student
group by age
having avg(score) > 80
-- 结果为16岁

案例4:查询学生年龄平均分大于80分中,男生的信息(姓名,男生的分数)

select
    name
    ,sex
    ,age
    ,score
from student
where sex = '男'
group by name,sex,age,score
having avg(score) > 80

结果:

总结 

到此这篇关于MySQL中having关键字详解以及与where区别的文章就介绍到这了,更多相关MySQL having关键字与where区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 设置MySQL自动增长从某个指定的数开始方法

    设置MySQL自动增长从某个指定的数开始方法

    下面小编就为大家带来一篇设置MySQL自动增长从某个指定的数开始方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • MySQL中的回表和索引覆盖示例详解

    MySQL中的回表和索引覆盖示例详解

    索引覆盖是一种避免回表查询的优化策略,具体的做法就是将要查询的数据作为索引列建立普通索,下面这篇文章主要给大家介绍了关于MySQL中回表和索引覆盖的相关资料,需要的朋友可以参考下
    2021-09-09
  • Linux虚拟机下mysql 5.7安装配置方法图文教程

    Linux虚拟机下mysql 5.7安装配置方法图文教程

    这篇文章主要为大家详细介绍了Linux虚拟机下mysql 5.7安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • mysql error 1071: 创建唯一索引时字段长度限制的问题

    mysql error 1071: 创建唯一索引时字段长度限制的问题

    这篇文章主要介绍了mysql error 1071: 创建唯一索引时字段长度限制的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • MySQL使用show effective grants查看权限官方解读

    MySQL使用show effective grants查看权限官方解读

    这篇文章主要为大家介绍了MySQL使用show effective grants查看权限,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • sphinxql如何得到结果数及show meta的详细说明

    sphinxql如何得到结果数及show meta的详细说明

    想用sphinxql只得到结果数。跟mysql里的count(*)一样
    2013-02-02
  • 解决MySQL8.0安装第一次登陆修改密码时出现的问题

    解决MySQL8.0安装第一次登陆修改密码时出现的问题

    这篇文章主要介绍了解决MySQL8.0安装第一次登陆修改密码时出现的问题,在文章开头给大家介绍了mysql 8.0.16 初次登录修改密码的方法,需要的朋友可以参考下
    2019-06-06
  • mysql删除语句超详细汇总

    mysql删除语句超详细汇总

    这篇文章主要给大家介绍了关于mysql删除语句超详细汇总的相关资料,SQL是用于访问和处理数据库的标准的计算机语言,简称结构化查询语言,SQL中的删除语句有多种方法,这里总结下,需要的朋友可以参考下
    2023-08-08
  • Mysql给普通分页查询结果加序号实操

    Mysql给普通分页查询结果加序号实操

    这篇文章主要介绍了Mysql给普通分页查询结果加序号实操,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • MySQL Workbench安装及使用详解

    MySQL Workbench安装及使用详解

    MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,这篇文章主要介绍了MySQL Workbench安装及使用,需要的朋友可以参考下
    2022-10-10

最新评论