`

Oracle LEFT JOIN中ON条件与WHERE条件的区别

 
阅读更多

Oracle LEFT JOIN中ON条件与WHERE条件的区别

JOIN中的ON条件与WHERE条件是一样的,而LEFT JOIN却不一样

SQL> create table t1 as select * from scott.emp;

表已创建。

SQL> create table t2 as select * from scott.dept;

表已创建。

SQL> delete t2 where deptno=30;

已删除 1 行。

以下为使用where的查询结果与执行计划

以下为使用on条件的查询结果与执行计划

oracle 对谓词and t1.job='CLERK'(on 后面的),where t1.job='CLERK'的解析是不一样的。

使用where t1.job='CLERK':

1 - access("T1"."DEPTNO"="T2"."DEPTNO"(+))
2 - filter("T1"."JOB"='CLERK')

Oracle 先根据"T1"."JOB"='CLERK'对T1表进行过滤,然后与T2表进行左外连接

Oracle解析的谓词and t1.job='CLERK'(on 后面的)为:

1 - access("T1"."DEPTNO"="T2"."DEPTNO"(+) AND "T1"."JOB"=CASE WHEN
("T2"."DEPTNO"(+) IS NOT NULL) THEN 'CLERK' ELSE 'CLERK' END )

代表什么意思呢?

oracle 对t1,t2进行全表扫描,之后进行左外连接(也可能是在扫描过程中进行连接),而and t1.job='CLERK'对连接之后的记录总数没有影响,只是对不符合and t1.job='CLERK'的记录中的部门名称置为空

不知道我的理解对不?

有关这方面的一篇文章http://lvyunheng.javaeye.com/blog/708687

分享到:
评论

相关推荐

    深入Oracle的left join中on和where的区别详解

    当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...

    left join 过滤条件写在on后面和写在where 后面的区别

    本文将重点讨论`LEFT JOIN`中过滤条件放置位置的不同——放在`ON`子句后与放在`WHERE`子句后——及其带来的差异。 #### SQL JOIN基本概念回顾 在深入讨论之前,我们先简要回顾一下SQL JOIN的基本概念: - **INNER...

    oracle性能优化技巧

    在Oracle数据库中,优化器是决定查询执行计划的关键组件,其目标是最小化资源消耗并最大化查询性能。Oracle提供了三种主要的优化器模式:基于规则(RULE)、基于成本(COST)以及选择性(CHOOSE)。 1. **基于规则...

    oracle join on 数据过滤问题

    在LEFT JOIN中,通常建议将所有过滤条件都放在ON子句内,以确保正确处理NULL值。 3. **数据过滤**: - `gu.f_expectenddate > (select trunc(sysdate,’Y’)FROM DUAL)` 这个条件用于过滤`t_base_succprouser`表中...

    ORACLE与SQLSERVER中的语法区别

    ORACLE 与 SQL SERVER 中的语法区别 在数据库管理系统中,ORACLE 和 SQL Server 是两个常用的关系数据库管理系统。虽然它们都使用 SQL 语言,但是它们之间存在一些语法上的区别。这篇文章将详细介绍 ORACLE 和 SQL ...

    oracle 资料

    - RIGHT JOIN (或 RIGHT OUTER JOIN):与LEFT JOIN相反,返回右表的所有行,左表中没有匹配的行以NULL填充。 - FULL JOIN (或 FULL OUTER JOIN):返回所有左右表的行,即使在其中一个表中没有匹配的行。没有匹配的行...

    Oracle中的几种表连接区别

    本文将详细介绍Oracle中常见的几种表连接方式及其应用场景,包括内连接(Inner Join)、外连接(Outer Join)、左连接(Left Join)、右连接(Right Join)等,并通过具体的例子来帮助理解每种连接的特点与区别。...

    关于SQL 中的inner join的使用

    RIGHT JOIN 与 LEFT JOIN 相反,它以右表为基础,即使左表中没有对应的记录,也会显示右表的所有记录,并且左表中对应的列显示为 NULL。 #### 八、总结 本文详细介绍了 SQL 中 INNER JOIN 的基本概念、语法结构...

    Oracle专题——外连接过滤.pdf

    Oracle数据库中的外连接过滤是一个重要的查询优化技巧,它涉及到如何有效地使用外连接(LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN)以及WHERE子句和AND条件来筛选数据。在外连接中,不同类型的连接允许...

    理解oracle中的外连接

    在Oracle数据库系统中,外连接(Outer Join)是一种高级的SQL联接操作,它扩展了标准的内连接(Inner Join)概念,允许我们查询不匹配的数据。外连接分为三种类型:左外连接(Left Outer Join)、右外连接(Right ...

    oracle数据库表左连接右连接全连接的认识

    Oracle 数据库表连接(Join)是指从两个或多个表中检索数据,并且将它们组合成一个结果集的操作。连接操作可以大大提高数据库查询的效率,特别是在需要访问多个表中的字段时。 连接的基本结构 连接的基本结构是一...

    Oracle SQL连接查询总结.docx

    假设TableA中有四条记录,TableB中也有四条记录,使用CROSS JOIN后,结果集中将包含16条记录,每条记录都是TableA与TableB记录的组合。 #### 四、示例代码 下面是一些关于连接查询的实际代码示例: **示例1:内...

    Oracle 左连接、右连接

    本篇文章将深入探讨Oracle中的左连接(LEFT JOIN)和右连接(RIGHT JOIN),这两种连接方式都是为了在不同表之间建立联系,特别是在数据不完全匹配的情况下。 首先,我们来看一下左连接(LEFT JOIN)。左连接返回左...

    oracle简单教学

    2. LEFT JOIN(或LEFT OUTER JOIN):返回左表的所有记录,以及右表中与左表匹配的记录。如果右表没有匹配,则结果为NULL。例如,`SELECT * FROM table1 LEFT JOIN table2 ON table1.key = table2.key;` 3. RIGHT ...

    ORACLE和SQL Server的语法区别

    本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle数据库系统迁移至SQL Server平台的用户来说,这些知识尤...

    Oracle连接查找

    在此示例中,使用左外连接 (`LEFT JOIN`),即使 `dept_hiloo` 表中没有与 `emp_hiloo` 表中的 `deptno` 匹配的记录,`emp_hiloo` 表中的所有记录仍将出现在结果集中,未匹配的部门名称将显示为NULL。 ### 三、自...

    Oracle中sql语句(+)符号代表连接的使用讲解

    oracle中sql语句(+)符号代表连接 (+)在=前边为右连接 (+)在=后边为左连接 SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* from a right join b SELECT a.*, b.* from a = b(+)就是一个左连接...

    PL/SQL Join实例分析

    在PL/SQL(Oracle数据库的编程语言)中,JOIN语法尤其重要,因为它是处理复杂查询的基础。以下是PL/SQL中不同类型的JOIN及其特点的详细分析: 1. **左连接(LEFT JOIN)**: 左连接返回左表(Aa)的所有行,即使在...

    达梦和oracle的差异说明

    LEFT JOIN T_CUS_PRODUCT ON c.PRODUCTID = P_ID WHERE userid = 200 ORDER BY contractid; ``` #### 四、查询DUAL表差异 - **Oracle数据库**:提供了一个特殊的表`DUAL`,通常用于测试或返回单个值的场景。 ...

Global site tag (gtag.js) - Google Analytics