86标准SQL与92标准SQL用法区别

在开发Oracle 9i时,
数据库还时间了ANSL SQL/92标准的链接语法, 在书中建议在使用Oracle 9i及更高版本时,应该使用SQL/92标准的语法;在使用Oracle 8i 及更低版本时,应该使用SQL/86标准的语法。 -----《Oracle Database 10g SQL 开发指南》

86标准sql是传统的表连接写法,就是直接将表写在FROM后边,将表连接条件与过滤条件都写在WHERE后边。

92标准SQL是采用JOIN的表连接方法。分为LEFT JOIN,RIGHT JOIN,INNER JOIN,每一种JOIN方法都可以使用86版SQL转化得到相应写法,但并不是完全相同。

下面举例说下两种表连接的用法:

测试数据:

create table a (id integer,name varchar(20));

create table b (id integer,name varchar(20));

create table c (id integer,name varchar(20));

insert into a values(1,'a1');

insert into a values(2,'a2');

insert into a values(3,'a3');

insert into a values(4,'a4');

insert into a values(5,'a5');

insert into b values(2,'b2');

insert into b values(3,'b3');

insert into b values(4,'b4');

insert into b values(5,'b5');

insert into b values(6,'b6');

insert into c values(1,'c1');

insert into c values(2,'c2');

insert into c values(3,'c3');

insert into c values(4,'c4');

1: 等值连接 INNER JOIN

SQL> select a.id,a.name,b.id,b.name,c.id,c.name

2 from a inner join b on a.id=b.id

3 inner join c on a.id=c.id ;

ID NAME ID NAME ID NAME

--------- -------------------- ---------- -------------------- ---------- ----

2 a2 2 b2 2 c2

3 a3 3 b3 3 c3

4 a4 4 b4 4 c4

以上92版SQL 与以下86版SQL结果相似;

select a.id,a.name,b.id,b.name,c.id,c.name

from a ,b ,c 

where a.id=b.id

and a.id=c.id

2:左连接 left join

先看92两种写法得到的结果对比一下。

SQL> select a.id,a.name,b.id,b.name,c.id,c.name

2 from a left join b on a.id=b.id

3 left join c on b.id=c.id ;

ID NAME ID NAME ID NAME

---------- -------------------- ---------- -------------------- ---------- -----

---------------

2 a2 2 b2 2 c2

3 a3 3 b3 3 c3

4 a4 4 b4 4 c4

1 a1

5 a5 5 b5

SQL> select a.id,a.name,b.id,b.name,c.id,c.name

2 from a left join b on a.id=b.id

3 left join c on a.id=c.id ;

ID NAME ID NAME ID NAME

---------- -------------------- ---------- -------------------- ---------- -----

---------------

2 a2 2 b2 2 c2

3 a3 3 b3 3 c3

4 a4 4 b4 4 c4

5 a5 5 b5

1 a1 1 c1

两种写法都是左连接,唯一不同的就是与表C进行连接时的连接条件不同。但得到的结果却完全不同。

在处理C表时,数据库判定左接连基准表的依据是ON 后边的连接条件。对于第一个SQL(b.id=c.id),C表是和处理过的B表的结果集进行

连接,从B表得到结果集中ID取值为2,3,4,5 。以此为结果为基准再与C表进行连接,因此,从C表中得到的符合条件数据的ID为2,3,4

对于第二个SQL,C表是和A表进行连接,因为自始至终A表都是左连接中的基准表,所以表中的数据量不变,C表再与之进行左连接时得到的结果集中的ID为1,2

,3,4

对于以上两种SQL的写法,分别可以用以下写法代替

第一条SQL:

select a.id,a.name,b.id,b.name,c.id,c.name

from a ,b ,c 

where a.id=b.id(+)

and b.id=c.id(+) 

第二条SQL 

select a.id,a.name,b.id,b.name,c.id,c.name

from a ,b ,c 

where a.id=b.id(+)--b表和a表进行左连接,以a表为准,称为左连接。注意哦,(+)是放在右边的

and a.id=c.id(+)--c表和a表进行左连接,以a表为准

3:右连接 

92版SQL写时,只需将LEFT换成RIGHT就可以了。 86版SQL,只需改变下(+)的位置不可以了。

4:92版sql中的where条件与ON条件

86版中的连接条件与过滤条件都放在WHERE条件后边了。

但92版SQL中,连接条件放在ON 后边,过滤条件放在WHERE 后边。

注意区分,以下两个SQL得到的结果是不同的:

SQL> select a.id,a.name,b.id,b.name

2 from a left join b on a.id=b.id

3 and b.id>2 ;

ID NAME ID NAME

---------- -------------------- ---------- ----------

3 a3 3 b3

