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
随机推荐
- 【ACM-ICPC 2018 沈阳赛区网络预赛 K】Supreme Number
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然每个数字只可能是1,3,5,7 然后如果3,5,7这些数字出现两次以上.显然两个3||5||7都能被11整除. 然后1的话最多能 ...
- 专访Bruce Douglass,谈嵌入式经验
Bruce:表面上看,编程就是想要实现什么就写什么代码:但事实是,敲代码只是软件开发过程中很小的一部分,程序员的工作还包括安全分析.责任分析.产品验证.产品分析等. =========== ...
- osEye.Net:离别是为了将来的重逢
这一时刻已经成为osEye历史..... 在热心网友的关怀和鼓励之下,osEye.net将继续运行着,感谢你们陪伴osEye一起走过.... 与你相知相恋已经有4个年头了,你的成长到成熟都让我历历在目 ...
- Yarn架构基本概况(二)
在概况(一)中,主要简单的对Yarn的情况作了简单的介绍,今天花一定时间在某些详细的模块上呈现下面Yarn的总体情况.帮助大家更好的理解Yarn. 1)ResourceManager 在Yarn的总体 ...
- 为代码减负之<三>视图(SQL)
在设计数据库时为了降低数据冗余.一般都会依照三范式去设计,但有时我们在查询时须要通过一字段获取跟这 个字段相关联的好几个字段.可是他们又分布在不同的表中,这时候假设依照正常途径走的话须要同一时候查询好 ...
- Android自己定义View之组合控件 ---- LED数字时钟
先上图 LEDView效果如图所看到的. 之前看到一篇博客使用两个TextView实现了该效果.于是我想用自己定义控件的方式实现一个LEDView.使用时就可以直接使用该控件. 採用组合控件的方式,将 ...
- BZOJ 2751 容易题(easy) 快速幂+快速乘
2751: [HAOI2012]容易题(easy) Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i] ...
- angularjs1-6,自定义服务
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- PHPStorm中使用bootstrap3控件!
PHPStorm中使用bootstrap3控件! 奇怪为什么不自动提示呢? 原来需要Ctrl+j才显示出来! 很方便的控件!!!!
- NSKeyedArchiver
如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法进 ...