在oracle里where 后的优先级是怎么样的?

问题遇到的现象和发生背景

在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

  • from
    t_table_a
    where
    (a.dw is null or a.dw = '88888')
    and (a.bj is null or a.bj = '9999')

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之类

  1. group by;将where筛选后的结果进行聚合;
  2. having;将分组汇总后的查询结果限定为只有该子句为真的数据行;
  3. order by对最终返回的结果进行排序。
    参考链接,希望有帮助
    Oracle(1)select、where、优先级、order by、host变量_shayuwei的博客-CSDN博客_oracle where优先级 查看数据库进程# ps -ef | grep ora_只查看oracle数据库进程连接到数据库软件$ sqlplus / as sysdba看到以下说明已经连接:Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partiti... https://blog.csdn.net/shayuwei/article/details/89886166?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166865178716782428640706%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166865178716782428640706&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-89886166-null-null.nonecase&utm_term=%E5%9C%A8oracle%E9%87%8Cwhere%20%E5%90%8E%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84%EF%BC%9F&spm=1018.2226.3001.4450