zoukankan      html  css  js  c++  java
  • where子句和having子句区别

    感谢大佬:https://blog.csdn.net/XiaopinOo/article/details/78305008

    where子句和having子句的区别:

        1.where  不能放在group by后面

        2.having   是跟group by连在一起用的,放在group by 后面,此时的作用相当于where

        3.where  后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING可以。

    一、where子句

        where子句:where子句仅仅用于从from子句中返回的值,from子句返回的每一行数据都会用where子句中的条件进行判断筛选,where子句中允许使用比较运算符和逻辑运算符

    二、having子句

        having子句:having子句通常是与order by子句一起使用的,因为having的作用是对使用group by 进行分组统计后的结果进行进一步的筛选。

    三、下面通过where子句和having子句的对比,更进一步的理解他们

        在查询过程中聚合函数(SUM,MIN,MAX,AVG,COUNT)要比having子句优先执行,简单的理解为只有有了统计结果后我才能执行筛选。where子句在查询过程中执行优先级别优先于聚合函数(SUM,MIN,MAX,AVG,COUNT),因为他是一句一句筛选的,HAVING子句可以让我们筛选成组后的对各组数据筛选。而WHERE子句在聚合前筛选记录,如:现在我们想要部门号不等于10的部门并且工资总和大于8000的部门编号?

        分析:通过where子句筛选除部门编号不为10的部门,然后对部门工资进行统计,然后使用having子句对统计结果进行筛选。

       select deptno,sum(sa1) from emp

            where deptno!='10'  group by deptno

            having sum(sa1)>8000;

    四、异同点

        他们的相同之处就是定义搜索条件,不同之处是where子句为单个筛选而having子句和组有关,而不是与单个的行有关

         最后:理解having子句和where子句最好的方法就是基础select 语句中的那些句子的处理次序:where子句只能接受from子句输出的数据,而having子句则可以接受来自group by ,where或者from子句的输入。

    having子句会在分组后对分组形成的结果进行过滤。

    这个过程需要聚合、排序、因此如果通过where子句限制记录而省略掉having子句,是可以提升性能的。






    总结:
    where子句:是在分组之前使用,表示从所有数据中筛选出部分数据,以完成分组的要求,
    在where子句中不允许使用统计函数,没有group by子句也可以使用。
    having子句:是在分组之后使用的,表示对分组统计后的数据执行再次过滤,可以使用
    统计函数,有group by子句之后才可以出现having子句。

  • 相关阅读:
    积分第一中值定理
    History of mathematics(19th century)
    使用多项式解决矩阵问题
    菊与刀
    Mathematics during the Scientific Revolution(18th century)
    摄动
    Cauchy中值定理
    Leetcode3---Longest Substring Without Repeating Characters
    Leetcode2---Add Two Numbers
    矩形覆盖
  • 原文地址:https://www.cnblogs.com/tfxz/p/12621604.html
Copyright © 2011-2022 走看看