- 浏览: 51893 次
- 性别:
- 来自: 北京
最新评论
Oracle的left join中on和where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1 tab1:
id size
1 10
2 20
3 30
表2 tab2:
size name
10 AAA
20 BBB
20 CCC
两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2、再对中间表过滤
where 条件:
tab2.name=’AAA’
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1 tab1:
id size
1 10
2 20
3 30
表2 tab2:
size name
10 AAA
20 BBB
20 CCC
两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2、再对中间表过滤
where 条件:
tab2.name=’AAA’
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的
发表评论
-
动态sql拼接单引号与 变量赋值
2012-06-21 10:09 3843if (lower(s_table)='gl_deta ... -
ora-00031:session marked for kill处理oracle中杀不掉的锁
2012-06-19 16:36 1057转: 一些ORACLE中的进程被杀掉后,状态被置为" ... -
使用DBLINK为远程数据库的用户表创建同义词
2012-06-19 14:39 9211、创建db_link create database l ... -
以字符串数组为输入参数的存储过程
2012-06-19 14:27 2738今天项目中需要用到存 ... -
函数的使用
2012-06-04 17:09 978create or replace function Fun_ ... -
Oracle中decode的使简单例子
2012-06-04 17:06 1474decode(字段,表达式1,表达式2,表达式。。。) 当,字 ... -
oracle触发器
2012-04-20 09:11 737表: A 字段:a, b, c 当修改a字段的值时触发 c字段 ... -
oracle的全文索引
2012-04-16 14:29 789已有几个项目组开始使 ... -
单独的plsql链接数据库
2011-10-14 16:03 901转的: plsql 可不可以 ... -
Oracle经验集锦
2011-09-24 13:32 6851.删除表空间 DROP ... -
两个数据库字符集不一样,如何快速增量同步数据.
2011-09-23 15:00 1145环境: DB-A 字符集:US7ASC ... -
Oracle分区表详解 .
2011-08-06 10:42 641一、Oracle分区简介 ORACLE的分区是一种处理超大型 ... -
利用 rowid 提升update性能 .
2011-08-04 23:52 1803能不能想办法 提升一下如下update语句的性能 UPDA ... -
oracle全文索引的简单配置
2011-08-04 23:49 10001.创建数据存储定义(Datastore),使用多列数据存储在 ... -
用java调用oracle存储过程总结
2011-08-04 23:45 6401、什么是存储过程。存 ... -
Oracle SCN详解
2011-08-04 23:38 601pre. Oracle中的SCN(system change ... -
oracle 数据库里查看表空间使用状况
2011-08-04 23:34 642oracle表空间的事情状况要经常查看,一般空闲比例过低的时候 ... -
采用全文索引解决模糊查询速度慢的问题
2011-08-04 23:31 755众所周知,使用 like 进行模糊查询速度极差,包括 like ... -
oracle9i在windows上的dataguard配置
2011-08-04 23:23 704主库:win2003 server ora9i(9.2.0.1 ... -
Rman duplicate数据库复制(单系统)
2011-08-04 23:22 647一、实验环境: 1. 虚拟机:VMware Ser ...
相关推荐
当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
在Oracle数据库中,优化器是决定查询执行计划的关键组件,其目标是最小化资源消耗并最大化查询性能。Oracle提供了三种主要的优化器模式:基于规则(RULE)、基于成本(COST)以及选择性(CHOOSE)。 1. **基于规则...
- 将过滤条件从外层WHERE子句移到ON子句中可以改变连接的顺序和执行计划,可能会提高性能,因为数据库可以更早地应用过滤条件。 - 使用并行执行提示(如`/*+parallel(gu,4)*/`)可以利用多核处理器的优势,加速...
在 ORACLE 中,使用 `FROM` 语句和 `WHERE` 语句来实现 JOIN 操作,而在 SQL Server 中,使用 `JOIN` 语句。例如: SQL Server: `SELECT A.*, B.* FROM A LEFT JOIN B ON A.bh=B.bh` ORACLE: `SELECT A.*, B.* FROM...
本文主要解决 Oracle 分页查询中排序与效率问题,通过实践和分析,提供了两种解决方案,并对比了两种方法的优缺点。 知识点 1: Oracle 分页查询的基本概念 Oracle 分页查询是指在查询结果中,通过限制行数来实现...
### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...
本文将详细介绍Oracle中常见的几种表连接方式及其应用场景,包括内连接(Inner Join)、外连接(Outer Join)、左连接(Left Join)、右连接(Right Join)等,并通过具体的例子来帮助理解每种连接的特点与区别。...
Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的数据操作和管理功能。在Oracle中,JOIN操作是连接不同...在实际工作中,应根据具体需求选择合适的JOIN类型,并合理利用ON和WHERE子句来定制查询结果。
在Oracle数据库系统中,外连接(Outer Join)是一种高级的SQL联接操作,它扩展了标准的内连接(Inner Join)概念,允许我们查询不匹配的数据。外连接分为三种类型:左外连接(Left Outer Join)、右外连接(Right ...
RIGHT JOIN 与 LEFT JOIN 相反,它以右表为基础,即使左表中没有对应的记录,也会显示右表的所有记录,并且左表中对应的列显示为 NULL。 #### 八、总结 本文详细介绍了 SQL 中 INNER JOIN 的基本概念、语法结构...
本篇文章将深入探讨Oracle中的左连接(LEFT JOIN)和右连接(RIGHT JOIN),这两种连接方式都是为了在不同表之间建立联系,特别是在数据不完全匹配的情况下。 首先,我们来看一下左连接(LEFT JOIN)。左连接返回左...
LEFT JOIN T_CUS_PRODUCT ON c.PRODUCTID = P_ID WHERE userid = 200 ORDER BY contractid; ``` #### 四、查询DUAL表差异 - **Oracle数据库**:提供了一个特殊的表`DUAL`,通常用于测试或返回单个值的场景。 ...
* Left Join: Left Join 用于连接两个表,并返回左表中的所有记录,即使右表中没有匹配的记录。 * Outer Join: Outer Join 用于连接两个表,并返回两个表中的所有记录,包括左表和右表中的记录。 * Full Join: ...
且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...
oracle中sql语句(+)符号代表连接 (+)在=前边为右连接 (+)在=后边为左连接 SELECT a.*, b.* from a(+) = b就是一个右连接,等同于select a.*, b.* from a right join b SELECT a.*, b.* from a = b(+)就是一个左连接...
2. LEFT JOIN(或LEFT OUTER JOIN):返回左表的所有记录,以及右表中与左表匹配的记录。如果右表没有匹配,则结果为NULL。例如,`SELECT * FROM table1 LEFT JOIN table2 ON table1.key = table2.key;` 3. RIGHT ...
在Oracle 9i及以后版本,可以使用`LEFT JOIN`和`RIGHT JOIN`语法代替`(+)`符号。 3. 不等连接(Non-equal Join) 不等连接基于两个表中相关列的不等关系,如大于、小于、在一定范围内的比较。例如,`SALGRADE`表...
根据连接的方式不同,可以分为内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(FULL JOIN)等几种类型。 #### 二、连接查询类型详解 ##### 1. INNER JOIN (内连接) 内连接是最常用...