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. PHP 链接多种数据库 的方法
  2. 用C#通过正则表达式截取字符串中符合条件的子字符串
  3. 推荐10个 CSS3 制作的创意下拉菜单效果
  4. Visual Studio 2010 简体中文旗舰、专业版(MSDN原版下载)
  5. 什么是purge操作
  6. Regarding learning
  7. 去掉地址栏中的jsessionid
  8. Python实现kNN(k邻近算法)
  9. Jedis的JedisSentinelPool源代码分析
  10. mmap
  11. git设置忽略某些文件或文件夹
  12. 关于升级linux下apache
  13. nefu 115 斐波那契的整除
  14. Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串
  15. Java 并发类
  16. Zookeeper系列2 原生API 以及核心特性watcher
  17. JAVA学习调查问卷——20145101
  18. C# 窗体控件输入框大写
  19. springMVC入门-07
  20. C# Java 加密解密

热门文章

  1. Oracle查看哪些表被锁住了
  2. HDU 3567 Eight II
  3. C#中的==和Equals
  4. 关于sql连接查询(内联、左联、右联、全联)
  5. lpa标签传播算法解说及代码实现
  6. NAS配置Time Machine,在D-Link DNS-320上的配置笔记
  7. 21.QT二进制文件
  8. 关于spring和extjs对接的过程简述
  9. Makefile经典教程(转)
  10. Asp.net Web Api中使用配置Unity