• SQL中Where与Having的区别


    “Where” 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。

    “Having”是一个过滤声明,在查询返回结果集以后对查询结果进行的过滤操作,Having是在结果返回之后起作用的  Having中可以使用聚合函数,

    注意:having 只能使用一个组函数, having 可以放在group by 前面

      

    HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选,通常放在group by 后面   。

    位置
    where 不能放在group by 后面
    having 是跟group by 连在一起用的,放在group by 后面,此时的作用相当于where

    异同点
         它们的相似之处就是定义搜索条件,不同之处是where子句为单个筛选而having子句与组有关,而不是与单个的行有关。
         最后:理解having子句和where子句最好的方法就是基础select语句中的那些句子的处理次序:where子句只能接收from子句输出的数据,而having子句则可以接受来自group by,where或者from子句的输入。

    在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选

    where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count),因为它是一句一句筛选的

    HAVING子句可以让我们筛选成组后的对各组数据筛选,而WHERE子句在聚合前先筛选记录。如:现在我们想要部门号不等于10的部门并且工资总和大于8000的部门编号?

    1. where和having都可以使用的场景

    select goods_price,goods_name from sw_goods where goods_price > 100
    select goods_price,goods_name from sw_goods having goods_price > 100

    解释:上面的having可以用的前提是我已经筛选出了goods_price字段,在这种情况下和where的效果是等效的,但是如果我没有select goods_price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

    2. 只可以用where,不可以用having的情况

    select goods_name,goods_number from sw_goods where goods_price > 100
    select goods_name,goods_number from sw_goods having goods_price > 100 //报错!!!因为前面并没有筛选出goods_price 字段

    3. 只可以用having,不可以用where情况

    查询每种goods_category_id商品的价格平均值,获取平均价格大于1000元的商品信息

    select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
    select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category //报错!!因为from sw_goods 这张数据表里面没有ag这个字段

    注意:where 后面要跟的是数据表里的字段,如果我把ag换成avg(goods_price)也是错误的!因为表里没有该字段。而having只是根据前面查询出来的是什么就可以后面接什么。

  • 相关阅读:
    【卷影副本】文件属性“以前的版本”中无法看到历史文件的解决方案
    合理的网间结算和互联网转接服务,电信敢正视吗?
    FTP无法连接可能是安全狗设置的原因
    播放器播放视频画面均变暗(但网页视频正常)的解决方案
    安装国际版firefox(火狐浏览器)并设置语言为中文
    navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO
    "COM Surrogate 已停止工作"解决方案(windows7 64位及32位)
    IIS7 http自动跳转到https(通过编辑Web.config实现)
    sql 时间处理
    制作时间戳和时间戳转标准日期时间等
  • 原文地址:https://www.cnblogs.com/youngerger/p/8462510.html
Copyright © 2020-2023  润新知