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基本用法sql基本用法sql基本用法
sql基本用法 标准sql和特殊数据库sql 包含oracle sqlserver
SQL join 完全用法 SQL join 完全用法 学习sql join
SQL中group by的详细用法
SQL语句 SELECT LIKE like用法详解 包含你不知道的用法 在SQL结构化查询语言中,LIKE语句有着至关重要的作用。
sql用法大全,包含sql多种基本用法 包含sql基础用法,提升用法。。。。
sql语句妙用,各种sql语句的详细用法与讲解.doc
数据库操作的sql用法,很齐全,可以直接使用。
sql语句中join的用法 sql语句中join的用法
sql语言的高级用法
SQLServer动态SQL语句的用法
常见的sql语句用法,了解基础的sql语句用法,掌握sql语句的编写规则;
SQL语句大全(很全)sql语句用法,对于mysql,oracle,sqlserver 数据库的sql语法,各种语句优化.
sql-jion 用法
sql中as的用法和一些经典的sql语句.doc
sql server broker基本用法
本文档介绍了SQL中case...when的用法。
sql server中exists的用法简介
SQL_SERVER日期函数详细用法SQL_SERVER日期函数详细用法