`
c04s31602
  • 浏览: 46195 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

sql 
阅读更多

原文地址http://www.cnblogs.com/kevinGao/archive/2012/06/07/2555416.html

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当作驱动条件来使用的,都是当成过滤条件)。

分享到:
评论

相关推荐

    sql基本用法 标准sql和特殊数据库sql

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,它是数据存储、查询、更新和管理的核心工具。SQL的基本用法包括数据查询、数据插入、数据更新和数据删除,同时,不同的数据库系统如Oracle...

    SQL92帮助文档

    SQL92是SQL语言的一个重要版本,它在1992年由国际标准化组织(ISO)和美国国家标准协会(ANSI)发布,为关系型数据库管理系统(RDBMS)定义了一套标准化的查询语言规范。这个“SQL92帮助文档”包含了SQL92的所有核心...

    SQL中GROUP BY的用法

    SQL 中 GROUP BY 的用法及聚合函数 GROUP BY 是 SQL 中的一种分组查询语句,通常与聚合函数配合使用。GROUP BY 语句根据一个或多个列将查询结果分组,并对每组计算聚合函数的值。 在使用 GROUP BY 语句时,需要...

    SQL join 完全用法

    SQL join 完全用法 SQL join 完全用法 学习sql join

    sql-92-bnf.tar.gz_BNF SQL92_bnf_sql b_sql server bnf_sql92 bnf

    通过阅读"sql-92.bnf.html",你可以详细了解到SQL-92的所有语法规则,包括每个关键字、子句和表达式的具体用法,这对于编写符合标准的SQL语句至关重要。同时,理解BNF可以帮助你更好地分析和解析SQL语句,甚至自行...

    SQL中like的用法

    SQL语句 SELECT LIKE like用法详解 包含你不知道的用法 在SQL结构化查询语言中,LIKE语句有着至关重要的作用。

    dede_sql用法

    ### dede_sql用法详解 #### 一、概述 在织梦CMS(DedeCMS)系统中,`dede_sql`是一个非常实用的功能模块,它允许开发者直接在模板中执行自定义的SQL查询语句,并将查询结果动态展示出来。这对于实现更为复杂的数据...

    SQLServer动态SQL语句的用法

    SQL Server 动态 SQL 语句的用法 SQL Server 中的动态 SQL 语句是一种灵活的查询方式,它可以根据不同的情况生成不同的 SQL 语句。动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL ...

    sql中as的一些用法

    ### SQL中的AS关键字详解 在SQL语言中,`AS`关键字是一个非常实用的功能,它主要用于为查询结果中的列或者表创建别名。这种别名的使用不仅能够提高SQL语句的可读性,还能帮助开发者更好地理解数据结构,特别是在...

    sql中as的用法和一些经典的sql语句.doc

    "SQL中的AS用法和经典SQL语句整理" SQL语言中,AS关键字用于为表或列指定别名,以便于查询和简化语句。在本文中,我们将总结一些常用的SQL语句,并解释AS用法的细节。 一、DELETE语句 DELETE语句用于删除表中的...

    sql基本用法

    数据库操作的sql用法,很齐全,可以直接使用。

    sql/having用法

    SQL中的HAVING子句用法 HAVING子句是SQL中的一种子句,用于对 GROUP BY 子句所确定的行组进行控制。HAVING 子句条件中只允许涉及常量、聚组函数或 GROUP BY 子句中的列。在 Oracle 中,HAVING 子句是对 GROUP BY ...

    SQL语句大全(很全)sql语句用法

    本文档提供了一套全面的SQL语句及其用法,适用于MySQL、Oracle和SQL Server等主流数据库系统。这些SQL语句覆盖了数据操作、数据定义、数据控制以及事务控制等多个方面。 #### 二、数据操作 ##### SELECT - **用途*...

    SQL函数用法大全.pdf

    ### SQL函数用法大全 #### 一、概述 在数据库管理与数据分析领域,SQL作为一种标准的语言,被广泛应用于数据检索、处理及管理等任务中。本文档旨在提供一个全面的SQL函数指南,涵盖从基本查询到复杂数据处理的各种...

    常见的sql语句用法

    SQL(Structured Query Language)是用于管理和操作数据库的标准语言。这里主要介绍一些常见的SQL语句用法,涵盖了数据的创建、插入、删除、修改以及查询。 首先,创建表是数据库操作的基础。例如,创建一个名为`...

    sql中exists的用法

    SQL 中 EXISTS 的用法简介 exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists...

    sql server broker基本用法

    SQL Server Broker(SQL Service Broker,简称SSB)是微软在SQL Server中提供的一种异步消息队列技术,用于实现数据库间的可靠通信和异步处理。它允许数据库应用程序发送和接收消息,提供了高可用性、安全性和可扩展...

Global site tag (gtag.js) - Google Analytics