• where和having


    where可以不能使用别名作为过滤条件,而having可以使用别名作为过滤条件。

    在ORACLE中,select 语句的执行顺序是: 
    1. from语句 
    2. where语句(结合条件) 
    3. start with语句 
    4. connect by语句 
    5. where语句 
    6. group by语句 
    7. having语句 
    8. model语句 
    9. select语句 
    10. union、minus、intersect等集合演算演算 
    11. order by语句

    在SQLServer中,select语句的执行顺序是: 
    (1)FROM JOIN ON 
    (2)WHERE 
    (3)GROUP BY 
    (4)HAVING 
    (5)SELECT DISTINCT TOP() 
    (6)ORDER BY

    select语句在where子句执行的时候,取别名的语句还没执行,即该别名不存在,所以where不能使用别名,而order by的时候别名就已经命名好了。

    同时,如果在from子句中指定了表别名,那么它所在的select 语句中其他子句都必须使用表别名来代替原始的表名,因为from子句是select语句中最先被执行的。

    where和having的区别

    先看一段代码:

    1.
    SELECT name,SUM(score) FROM table_name
    GROUP BY name
    HAVING name='小明';
    
    2.
    SELECT name,SUM(score) FROM table_name
    WHERE name='小明'
    GROUP BY name;

    这两段语句得到的结果是一样的。

    那么他们两者的区别在哪呢?

    首先,Where 子句是用来指定 "行" 的条件的,而Having 子句是指定 “组” 的条件的,即

    Where 子句 = 指定行所对应的条件

    Having 子句 = 指定组所对应的条件

    因此,2 语句会比较合适。

    WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。   

    HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

    其次,当在Where子句和Having子句中都可以使用的条件,从语句的执行效率来看,最好写在Where子句中。

    此外,Where子句中不能使用聚合函数,而Having子句中可以。

    两者的执行顺序:

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

    若须引入聚合函数来对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 条件显示特定的组,也可以使用多个分组标准进行分组。

    在执行速度上来说:

    在使用Count函数等对表中的数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度

    使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就要多得多。

    使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度。

    参考:

    http://www.cnblogs.com/dwfbenben/archive/2013/09/07/3307941.html

    https://blog.csdn.net/paranoidyang/article/details/65449830

    https://www.cnblogs.com/houjx/p/9641404.html

    https://www.cnblogs.com/bluecountry/p/5571244.html

    https://keep.iteye.com/blog/240665

  • 相关阅读:
    2. Add Two Numbers
    8. String to Integer (atoi)
    18. 4Sum
    15. 3Sum
    1. Two Sum
    227. Basic Calculator
    7. Reverse Integer
    PostMessage和SendMessage的区别
    Date Time Picker控件
    git 设置和取消代理
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/10418047.html
Copyright © 2020-2023  润新知