欢迎投稿

今日深度:

用实验方法加深理解Oracle的外连接(left/right/full

用实验方法加深理解Oracle的外连接(left/right/full)和内连接(inner),oracleinner


总是对Oracle的左连接、右连接以及(+)对应的外连接类型糊涂,通过实验加深对连接类型语法的理解。外连接分为三种: 1. 左外连接,对应SQL关键字:LEFT (OUTER) JOIN 2. 右外连接,对应SQL关键字:RIGHT (OUTER) JOIN 3. 全外连接,对应SQL关键字:FULL (OUTER) JOIN 左右外连接都是以一张表为基表,在显示基表所有记录外,加上另外一张表中匹配的记录。如果基表的数据在另一张表中没有记录,那么相关联的结果集行中显示为空值。 精确点说,引用MOS: 对于左连接,将会返回join连接条件中第一次提到的表(或者”左边“的表)。 对于右连接,将会返回join连接条件中第二次提到的表(或者”右边“的表)。
实验: 1. 准备 SQL> create table left_tbl(id number);
Table created.

SQL> create table right_tbl(id number);
Table created.

insert into left_tbl values(1);  insert into left_tbl values(2); insert into left_tbl values(3);
insert into right_tbl values(2); insert into right_tbl values(3); insert into right_tbl values(6);
SQL> select * from left_tbl;
        ID
----------
         1
         2
         3

SQL> select * from right_tbl;
        ID
----------
         2
         3
         6

2. 左连接 SQL> select * from left_tbl l left join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
从排序看,左右表匹配的记录排在前面,并且是升序 也可以这样写:select * from left_tbl l left join right_tbl r on l.id = r.id(+);
SQL> select * from left_tbl l, right_tbl r where l.id = r.id(+);
        ID         ID
---------- ----------
         2          2
         3          3
         1
使用(+),放右表表示左表所有记录,再加上右表的记录
SQL> select * from left_tbl l, right_tbl r where r.id(+) = l.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
将where条件中左右表互换,结果还是左连接,因为(+)在左边,表示加上right表的记录
SQL> select * from left_tbl left join right_tbl using (id);
        ID
----------
         2
         3
         1
此处使用using,只显示了左表的记录
3. 右连接 SQL> select * from left_tbl l right join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
                    6
和左右连接相同,左右表匹配的记录排在前面,并且是升序 也可以这样写:select * from left_tbl l right join right_tbl r on l.id(+) = r.id;
SQL> select * from left_tbl l, right_tbl r where l.id(+) = r.id;

        ID         ID
---------- ----------
         2          2
         3          3
                    6
使用(+),放左表表示右表所有记录,再加上左表的记录
SQL> select * from left_tbl l, right_tbl r where r.id = l.id(+);

        ID         ID
---------- ----------
         2          2
         3          3
                    6
将where条件中左右表互换,结果还是右连接,因为(+)在右边,表示加上left表的记录
4. 全外连接 SQL> select * from left_tbl l full join right_tbl r on l.id = r.id;或select * from left_tbl l full outer join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
         1
                    6
会显示左右表的记录,不匹配的用NULL

5. 内连接 说了外连接,再看下内连接,innser join或join。 SQL> select * from left_tbl l inner join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
用inner join只显示左右表都匹配的记录

SQL> select * from left_tbl l join right_tbl r on l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
直接用join和inner join相同
SQL> select * from left_tbl l, right_tbl r where l.id = r.id;
        ID         ID
---------- ----------
         2          2
         3          3
用=代替on是内连接另外一种用法
总结:
1. (+)在哪个表的旁边,就表示基表是另外一张表,结果集还需要加上(+)表中不匹配的数据。
2. 内连接inner关键字可省,外连接outer关键字可省。
3. 用on和where =都可以使用(+)方式。

oracle数据库中外连接与内连接有什不同

内连接:返回2个表中完全符合条件的记录,结果集中每个表的字段内容均来自各自的表;
外连接:返回2个表中完全符合条件的记录,再加上2个表中各自的记录,结果集中的字段只有一个表中有记录时,另一个表中的字段均使用空值null填写。
例如A表:
ID user partmentID
1 aaa 3
2 bbb 3
3 ccc (null)
B表:
parmentID PartmentName
3 pm001
4 pm002
内连接结果:select A.user B.PartmentName from A inner join B on A.partmentID = B.partmentID
user PartmentName
aaa pm001
bbb pm001
外连接结果:select A.user B.PartmentName from A outer join B on A.partmentID = B.partmentID
user PartmentName
aaa pm001
bbb pm001
ccc (null) 比内连接多出来的记录,PartmentName字段是空值
(null) pm002 比内连接多出来的记录,user字段是空值

内连接在多是应用环境下使用,只有极少是使用外连接:比如同类数据的对比就可以使用外连接,比较两人统计的同一个价格表,为了对比两份数据的一致性,可以使用外连接。
 

Oracle 中内连接与完全外连接的不同有什?

INNER JOIN(内连接):SELECT * FROM TABLE1 T1 INNER JOIN TABLE2 T2 ON T1.ID = T2.ID
查询时只有满足了ID的值在俩个表同时存在,才能将此记录查询出来。
FULL OUTER JOIN(完全外连接):SELECT * FROM TABLE1 T1 FULL OUTER JOIN TABLE2 T2 ON T1.ID = T2.ID
查询时TABLE1 和 TABLE2满足内连接的记录会统一成一条记录查询出来。
TABLE1中能找到ID值而在TABLE2中找不到对应的值,此时TABLE1中此记录的值不变,其他TABLE2字段的值补NULL,合并成一条记录查询出来。
反之,TABLE2中能找到ID值而在TABLE1中找不到对应的值,此时TABLE2中此记录的值不变,其他TABLE1字段的值补NULL,合并成一条记录查询出来。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2181.html NewsArticle 用实验方法加深理解Oracle的外连接(left/right/full)和内连接(inner),oracleinner 总是对Oracle的左连接、右连接以及()对应的外连接类型糊涂,通过实验加深对连接类型语法的理解。外连接分为...
评论暂时关闭