zoukankan      html  css  js  c++  java
  • Mysql中Group By使用Having语句配合查询(where和having区别)

    注意 :

    having语句一般结合GROUP BY一起使用的。。。。。

    Having短语与WHERE的区别!!!


    WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

    where是从查询满足条件的数据,用于查询数据之前;having用于在查出的数据中挑选满足条件的数据,在数据查出来之后处理。

    select语法的顺序问题:

    select  一般在的后面的内容都是要查询的字段
    
    from  要查询到表
    
    where
    
    group by
    
    having  分组后带有条件只能使用having
    
    order by 
    
     limit 0,100  它必须放到最后面

    下面我们举例说明

    首先我们创建这么一张表:
    这里写图片描述

    简单的介绍一下每一个域的意思:JOB—工种、SAL—–工资、DEP—–部门

    插入数据:
    这里写图片描述

    需求:从该表中筛选出工种不是“M” ,以部门来划分平均工资大于28000,按降序排列的记录。

    代码:

    SELECT
      DEP,
      JOB,
      AVG(SAL)
    FROM EMPL
    WHERE JOB <> 'M'
    GROUP BY DEP, JOB
    HAVING AVG(SAL) > 28000
    ORDER BY 3 DESC;

    我们来一步一步地剖析这个长SQL语句:

    第一,from得到的是所有的表中的记录,也就是:
    这里写图片描述

    第二,where 得到

    这里写图片描述

    第三步,group by DEP,JOB得到
    这里写图片描述

    第四步,having avg(SAL)>28000
    也就是从所得的五个分组中找出平均工资大于28000的分组,也就是第二、四、五组

    这里写图片描述

    第五步就是降序排列:(当然SELECT我们一直在使用,其实这以整句的查询是有六个子句的)所以最终结果就是

    这里写图片描述

    这里有一个值得注意的地方就是,当我们把查询结果的第三个域改为SAL的时候,查询结果会怎么样呢?

    SELECT
      DEP,
      JOB,
      SAL
    FROM EMPL
    WHERE JOB <> 'M'
    GROUP BY DEP, JOB
    HAVING AVG(SAL) > 28000
    ORDER BY 3 DESC;
      那么结果就是每一个组中的第一条记录的SAL,这是没有任何实际意义的,因为这既不是最多的工资,也不是最小的工资,他只是每一个组中的第一条记录对应的SAL 

    这里写图片描述

    正如我上面所说的一样,31000是BLU这组的第一条记录的SAL,33000是GRE这一组的第一条记录的SAL,32000是RED这一组的第一条记录

    看一下查询结果:
    这里写图片描述

    所以我们在投影的时候一定要特别注意每一个域的实际意义!

    一定要记住这一条规则

    SELECT子句中包含集函数

    SELECT子句中包含的列:
    1、在集函数中的列
    2、不在集函数中的列–这些列必须全部包含在GROUP BY子句中。

    (即使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 )

    -------------------------另一种解释----------------

    聚合函数是比较where、having 的关键。 
    开门见山。where、聚合函数、having 在from后面的执行顺序:

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

    列出group by来比较二者。()因where和having 在使用group by时问的最多) 
    若须引入聚合函数来对group by 结果进行过滤 则只能用having。(此处不多说,自己想 是先执行聚合函数还是先过滤 然后比对我上面列出的执行顺序 一看便知)

    例如:

    select sum(score) from student  where sex='man' group by name having sum(score)>210

    注意事项 : 
      1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。 
      2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 
      3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

  • 相关阅读:
    idea 设置默认的maven
    IDEA中Tomcat部署时war和war exploded区别
    所谓的SaaS服务到底是什么?
    java8 Lambda表达式
    java8 :: 用法 (JDK8 双冒号用法)
    idea 本地调试,修改代码,代码自动生效
    nacos配置中心demo
    Logparser 的用法
    android软键盘的一些控制 转来的,格式有点乱
    TranslateAnimation 使用详解
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7834571.html
Copyright © 2011-2022 走看看