sql问题之where条件的优先级
如果我一个查询里边
过滤,where 子句
用了datetime > 2015-01 and sex = 1
比如数据有100万
肯定是先用datetime过滤要滤到1大批数据了
假如datetime 过滤后,有10万数据符合条件
先用sex,有50万数据符合条件.
我肯定是希望先用datetime来过滤,然后再用sex过滤.
还是我根本不用考虑,系统底层无差别?
我在用sql server.
运算符 1 ~(位非) 2 *(乘)、/(除)、%(取模) 3 +(正)、-(负)、+(加)、(+连接)、-(减)、&(位与)、^(位异或)、|(位或) 4 =、>、<、>=、<=、<>、!=、!>、!<(比较运算符) 5 NOT 6 AND 7 ALL、ANY、BETWEEN、IN、LIKE、OR、SOME 8 =(赋值)
按这个优先级是不是可以这样理解,
Select ID From TableA Where datetime > 2015-01 and sex = 1
会先计算">"
然后是"="
所以会先过滤日期,再过滤性别?
@SmallDong: 按照ANSI SQL 的规范是先判断后面(sex=1)再判断前面( datetime > 2015-01),不过现在的数据库都有自己的optimizer,对where会自行做出判断,比如oracle10g以上。
有时可以为了sql的可读性而忽略这个顺序。
你不用考虑这事,Bill.Gates考虑了就行。
Sql Server有盖茨叔叔参与么?
where后面就是逻辑值,这些逻辑值是不考虑先后的。比如,我和你,与你和我,表达的逻辑是一样的。所以where 后面条件先后书写是没有关系的。这个由优化器自己来控制的。理论上系统会先过索引,排除量大等这种,也就是更优的。
想起以前一个面试,一个面试官问where 后面执行是从左向右还是从右向左。我说没有顺序,他就说 你不知道为什么要乱说,然后我就说有索引字段与没有索引字段然后互换位置,这个很明显是要使用到索引的(正常数据分布),他面试我的很多问题都说了一句 你不知道你为什么要这样说。还有就是我的回答同他想得一样的,他就说:你是本来就知道还是在哪里看到的? 这确实不能接受,我就算是做面试题记的,那也是我学到的啊。最后很多问题谈不到一起,我就只能说,你可以在计算机上试试。扯远了。但是计算机底层这些都会是有执行顺序的。条件毕竞要一个一个执行,但是不会是从左向右,或者是从右向左。
嗯,有人建议我看看Sql Server的执行计划,我先试试看能不能找到答案
ps,面试官水平有高有低,不必纠结.
通常是将过滤数据量大的条件靠近 where
你是指写条件的时候,按先后顺序?比如例子中提到的?
Select ID From TableA Where datetime > 2015-01 and sex = 1
@SmallDong: 一般在情况下 条件都是从左向右 执行,但是这个并不是一定的,具体的还是要看sqlserver的分析它选择一种最为高效的 执行计划
datetime 建好索引就行了,查询的列建议建好索引
1,优先级是sql server 底层 query engine 决策的,决策的依据是统计信息对象
2,统计信息对象可以跟索引有关,也可以无关。
你得是是一条一条过滤,两个条件同时符合才符合过滤标准,如果你想要有优先级,可以采用嵌套查询
执行计划能告诉你想要的答案
优化器会自己选择,不过还是要看 执行计划是否是想要的结果
上面这些回答说的很多,where后面的条件都是不用管的,都是优化系统自己去优化了,先会去执行有索引的查询条件。
如果你想要优化sql,最好是能让查询语句使用到索引。