• SQL:HAVING 和 WHERE


    参考:SQL中where与having的区别  博主永恒的留忆

    一、where和having的区别

    • where:

      1. where 是一个约束声明使用 where 来约束来自数据库的数据
      2. where 是在结果返回之前起作用的;
      3. where 中不能使用聚合函数;
    • having:

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

    二、聚合函数和 group by

    • 聚合函数就是例如 SUM、COUNT、MAX、AVG 等对一组(多条)数据操作的函数,需要配合 group by 来使用;
      • 如:
      • SELECT SUM(population), region FROM T01_Beijing GROUP BY region; //计算北京每个分区的人数
    • 如果 SELECT 后跟多个字段名,并且这些字段不再聚合函数内,则要将所有的字段名都跟在 GROUP BY 后;
      • 如果 GROUP BY 后只跟其中的一个字段,则分组后会随机在其它字段中选择一个
      • 例:

        • SELECT col_1, col_2, col_3
          FROM tbl_name
          GROUP BY col_1;
        • 注:按 col_1 分组后,针对每一个分组,只会随机从col_2 和 col_3 中选择一个
        • 因此要在 GROUP BY 后跟上 3 个字段名;

    三、where 和 having 的执行顺序

    • where 早于 group by 早于 having;
      • where 子句在聚合前先筛选记录,也就是说作用在 group by 子句和 having 子句前,而 having 子句在聚合后对组记录进行筛选

    四、where 不能使用聚合函数、having 中可以使用聚合函数

    • 例 1:筛选出北京西城、东城、海淀及各区学校数量

      • SELECT region,count(school) 
        FROM T02_Bejing_school 
        WHERE region IN ('海淀' , '西城' , '东城') GROUP BY region;
    • 例 2:筛选出北京西城、东城、海淀三个区中学校数量超过10所的区及各区学校数量

      • SELECT region,count(school) 
        FROM T02_Bejing_school 
        WHERE region IN ('海淀' , '西城' , '东城') 
        GROUP BY region HAVING count(school) > 10;
    • 注:

      • 不能用 where 来筛选超过学校数量超过10 的区,因为表中不存在这样一条记录;而 HAVING 子句可以让我们筛选成组后的各组数据
  • 相关阅读:
    (三)mybatis 的使用(入门)
    (二)mybatis框架原理(图解)
    (一)使用 mybatis 的缘由
    (八)Spring 事务管理
    (七)Spring 配置 c3p0 连接池
    (六)Spring 中的 JdbcTemplate
    熔断监控集群(Turbine)
    熔断监控面板(Hystrix Dashboard)
    容错机制和熔断(Hystrix)
    服务消费和负载(Feign)
  • 原文地址:https://www.cnblogs.com/volcao/p/13766531.html
Copyright © 2020-2023  润新知