MySQL having关键字详解、与where的区别

news/2024/11/8 16:46:05/

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的区别

  1. 一般情况下,where用于过滤数据行,而having用于过滤分组(能用where的地方,不要使用having)
  2. where中不能出现聚合函数,而having可以使用聚合函数作为条件
  3. where在数据分组前进行过滤,而having在数据分组后进行过滤(因此where效率一般比having高);where是数据从磁盘读入内存时筛选,而having是在内存中筛选
  4. where是对数据库文件过滤(过滤条件是表中的字段),而having是对select中查询的字段进行过滤
  5. 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使用的错误:

selectid,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会报错
selectage,avg(score)
from student
group by age
having avg(score) > 80
-- 结果为16岁

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

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

结果:


http://www.ppmy.cn/news/40543.html

相关文章

window11使用yarn安装@vue/cli vue-V显示不是内部命令

配置环境变量 yarn global dir查看路径 找到node_modules下的bin

Spring(Ioc和Bean的作用域)

Spring Spring为简化开发而生,让程序员只关心核心业务的实现,尽可能的不在关注非业务逻辑代码(事务控制,安全日志等)。 1,Spring八大模块 这八大模块组成了Spring 1.1 Spring Core模块 这是Spring框架的…

VR全景乡村,VR全景,身临其境,感受自然

随着科技的不断发展,人们对于旅游体验的需求也在不断提升。而传统的旅游方式,虽然能够让人们亲身感受到自然风光和人文景观的美丽,但却难以完全满足人们对于旅游的多元化需求。而VR全景乡村这种全新的乡村旅游体验方式,则为人们带…

Golang中的JSON使用技巧

我们使用Golang开发后台时,经常会和JSON打交道,使用JSON主要是使用官方的encoding/json库,这里介绍一些和json库相关的使用技巧 关于性能 传说中老有人说官方库性能不算很好,有更好的选择,但我们基本的场景都感觉不到…

Pandas 秘籍:1~5

原文:Pandas Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 一、Pandas 基础 在本章中,我们将介绍以下内容: 剖析数据帧的结构访问主要的数据帧组件了解数据类型选择单列数据作为序列调用序列方法与运算符一起使用序列将…

思科ASA防火墙: 接口配置名称 安全等级 acl防控列表

环境:上图环境 win10 内 ip:192.168.1.1 /24 网关 : 192.168.1.254 win10 外 ip: 172.12.12.1 /24 网关 :172.12.12.254 asa e0/0接口 : 192.168.1.254 e0/1 接口 : 172…

TCP并发服务器模型

文章目录1. 循环服务器2. 并发服务器2.1 多进程并发服务器2.2 多线程并发服务器3. 基于TCP的文件传输服务(目前只有下载)1.tftp下载模型2.TFTP通信过程总结3.tftp下载协议分析1. 循环服务器 一次只能处理一个客户端,等这个客户端退出后,才能处理下一个客…

Linux嵌入式学习之Ubuntu入门(四)Makefile

系列文章目录 一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构 二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 三、Linux嵌入式学习之Ubuntu入门(三)用户、用户组…