在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