假设有两个表a、b

使用on

Select * from a left join b on b.col = a.col and b.col2 = ‘aa’

使用 where

Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null

// b.col2 is null作用是防止因b表中没有匹配数据,照成a表原有记录无法返回的问题

分析

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

语句测试

set serveroutput on ; -- 必须运行,否则打印结果无法显示

declare

I Number;

Starttime Timestamp;

Endtime Timestamp;

Begin

select current_timestamp(5) into starttime from Dual;

I := 1;

While I<=10000 Loop

dbms_output.put_line(i);

Execute Immediate ' '; --此处放入sql语句

i := i+1;

End Loop;

Select Current_Timestamp(5) Into Endtime From Dual;

dbms_output.put_line('10000条语句运行时间为(毫秒):' || (endtime - starttime)); --打印一个Interval类型数据,显示时间差

end;

测试结果

On语句, 10000条语句运行时间为(毫秒):+000000000 00:00:01.032850000

Where 语句 10000条语句运行时间为(毫秒):+000000000 00:00:01.013420000

 

结论

Where语句的性能优于on语句

其实sql语句的运行效率也可以通过查询oracle的系统视图来查看,但时间关系今后再研究了。

在C#中使用linq进行查询

// 写得比较仓促,见谅了

var reList = from DataRow a in dtA.Rows

join DataRow b in dtB.Rows on

new {t = a["col"], l=’aa’}

equals

new {t = b["col"], l = b["col2"] }

into rightRow from rw in rightRow.DefaultIfEmpty()

select new

{

Col1 = a["col"],

Col2 = rw["col2"]

};

在linq中使用into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型left outer join的效果,如果left join中有多个查询条件,使用new两个对象进行比较即可。

Oracle中Left join的on和where的效率差别的更多相关文章

  1. oracle中left join,right join,inner join的坑

    本文主要是记录一下实际使用oracle中join查询遇到的坑 1.用到两张表,学生表和学年分数表,先建立 2.普通连接查询 INNER JOIN,查询每个学年有成绩的学生以及分数情况 LFET JOI ...

  2. Oracle中Inner join和Where的区别

    1 .Where子句中使用的连接语句,在数据库语言中,被称为隐性连接.Inner join--on子句产生的连接称为显性连接.(其他Join参数也是显性连接)Where 和Inner join产生的连 ...

  3. Oracle中left join、right join、full join应用场景

    一.提出问题:三个表分别存不同属性,一条sql查询各个公司的不同的属性 (1) 提供的三个表,相同的维度[company] (2) 需要的结果: 二.问题解析:可通过先查出所有公司再左连接三个表,或者 ...

  4. oracle 中的select ...connect by prior ...start with 及(+)的用法

    1.select ...connect by prior ...start with的用法: select ... from <tablename> where <condition ...

  5. oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断

    oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断 查询方式一: SELECT CASE WHEN (SELECT CAST(SUM(CASE ) THEN ...

  6. Oracle中join left,join right,inner join,(+) 等

    Oracle中join left,join right,inner join,(+) 等 博客分类: Oracle   建表create table TEST1create table TEST1(  ...

  7. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

  8. oracle中临时表是用来做什么的

    oracle中临时表是用来做什么的 某些情况下, 需要 多个非常大的表关联的情况下, 但是需要检索的, 是少量的数据的时候.可以先把 大表的数据, 检索出那一小部分, 然后插入到 临时表中, 最后再关 ...

  9. 《oracle每天一练》Merge Into 语句代替Insert/Update在Oracle中的应用实战

    转载自窃破天道 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也 ...

随机推荐

  1. Linux编程之《只运行一个实例》

    概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...

  2. IOS 应用 退出的一个小方法

    AppDelegate * app=(AppDelegate *)[[UIApplication sharedApplication]delegate]; UIWindow *window = app ...

  3. 使用block来解决实现switch解决字符串

    NSString *lookup=@"Hearts"; typedef void  (^CaseBlock)(); NSDictionary *diction=@{@"D ...

  4. (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)

    (搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...

  5. 强大的矢量图形库:Raphael JS 中文帮助文档及教程

    Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操作 DOM 来轻松创建出 ...

  6. maven的update project是什么意思

    一个是更新依赖,然后是clean projects,重新编译

  7. C++复习笔记

    好多东西都忘了,现在重新复习一遍,把遇到的要点都记录下来.随时更新. 指针 C保证在为数组分配存储空间的时候,指向数组之后的第一个位置的指针也是合法的.也就是说保证指针 a + SIZE 是合法的,但 ...

  8. DDL、DML和DCL的理解

    一.DDL  1.DDL的概述       DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表.视图等等, ...

  9. Linux命令(2):ls命令

    1.作用:列出目录的内容: 2.格式:ls [选项] [文件] [选项]为指定要查看文件相关的内容,若未指定文件默认查看当前目录下的所有文件: 3.常见参数: 如图: 4.使用实例: [yournam ...

  10. Cookie和Session简介与区别

    1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...