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. Python—发邮件总结

    来自: http://my.oschina.net/jhao104/blog/613774 1.登录SMTP服务器 首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址 ...

  2. Windows 下Nexus搭建Maven私服

    nexus下载地址: http://www.sonatype.org/nexus/archived/#step2top 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven ...

  3. Project Structure 讲解(转)

    项目的左侧面板 项目设置->Project Project Settings -> Modules Sources面板 Paths面板 dependencies面板 Project Set ...

  4. 10分钟看懂, Java NIO 底层原理

    目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking ...

  5. When Programmers and Testers Collaborate

    When Programmers and Testers Collaborate Janet Gregory SOMETHING MAGICAL HAPPENS when testers and pr ...

  6. 微信小程序配置详解

    在之前已经通过微信公众平台的官方网站https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html,注册好小程序并且登录成功后(这里主 ...

  7. 改善程序与设计的55个具体做法 day1

    博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Tem ...

  8. 【Leetcode-easy】Palindrome Number

    思路:除和求余 取得首位和末尾 比较是否相等. public boolean isPalindrome(int x){ if(x<0){ return false; } int div=1; w ...

  9. dojo 官方翻译 dojo/_base/lang 版本1.10

    官方地址:http://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.html#dojo-base-lang 应用加载声明: require ...

  10. hadoop 安装配置

    1.伪分布式搭建: 步骤参考: http://wenku.baidu.com/link?url=N_Sc7dqaO5HB47SmhntYZQI2tvvAjYt0mWT0fx28FDSMRYKTLUTc ...