`

oracle join及where 的执行次序

 
阅读更多

oracle 的各种join及where的执行次序  

 

内联接:

select * from a inner join b on a.aa=b.bb;

等价于 select * from a,b where a.aa=b.bb; 即内联接相当于一般的等值连接。

外连接:

分left/right/full outer join等几种。

貌似outer可省略,即left join,right join,full join等三种。

左联接:

select * from a left join b on a.aa=b.bb;

等价于另一种写法:

select * from a,b where a.aa=b.bb(+);

若左边的表a有5条,则结果将显示5条。

右联接:

select * from a right join b on a.aa=b.bb;

等价于另一种写法:

select * from a,b where a.aa(+)=b.bb;

若表a有5条而表b有3条,则同右边的表b条数一样,只显示3条。

全联接:

select * from a full join b on a.aa=b.bb;

将展示所有a和b对应列相等及a中和b中相等之外的行。

自联接:

self join

自联接并非一个sql关键词。

而是用类似于select * from aa a,aa b的形式实现的。主要用于对同一个表中的两列进行联接的特殊情况。

例子:

select * from a1;

    AA BB
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5

select * From a2;

    CC DD
1 2 2
2 3 3
3 5 5
4 9 9
内联接结果:

   select * from a1 a,a2 b where a.aa=b.cc;

等价于:

   select * from a1 a inner join a2 b on a.aa=b.cc;

    AA BB CC DD
1 2 2 2 2
2 3 3 3 3
3 5 5 5 5
左外连接结果:

   select * from a1 a left join a2 b on a.aa=b.cc;

等价于:

   select * from a1 a , a2 b where  a.aa=b.cc(+);
    AA BB CC DD
1 2 2 2 2
2 3 3 3 3
3 5 5 5 5
4 1 1  
5 4 4  
右连接结果:

   select * from a1 a right join a2 b on a.aa=b.cc;

等价于:

      select * from a1 a , a2 b where  a.aa(+)=b.cc;

    AA BB CC DD
1 2 2 2 2
2 3 3 3 3
3 5 5 5 5
4       9 9

全连接结果 :

   select * from a1 a full join a2 b on a.aa=b.cc;

等价于先左连接再右连接然后联合:

    select * from a1 a , a2 b where  a.aa(+)=b.cc union select * from a1 a,a2 b where a.aa=b.cc(+);

    AA BB CC DD
1 1 1  
2 2 2 2 2
3 3 3 3 3
4 4 4  
5 5 5 5 5
6       9 9



注意(+)的方式是oracle专用语法,不建议使用,原因如下:

建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+).而且(+)是要受下面的规则限制的,但Outer Join语法则不受的~~

  1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中

  2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段

  3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件,

  如果没有 ,oracle不会警告你~只是结果自然不同的

  4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~

  5)不可以用(+)外联接到自己 当然Self Join是可以的

  6)含(+)的Where后的注意

  OR不可用

  IN不可用

  子查询不可用

备注, sql语句执行次序的资料,有点儿象是机器翻译的,不清楚是不是适用于oracle,但MSDN中sql 2008的执行次序与其类似。
      SQL说话不合于其他编程说话的最明显特点是处理惩罚代码的次序。在大多半据库说话中,代码按编码次序被处理惩罚。但在SQL语句中,第一个被处理惩罚的子句是FROM,而不是第一呈现的SELECT。SQL查询处理惩罚的步调序号: 
(8) SELECT (9) DISTINCT (11) <TOP_specification> <_list> 
(1) FROM <left_table> 
(3) <join_type> JOIN <right_table> 
(2) ON <join_condition> 
(4) WHERE <where_condition> 
(5) GROUP BY <group_by_list> 
(6) WITH {CUBE | ROLLUP} 
(7) HAVING <having_condition> 
(10) ORDER BY <order_by_list> 
  以上每个步调都邑产生一个虚拟表,该虚拟表被用作下一个步调的输入。这些虚拟表对调用者(客户端应用法度或者外部查询)不成用。只有最后一步生成的表才会会给调用者。若是没有在查询中指定某一个子句,将跳过响应的步调。 
  逻辑查询处理惩罚阶段简介: 
  1、 FROM:对FROM子句中的前两个表履行笛卡尔积(交叉联接),生成虚拟表VT1。表名履行次序是从后往前,所以数据较少的表尽量放后。 
  2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。 
  3、 OUTER (JOIN):若是指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保存表中未找到匹配的行将作为外部行添加到VT2,生成TV3。若是FROM子句包含两个以上的表,则对上一个联接生成的成果表和下一个表反复履行步调1到步调3,直处处理惩罚完所有的表地位。 
  4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。履行次序为畴前去后或者说从左到右。 
  5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。履行次序从左往右分组。 
  6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。 
  7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。Having语句很耗资料,尽量罕用      8、 SELECT:处理惩罚SELECT列表,产生VT8。 
  9、 DISTINCT:将反复的行从VT8中删除,产品VT9。 
  10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表次序,生成一个游标(VC10)。履行次序从左到右,是一个很耗资料的语句。 
       11、TOP:从VC10的开端处选择指定命量或比例的行,生成表TV11,并返回给调用者。

http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx

Processing Order of the SELECT statement

The following steps show the processing order for a SELECT statement.

 

1.FROM

 

2.ON

 

3.JOIN

 

4.WHERE

 

5.GROUP BY

 

6.WITH CUBE or WITH ROLLUP

 

7.HAVING

 

8.SELECT

 

9.DISTINCT

 

10.ORDER BY

 

11.TOP

 

 

 

也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.

经测试,

1 oracle中,先on 后join可以确认。即数据库处理是根据on的条件组合来产生最终join的结果的。

2 on在前,where在后可确认,若先where ,则应不会影响join的结果。而只有先on 并join后,产生结果然后再过滤,才会产生where的效果。亦测试过,但其它有无更复杂的情况就不得而知了。

所以需在使用中注意!注意!

分享到:
评论

相关推荐

    oracle-join用法

    在Oracle SQL中,Join主要分为几个类型,包括INNER JOIN、LEFT JOIN (LEFT OUTER JOIN)、RIGHT JOIN (RIGHT OUTER JOIN)以及FULL JOIN (FULL OUTER JOIN)。这些类型在Java编程中同样可以使用,通过SQL查询语句来实现...

    Oracle中SQL语句执行效率的查找与解决

    - **连接操作**:Oracle支持多种连接算法,包括嵌套循环连接(Nested Loops)、排序合并连接(Sort-Merge Join)和哈希连接(Hash Join)。每种算法有其优缺点,应根据数据量大小、数据分布情况和可用内存等因素选择...

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

    在Oracle数据库中,LEFT JOIN是一种联接操作,用于合并两个或更多表的记录,返回所有左表(第一个提及的表)的记录,即使在右表中没有匹配的记录。LEFT JOIN的关键在于它会保留左表的所有行,并尝试与右表匹配。当...

    oracle where case when where后面跟case when

    在Oracle数据库中,`WHERE`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...

    oracle 查看当前会话执行的sql语句

    以下将详细介绍如何通过不同的方法来查看当前会话所执行的SQL语句及相关信息。 #### 1. 获取当前会话的信息 首先,我们可以通过`v$session`视图来获取当前会话的基本信息,如SID、SERIAL#等。 ```sql -- 查询当前...

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle数据库管理中,了解SQL语句的执行性能和频率对于系统优化至关重要。本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建表和触发器,以及执行其他SQL语句。 首先,我们需要了解如何在批处理文件中连接Oracle数据库。这通常通过Oracle的...

    Oracle使用命令行批量执行带参数及用户名是变量的SQL文件

    Oracle使用命令行批量执行带参数及用户名是变量的SQL文件 因为数据存在不同的Oracle数据库中,DDL是相同的,处理逻辑也是相同...使用Oracle命令行的方式,批量执行Oracle不同用户下的sql文件,where条件带变量的操作。

    oracle JOB常见的执行时间定义

    oracle JOB常见的执行时间, 在初学者定义JOB时,对于执行时间往往不知道如何设置. 该文档列举了常见的定义方式.可以由此进行扩展.

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    Oracle批处理是数据库操作中提高效率的重要手段,尤其是在C#编程环境下,利用Oracle的数据驱动进行批处理,可以显著提升大量SQL语句执行的速度。本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次...

    python+oracle join

    python+oracle join

    ORACLE定时任务不能自动执行的检查修复步聚

    Oracle 定时任务不能自动执行的检查修复步聚 Oracle 定时任务是 Oracle 数据库中的一种功能,可以根据设置的计划执行某些任务。但是,在某些情况下,Oracle 定时任务可能不能自动执行。这可能是由于某个版本的 BUG...

    Oracle优化器及执行计划.pdf

    ### Oracle优化器及执行计划详解 #### 一、性能调整概览 Oracle 数据库作为一款高性能的数据库管理系统,其性能优化对于确保系统高效稳定运行至关重要。性能调整涉及到多个层面,包括但不限于应用程序设计、数据库...

    ORACLE的执行计划详解文档

    ORACLE 提供了多种执行计划优化技术,包括索引优化、JOIN 优化、排序优化等。这些优化技术可以提高执行性能和节省内存的使用。 ORACLE 的执行计划是基于共享池的机制实现的,通过使用绑定变量和优化技术,可以提高...

    Oracle CBO 学习笔记之(1) : 深入理解Oracle Hash Join的代价模型及其执行流程

    在实际应用中,理解Oracle的Hash Join代价模型和执行流程可以帮助我们优化查询性能,例如,通过调整表的分区策略、增加内存资源或利用并行执行来改善Hash Join的效率。同时,理解何时Hash Join比其他类型的JOIN(如...

    oracle怎么查看执行计划

    ### Oracle如何使用AUTOTRACE查看执行计划 在Oracle数据库管理中,查看SQL语句的执行计划是一项重要的技能,这有助于优化查询性能、诊断性能问题等。AUTOTRACE是Oracle提供的一种强大的工具,用于自动展示SQL语句的...

    在Oracle里加快SQL执行的三种方法

    在Oracle数据库管理中,优化SQL查询的执行速度对于提升系统整体性能至关重要。本文将探讨三种在Oracle中加速SQL执行的方法,特别关注如何通过调整查询结构和利用特定的优化提示来提高查询效率。 首先,我们可以使用...

    怎样看懂Oracle的执行计划

    在物理层面上,Oracle 数据库读取数据块的最小单位是一个 Oracle 块,而最大单位则取决于操作系统的限制(及多块 I/O)。逻辑上,Oracle 数据库使用以下方法来定位要读取的数据: * 全表扫描(Full Table Scan) * ...

Global site tag (gtag.js) - Google Analytics