zoukankan      html  css  js  c++  java
  • mysql where和having的区别

    简单描述:需要查询一个数量count,于是做分组查询后,发现有的数据没有过滤掉,于是就想加上过滤条件,就在group by后边写了where ,发现不好使,直接就报错了,查了一下,where只能写在group by前边,要想在后边加限制条件,应该使用having关键字

    直接放结果:

    先说一下聚合函数:

      count(a):遇到每个元素 a就加1

      其他的还有:

      MAX(a)和MIN(a):分别记录迄今为止见到的任意元素在属性a上的最大值或最小值,如果遇到了,就替换掉。

      sum(a):如果a不为null,则将值累加到输出值上

      AVG(a):计算出sum和count,然后相除

    通常通过group by来比较where 和 having。这里说的是通常,并不是说having必须和group by连用,下面会进行说明

    先来一条sql:

    select sum(score) from student where gender='boy' group by name having sum(score)>210;

    其次我们经常写的sql 就是 select count(a),sum(b) ....from tableName where .... 聚合函数都是在where 条件之前的,说明聚合函数的执行级别高于where

    然后where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,也就是在分组之前过滤数据,条件中不能包含聚和函数,使用where条件限制特定的行。 

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

    总之一条sql中有where having group by的时候,顺序是 where  group by having

    where和having都可以使用的场景:

        select price,name from goods where price > 100
        select price,name from goods having price > 100

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

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

        select name from goods where price> 100
        select name from goods having price> 100 //报错!!!因为select没有筛选出price 字段,having不能用,而where是对表进行检索price。100

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

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

        select id, avg(price) as agprice from goods group by id having agprice > 100
        select id, avg(price) as agprice from goods where agprice>100 group by id //报错!!因为from goods这表里面没有agprice这个字段
  • 相关阅读:
    C博客作业00我的第一篇博客
    html5 canvas中CanvasGradient对象用法
    Java 多线程总结
    查看和设置MySQL数据库字符集(转)
    (原)QQ表情弹出框的制作(凑热闹)
    [转]模版方法(Template Method)
    .net Smtp Email工具V1
    [转]迭代器模式(Iterator Pattern)
    (原)可自定义Item子项的ListBar控件V1.0
    使用C#实现ADSL自动拨号
  • 原文地址:https://www.cnblogs.com/xuchao0506/p/9766234.html
Copyright © 2011-2022 走看看