oracle 当中where条件

今天无意当中发现,oracle 当中where条件可以这样去写

select * from aa
where (aa.x,aa.y) not in (('1','S'),('2','Z'))

或者

select employee_id, last_name from employees
   where (employee_id, level) not in (select employee_id, 2 from employees)

### Oracle SQL 中 WHERE 条件的执行顺序解析 在 Oracle 数据库中,`WHERE` 子句的作用是对查询的数据进行筛选。虽然编写 SQL 语句时可以按照任意顺序排列 `WHERE` 条件,但实际上数据库引擎会根据优化器的选择决定如何处理这些条件。 #### 查询优化器的角色 Oracle查询优化器负责生成最佳的执行计划以提高查询效率。它会优先考虑那些能够利用索引或者减少扫描范围的条件[^2]。这意味着即使你在 `WHERE` 子句中指定了多个条件,实际执行过程中可能并不会严格按照书写的顺序来评估它们。相反,优化器会选择先应用最有效的过滤条件,从而尽可能缩小数据集规模后再继续其他操作。 #### 示例说明 假设存在如下 SQL 语句: ```sql SELECT empno, ename FROM emp WHERE deptno = 10 AND sal > 2000; ``` 如果表 `emp` 上针对字段 `deptno` 建立了一个 B-Tree 索引,则优化器可能会首先通过该索引来定位属于部门编号为 10 的记录集合;之后再逐条验证剩余的结果集中哪些员工薪资大于 2000【^2】。这样的策略有助于降低整体 I/O 成本并提升响应速度。 另外值得注意的是,在某些特殊情况下比如涉及到函数调用或是复杂表达式的判断项上,由于无法创建相应类型的索引支持快速查找功能,因此这类逻辑往往会被留到最后阶段单独检验每一条候选记录是否满足要求。 对于更复杂的多表联接场景下,同样遵循类似的原理——即总是试图尽早消除不必要的行数以便后续步骤能更加高效运作起来。 #### 性能考量因素总结 综上所述,尽管开发者可以在书写SQL的时候自由安排各个谓词的位置关系,但从最终运行效果来看,真正起作用的因素还是取决于底层物理存储结构以及统计信息等因素共同决定了具体采用哪种方式最为合适。通常来说只要保证基本语法正确无误即可无需过分担心因调整位置而带来的潜在负面影响因为现代的关系型数据库管理系统已经非常擅长自动完成此类任务了。 ```sql EXPLAIN PLAN FOR SELECT empno, ename FROM emp WHERE deptno=10 AND sal>2000; -- 使用此命令可查看上述查询的实际执行路径详情。 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值