在oracle里where 后的优先级是怎么样的?
select * from t_table_a a
where (a.dw is null or a.dw='88888')
and (a.bj isnull or a.bj='9999')
我想要的是先查出学院为 ‘8888’或者学院为空的数据再在这些数据中找班级为 ‘99999’ 或者班级为空的数据。请问各位我这个写法是否有错??性能可以怎么提升 。谢谢(谢谢各位指正,已经改正表别名错误)
select * from t_table_a
where (a.dw is null or a.dw='88888')
and (a.bj isnull or a.bj='9999')
这个语句中,t_table_a 这个是表名,还是你想把t_table 设置别名 a,如果是后后者应该是
select * from t_table a
where (a.dw is null or a.dw='88888')
and (a.bj isnull or a.bj='9999')
否则你们后用 a.dw 是会报错的,因为你没有表a 或者别名为 a的表
select * from t_table a
isnull改为 is null
dw,bj排好序应该找的更快
用子查询
select * from t_table as a
where a.bj is null or a.bj='9999' and
a.dw in (select a.dw from t_table a where a.dw is null or a.dw='88888')
表没有别命名还是 少了空格什么的 t_table_a 应该是这种 t_table a , and (a.bj isnull or a.bj='9999') is null 中间也要有空格 where后边先后顺序基本不怎么影响查询结果集,数据少的话就这样没必要为性能去使sql变的繁琐,数据多的话就加索引,然后 尽量不使用or连接查询条件可以使用UNION, 至于sql的执行顺序可以参考下这个 http://t.csdn.cn/huSmn
a.dw is null or a.dw='88888',如果要查dw=88888的,前面的is null是不是多余了?个人意见,把is null 去掉。如果数据量大的话,在dw和bj列加上索引。
用子查询表示层级关系,先在子查询中查出学院为 ‘8888’或者学院为空的数据
再在子查询的结果基础上,继续在外层查询中,找子查询结果里面的班级为 ‘99999’ 或者班级为空的数据
select * from(
select * from t_table_a
where (a.dw is null or a.dw='88888')
)t
where (t.bj isnull or t.bj='9999')
Where的顺序
ORACLE采用自下而上的顺序解析WHERE子句,
根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉大量数量记录的条件必须写在WHERE子句的末尾.
你的sql 优化的空间不大,看下 bj 和 dw 字段,是哪个字段过滤的数据越多,就把哪个条件放到末端,就行了。
对于or 来说,你一个表,没太大必要,如果字段选择率高,两个字段分别加索引即可
你可以在你的数据库连接工具(sqldevelpoer 或者 A5 或者DBeaver中看下你的执行计划,看哪一步耗费时间多,进行调整)
select
Oracle采用自下而上的顺序,解析where子句。根据这个原理,表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾。
先不说其他,你这个贴入的就有问题,空格、下划线的问题
select * from t_table_a 应为select * from t_table a
and (a.bj isnull or a.bj='9999') 应为 and (a.bj is null or a.bj='9999')
where条件后各个条件的优先级,比如order by, group by,having之类