• Mysql中的WHERE与HAVING


    MySQL关键字的执行顺序

    从上面可以看出 WHERE 和 HAVING 都是做查询过滤。但是它们的效率以及执行顺序是不一样的!!!

    聚合函数:

    WHERE 条件是首先过滤数据,然后再使用聚合函数,但是如果需要在聚合函数或者是分组后的结果进行条件筛选则需要使用 HAVING 继续过滤。

    1)WHERE 和 HAVING 的区别

    WHERE:

      WHERE 是一个约束声明,使用 WHERE 来约束来自数据库的数据;

      WHERE 在结果返回之前起作用的;

      WHERE 中不能使用聚合函数;

    HAVING:

      HAVING 是一个过滤声明;

      在查询返回结果集之后,对查询结果进行的过滤操作;

      在 HAVING 中可以使用聚合函数。

    2)聚合函数 和 GROUP BY

    聚合函数是指 SUM、COUNT、MAX、AVG 等对一组(多条)数据操作的函数,需要配合 GROUP BY 来使用。

    SELECT SUM(人口),地区 FROM 北京 GROUP BY 地区;/* 计算北京每个分区的人数 */ 

    3)WHERE 和 HAVING 的执行顺序 

    WHERE > GROUP BY > HAVING

    WHERE 子句在聚合前先筛选记录,也就是说作用在 GROUP BY 和 HAVING 子句前,而 HAVING 子句在聚合后对组记录进行筛选。  

    4)WHERE 不能使用聚合函数,HAING 能够使用聚合函数

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

    注意:我们不能用 WHERE 来筛选学校数量超过10的区,因为表中不存在这样一条记录。而 HAVING 子句可以让我们筛选成组后的各组数据。

    - 总结

    ① WHERE 条件后面不能跟聚合函数,因为 WHERE 执行顺序大于聚合函数,如果需要用聚合函数作为过滤条件则用 HAVING。

    ② HAVING 通常是对分组以后的数据进行筛选,所以一般都是使用 GROUP BY 或者聚合函数后使用,而 WHERE 是在分组前对数据进行过滤。

  • 相关阅读:
    定义 : angular view 和controller 之前的 ng-init 由谁来负责
    pl/sql如何在云端服务器上新建数据库
    oracle连接服务器上数据库
    svn check下来的代码在eclipse中没有run on server
    sql server在修改表结构后不能保存
    用mybatis-generator自动生成代码报“前言中不允许有内容”
    启动Tomact时报failed to start conponent
    spring MVC中controller失效
    maven项目中连接sqlserver和mysql的区别
    DBCP连接池的配置
  • 原文地址:https://www.cnblogs.com/Dm920/p/13920243.html
Copyright © 2020-2023  润新知