zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1【转】
    atol实现【转】
    atol的实现【转】
    关于内存中栈和堆的区别(非数据结构中的堆和栈,区别)【转】
    ubuntu下安装android模拟器genymotion【转】
    buntu下命令行安装jdk,android-studio,及genymotion虚拟机来进行android开发【转】
    Ubuntu下安装Android studio【转】
    C++模板(二)【转】
    【转】iOS中设置导航栏标题的字体颜色和大小
    【转】Java 截取字符串
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2555416.html
Copyright © 2011-2022 走看看