4 a4 4 b4

5 a5 5 b5

1 a1

2 a2



SQL> select a.id,a.name,b.id,b.name

2 from a left join b on a.id=b.id

3 where b.id>2 ;

ID NAME ID NAME

---------- -------------------- ---------- -----

3 a3 3 b3

4 a4 4 b4

5 a5 5 b5

虽然是相同的条件,但 放的位置不同,得到的结果不同。

对于第一个SQL。 b.id>2 是在进行表连接的时候对B表的数据进行过滤。

但对于第二个SQL, b.id>2 是对结果集进行过滤。

以上两种SQL的写法对应到86版SQL时的写法是:

select a.id,a.name,b.id,b.name

from a ,b

where a.id=b.id(+)

and b.id>2

它是与第二个SQL的结果保持一至的(这个地方一直怀疑,应该是数据库根据不同情况来应用b.id>2为驱动条件还是过滤条件,试验了发多数据,都没有得到是把 b.id>2当作驱动条件来使用的,都是当成过滤条件)。

原文地址:

http://hi.baidu.com/420350501/blog/item/dd5344f15d010c3cbd3109fc.html

http://www.itpub.net/thread-919997-1-1.html

86标准SQL与92标准SQL用法区别的更多相关文章

  1. 关于Oracle SQL/82标准和SQL/92标准

    在ORACLE9i之前,oracle语法基础是SQL/86标准,9i及之后的版本中支持SQL/92标准.基表信息:products.purchases和product_types SQL> se ...

  2. go标准库的学习-database/sql

    参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

  3. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  4. SQL Server 2008各版本介绍区别(包含企业版 开发者版 标准版 Web版 工作组版 Express版 Compact版)

    SQL Server 2008分为SQL Server 2008企业版.标准版.工作组版.Web版.开发者版.Express版.Compact 3.5版,其功能和作用也各不相同,其中SQL Serve ...

  5. SQL Server 中 GO 的用法(转)

    本科里学了那么多年SQL Server一直看到书上各种SQL语句中间夹杂着那么几个看似毫无意义的GO,看着就让人莫名,问老师,老师一般只会告诉你,不要理他,这个东西没用的.但是个性纠结并且有轻微强迫症 ...

  6. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  7. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  8. sql语句中charindex的用法 可用于截取字符串

    使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.这两个函数是如何运转的,解释他们的区别.同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题. ...

  9. SQL SERVER 中 GO 的用法2

    具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go  select *,  备注=case  when Grade>=90 then '成绩 ...

随机推荐

  1. 实现RTSP摄像机进行网页直播和微信直播的技术方案:EasyNVR自动更新方法

    问题背景: 1.EasyNVR的用户越来越多,技术人员一一对应解答效率不高: 2.随着EasyNVR应用场景的不断增加,以及EasyNVR自身在技术上的不断优化,版本更新比较快: 3.由于开发人力有限 ...

  2. EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:bootstrap弹窗功能的实现

    在web前端的网页设计中,为了展示出简洁的网页风格和美观的效果,往往就会使用弹窗效果 在EasyNVR前端页面录像检索功能时,必然会播放录像,如果单独为播放录像文件排一个界面,用户在使用上会更加繁琐, ...

  3. HTML5(石头剪刀布游戏开发)

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. java的Access restriction错误

    问 :import sun.management.ManagementFactory,我在rt包下已经找到sun.management.ManagementFactory,但就是有错,请问怎么回事. ...

  5. 【题解】Sumdiv

    [题解]Sumdiv 传送门 根据组合的乘法原理,一个数的所有约数和 \[ sum=\prod_{i=1} \Sigma_j^{a_i} p_i^j \] 所以任务就变成了分解\(A\)的质因数,分解 ...

  6. 【iOS开发-63】Unknown type name &quot;CGRect&quot;,did you mean &quot;Rect&quot;?的解决方式

    出现这个问题的童鞋,差点儿都是由于用了Xcode6. 原因:在Xcode6之前,创建的文件系统会自己主动为用户导入Foundation.h和UIKit.h文件,可是最新的Xcode6仅仅为用户导入了F ...

  7. python读取文件的几种方式

    http://www.cnblogs.com/nkwy2012/p/6023710.html

  8. html5--2.9新的布局元素(6)-figure/figcaption

    html5--2.9新的布局元素(6)-figure/figcaption 学习要点 了解figure/figcaption元素的语义和用法 通过实例理解figure/figcaption元素的用法 ...

  9. ES设置字段搜索权重——Query-Time Boosting

    Query-Time Boosting In Prioritizing Clauses, we explained how you could use the boost parameter at s ...

  10. C语言的内存四区模型和函数调用模型

    首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...