where 和 having之间的区别【mysql】

硅谷探秘者 2126 0 0

在看这篇文章之前相信你对sql的语法顺序和执行顺序已经有了足够的认识。如果还不了解sql的语法顺序和执行顺序请点击 sql的语法顺序和执行顺序 http://www.jiajiajia.club/blog/artical/236 查看。

1.where、聚合函数、having的执行顺序

        where>聚合函数(sum,min,max,avg,count)>having


2.作用

        where关键字的作用是过滤,选取符合条件的记录,而having关键字的作用则是,为聚合结果指定条件。


3.执行时机

        where是数据从磁盘读入内存时的条件,而having是分组统计时条件,所以having是在对select查询的字段中进行的操作。其实having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。

4.执行条件

        where的执行条件是数据表中存在的字段。而不是查询结果集中存在的字段,因为从sql执行的顺序中可知,表达式计算的时期要在where条件之后。

        例如  SELECT id,a,b,(a+b) as c from test WHERE c=3 

        则会报错 > 1054 - Unknown column 'c' in 'where clause'


        having的执行条件是查询的结果集中存的字段或分组的字段。因为having执行要在where条件之后。另外若须引入聚合函数来对group by 结果进行过滤 则只能用having。

        例如 SELECT id,b,(a+b) as c from test having c=3  不会报错

        但是 SELECT id,b,(a+b) as c from test having a=3 则会报错 > 1054 - Unknown column 'a' in 'having clause' 因为a字段没有在查询列中。

        但是如果变成 SELECT id,b,(a+b) as c from test GROUP BY a having a=3 字段a经过分组后不会报错。因为select语句的执行顺序在from和having之后,虽然select最后的结果集中没有a字段,但是执行from的结果集的虚拟表中是存在a字段的,因为需要用它分组。


5.需要注意的是

        1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。 

        2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 

        3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。



评论区
请写下您的评论...
暂无评论...
猜你喜欢
计算机网络基础 2686 。字节:8个二进制位构成1个"字节(Byte)",它是存储空基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节存储空。KB:在一般计量单位中,通常K表示10
javascript,前端 958 jsjavascriptforinforof,forof遍历原理 一、 forin是ES5语法,forof是ES6语法forin是无序遍历数组或对象,也就是随机遍历,不按照顺序来
weblog 1162 根本:进程是操作系统资源分配基本单位,而线程是处理器任务调度执行基本单位。包含关系:一个进程内可以有多个线程(默认有一个主线程),线程是进程一部分,必须依赖于进程而存在,不能独立存在。资源共享:进程是不共享资源,多个线程是共享资源,所以存在资源竞争问题。
vue 671 true时,都会占据页面位置 二、v-show与v-if 控制手段不同编译过程不同编译条件不同 控制手段:v-show隐藏则是为该元素添加css—display:none,dom元素依旧还在。v-
算法基础 1196 引结构,数据文件是(主键)索引绑在一起。MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引数据文件是分离,索引保存是数据文件指针。4.InnoDB支持表、行(默认)级锁,而My
weblog 3844 String类实现及其不可变性 对于String类实现从源码中可以看出,String类底层维护着一个final修饰char数组,用来储存字符。并且除了hash这个属性其它属性都声明为
java基础 3176 1.什么是线程通信线程通信两个基本问题是互斥同步。线程同步是指线程所具有一种制约关系,一个线程执行依赖另一个线程消息,当它没有得到另一个线程消息时应等待,直到消息到达时才被唤醒
weblog 4410 intInteger 说起intInteger大家耳熟能详是: int是java中基本数据类型,而Integer是引用类型。 Integer必须实例化后才能使用,而
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。