Oracle SQL中join方式总结

       在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图、物化视图等联结)。SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN、 HASH JOIN等是表连接的物理实现方式。

     为了更直观的了解以上join方式,我们通过俩个测试表来进行测试,首先是建表语句:

create table U (
name varchar2(20),
gender varchar2(10)
);
create table D(
name varchar2(20),
sal number(6,0)
);

insert into U values('tom','male');

insert into U values('jerry','male');

insert into U values('tina','female');

insert into U values('ying','female');
COMMIT;

insert into D
select 'ying',10000 from dual union all
select 'tom',5000 from  dual union all
select 'sam',3000 from dual union all
select 'jeck',4500 from dual;
COMMIT;

  内连接:INNER JOIN

inner join 表示返回俩个表或记录连接字段的匹配记录。它有三种实现方式,如下图所示:


SQL> select U.NAME,U.GENDER,D.SAL
  2  from U inner join D on U.NAME = D.NAME;

              我的报表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000
SQL> select u.name,u.gender,d.sal
  2  from u,d
  3  where u.name=d.name;

              我的报表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

SQL> select name, u.gender,d.sal
  2  from u inner join d using(name);

              我的报表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

注意:inner join 可以使用简写join方式,如下所示,但是建议使用inner join。

SQL> select u.name,u.gender,d.sal
  2  from u join d
  3  on u.name=d.name;

              我的报表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

SQL> select name ,u.gender,d.sal
  2  from u join d using(name);

              我的报表                     1
NAME                                     GENDER                      SAL
---------------------------------------- -------------------- ----------
ying                                     female                    10000
tom                                      male                       5000

用韦恩图来表示则更便于理解:

外链接:OUTER JOIN

1.全连接:full join

全连接:包含左、右俩个表的所有行,不管另一表中是否存在与其匹配的行。不符合条件的,则以空值代替。如下所示:


  1  select u.name,u.gender,d.name,d.sal
  2  from u full join d
  3  on
  4* u.name=d.name
SQL> /

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
                                sam              3000
                                jeck             4500
tina       female
jerry      male

已选择6行。

 FULL OUTER JOIN的韦恩图如下:

2.左外连接:LEFT JOIN

左外连接:又叫左连接,意思是包含左边表所有记录,右边所有匹配的记录,如果没有则用空补齐。换句话说就是,列出左边表全部的,及右边表符合条件的,不符合条件的以空值代替。


SQL> select u.name,u.gender,d.name,d.sal
  2  from u left join d
  3  on u.name=d.name;

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
tina       female
jerry      male


SQL> select u.name,u.gender,d.name,d.sal
  2  from u,d
  3  where u.name = d.name(+);

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
ying       female               ying            10000
tom        male                 tom              5000
tina       female
jerry      male

 LEFT OUTER JOIN (with common data)韦恩图如下:

上面是左外连接(带公共数据)的查询方法,那么还有一种就是不包含的,表示如下:

3.右外连接:RIGHT JOIN

右外连接:又叫右链接,意思是包括右边表所有记录,匹配左边表的记录,如果没有则以空补齐。换句话说,列出右边全部的,及左边符合条件的,不符合条件的则以空值代替。

SQL> select u.name,u.gender,d.name,d.sal
  2  from u right join d
  3  on u.name = d.name;

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 tom              5000
ying       female               ying            10000
                                jeck             4500
                                sam              3000

SQL> select u.name,u.gender,d.name,d.sal
  2  from u,d
  3  where u.name(+)=d.name;

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 tom              5000
ying       female               ying            10000
                                jeck             4500
                                sam              3000

笛卡尔积:CROSS JOIN

cross就是笛卡尔乘积连接,不需要任何关联条件,实现M*N的结果集。实际操作中,很少会用到,但要注意在开发中做表之间关联时应避免产生笛卡尔集,否则数据量过大,导致内存溢出。


SQL> select * from u cross join d;

              我的报表                     1
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tom        male                 ying            10000
tom        male                 tom              5000
tom        male                 sam              3000
tom        male                 jeck             4500
jerry      male                 ying            10000
jerry      male                 tom              5000
jerry      male                 sam              3000
jerry      male                 jeck             4500
tina       female               ying            10000
tina       female               tom              5000
tina       female               sam              3000

              我的报表                     2
NAME       GENDER               NAME              SAL
---------- -------------------- ---------- ----------
tina       female               jeck             4500
ying       female               ying            10000
ying       female               tom              5000
ying       female               sam              3000
ying       female               jeck             4500

猜你喜欢

转载自blog.csdn.net/fhy36897/article/details/89308250