首页 新闻 会员 周边

sql问题之where条件的优先级

0
悬赏园豆:10 [已解决问题] 解决于 2018-10-18 17:21

sql问题之where条件的优先级

如果我一个查询里边
过滤,where 子句
用了datetime > 2015-01 and sex = 1

比如数据有100万
肯定是先用datetime过滤要滤到1大批数据了

假如datetime 过滤后,有10万数据符合条件

先用sex,有50万数据符合条件.

我肯定是希望先用datetime来过滤,然后再用sex过滤.

还是我根本不用考虑,系统底层无差别?

我在用sql server.

SmallDong的主页 SmallDong | 初学一级 | 园豆:75
提问于:2015-11-05 12:40
< >
分享
最佳答案
1
运算符
1
~(位非)
2
*(乘)、/(除)、%(取模)
3
+(正)、-(负)、+(加)、(+连接)、-(减)、&(位与)、^(位异或)、|(位或)
4
=、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
5
NOT
6
AND
7
ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
8
=(赋值)
收获园豆:5
CaiYongji | 小虾三级 |园豆:1267 | 2015-11-05 13:40

按这个优先级是不是可以这样理解,

Select ID From TableA Where datetime > 2015-01 and sex = 1

会先计算">"

然后是"="

 

所以会先过滤日期,再过滤性别?

SmallDong | 园豆:75 (初学一级) | 2015-11-06 10:45

@SmallDong: 按照ANSI SQL 的规范是先判断后面(sex=1)再判断前面( datetime > 2015-01),不过现在的数据库都有自己的optimizer,对where会自行做出判断,比如oracle10g以上。

有时可以为了sql的可读性而忽略这个顺序。

CaiYongji | 园豆:1267 (小虾三级) | 2015-11-06 10:50
其他回答(9)
0

你不用考虑这事,Bill.Gates考虑了就行。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-11-05 14:20

Sql Server有盖茨叔叔参与么?

支持(0) 反对(0) SmallDong | 园豆:75 (初学一级) | 2015-11-06 10:43
0

where后面就是逻辑值,这些逻辑值是不考虑先后的。比如,我和你,与你和我,表达的逻辑是一样的。所以where 后面条件先后书写是没有关系的。这个由优化器自己来控制的。理论上系统会先过索引,排除量大等这种,也就是更优的。

想起以前一个面试,一个面试官问where 后面执行是从左向右还是从右向左。我说没有顺序,他就说 你不知道为什么要乱说,然后我就说有索引字段与没有索引字段然后互换位置,这个很明显是要使用到索引的(正常数据分布),他面试我的很多问题都说了一句 你不知道你为什么要这样说。还有就是我的回答同他想得一样的,他就说:你是本来就知道还是在哪里看到的? 这确实不能接受,我就算是做面试题记的,那也是我学到的啊。最后很多问题谈不到一起,我就只能说,你可以在计算机上试试。扯远了。但是计算机底层这些都会是有执行顺序的。条件毕竞要一个一个执行,但是不会是从左向右,或者是从右向左。

gw2010 | 园豆:1487 (小虾三级) | 2015-11-05 17:40

嗯,有人建议我看看Sql Server的执行计划,我先试试看能不能找到答案

ps,面试官水平有高有低,不必纠结.

支持(0) 反对(0) SmallDong | 园豆:75 (初学一级) | 2015-11-06 10:43
0

通常是将过滤数据量大的条件靠近 where 

Zery | 园豆:6151 (大侠五级) | 2015-11-06 10:40

你是指写条件的时候,按先后顺序?比如例子中提到的?

Select ID From TableA
Where
datetime > 2015-01 and sex = 1

 

 

支持(0) 反对(0) SmallDong | 园豆:75 (初学一级) | 2015-11-06 10:42

@SmallDong: 一般在情况下 条件都是从左向右 执行,但是这个并不是一定的,具体的还是要看sqlserver的分析它选择一种最为高效的 执行计划

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2015-11-06 10:52
0

datetime 建好索引就行了,查询的列建议建好索引

xmj112288 | 园豆:126 (初学一级) | 2015-11-07 21:34
0

1,优先级是sql server 底层 query engine 决策的,决策的依据是统计信息对象

2,统计信息对象可以跟索引有关,也可以无关。

收获园豆:5
悦光阴 | 园豆:2251 (老鸟四级) | 2015-11-12 23:14
0

你得是是一条一条过滤,两个条件同时符合才符合过滤标准,如果你想要有优先级,可以采用嵌套查询

 
新年新气象 | 园豆:210 (菜鸟二级) | 2015-11-17 18:59
0

执行计划能告诉你想要的答案

三个小圈圈 | 园豆:206 (菜鸟二级) | 2015-12-02 17:09
0

优化器会自己选择,不过还是要看 执行计划是否是想要的结果 

Double_K | 园豆:173 (初学一级) | 2015-12-02 18:26
0

上面这些回答说的很多,where后面的条件都是不用管的,都是优化系统自己去优化了,先会去执行有索引的查询条件。

如果你想要优化sql,最好是能让查询语句使用到索引。

Merger | 园豆:225 (菜鸟二级) | 2017-04-12 13:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册