当前位置: 首页 > news >正文

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

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

相关文章:

  • CSS中相对定位与绝对定位的区别及作用
  • 7.1 基本运放电路(1)
  • 交友项目【首页推荐,今日佳人,佳人信息】
  • kafka-5 kafka的高吞吐量和高可用性
  • Jmeter前置处理器和后置处理器
  • 手把手带你了解《线程池》
  • idea中使用git工具
  • 剖析DLL(动态链接库)的使用方法
  • 第二章 设计模式七大原则
  • 计网第五章.运输层—TCP报文的首部
  • 程序员最新赚钱指南!
  • 如何快速获取淘宝商品的详细信息?看这里就够了
  • id生成器
  • 为什么许多人吐槽C++11,那些语法值得我们学习呢?
  • 千耘农机导航的“星地一体”能力究竟是什么?
  • (数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换
  • 舌体胖瘦的自动分析-曲线拟合-或许是最简单判断舌形的方案(六)
  • 牛顿法、梯度下降法与拟牛顿法
  • 带你浅谈下Quartz的简单使用
  • C++ cout格式化输出
  • 查询练习:复制表的数据作为条件查询
  • Thymeleaf select回显并选中多个
  • 【Go 基础】变量
  • 国网B接口语音对讲和广播技术探究及与GB28181差别
  • 非计算机专业如何转行成为程序员?我用亲身经历教你用这三种方法
  • 2023年最新网络安全渗透工程师面试题汇总!不看亏大了!
  • 红黑树(C++实现)
  • leetcode尊享面试 100 题 - 1427. 字符串的左右移
  • 进来看看!跨境电商要这样选品才能做出爆款
  • 什么是深度学习?