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

随机推荐

  1. HTML常用标签简介及快速入门

    此HTML常用标签简介编写的目的,是给一个经常使用网页编辑器的一个朋友提供一个快速熟悉和入门HTML的途径. 现在分享出来,给其他有类似需求的朋友,此处只列出了编辑文章时最常用和遇到的标签,完整标签页 ...

  2. 00068_Date类

    1.类Date表示特定的瞬间,精确到毫秒: 2.查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象: //创建日期对象,把当前的毫 ...

  3. 【hdu 6342】Expression in Memories

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把所有的问号都改成'1' 然后会发现只有+0?这种情况 需要把?改成+. 看看这样的0后面的1是不是由问号改过来的就好了.是的话 再 ...

  4. 2015 Multi-University Training Contest 7 hdu 5378 Leader in Tree Land

    Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. OpenFace Docker 使用简介

    在Docker中使用openface最大的问题是数据与主机的交互,下面我介绍几种方法来实现主机与Docker容器的数据交互. 1.第一种也是最方便的一种方法是在进入容器时使用-v参数将主机的目录挂载到 ...

  6. HDU 5045 DP+状压

    2014 ACM/ICPC Asia Regional Shanghai Online 给出N个人做M道题的正确率,每道题仅仅能由一个人做出,而且当全部人都做出来且仅做出一道题时,做过题的人才干够继续 ...

  7. 每一个程序猿都须要了解的一个SQL技巧

    对于数据过滤而言CHECK约束已经算是相当不错了.然而它仍存在一些缺陷,比方说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它仅仅在特定条件下才生效. 使用SQL标准的WITH CHECK ...

  8. crawler4j多线程爬虫统计分析数据

    该事例演示了如何在多线程中统计和分析数据: 首先建一个状态实体类CrawlStat: package com.demo.collectingData; /** * 爬虫状态实体类 统计爬虫信息 * @ ...

  9. BZOJ 2120 带修莫队

    思路: 暴力能过的 嘿嘿嘿 我是来练带修莫队的嗯 复杂度 O(n^5/3) //By SiriusRen #include <cmath> #include <cstdio> ...

  10. apache配置httpd.conf的webapp根目录(基于appserv服务)

    只要修改httpd.conf中两个配置项的值即可: DocumentRoot "E:/workspacePHP/what" <Directory "E:/works ...