首页 > 代码库 > SQL内连接-外连接join,left join,right join,full join

SQL内连接-外连接join,left join,right join,full join

1、创建测试表test1及test2

SQL> CREATE TABLE TEST1(ID NUMBER,NAME VARCHAR2(20));表已创建。SQL> create table test2(id number, country varchar2(10));表已创建。INSERT INTO TEST1 VALUES(1,name1);INSERT INTO TEST1 VALUES(2,name2);INSERT INTO TEST1 VALUES(3,name3);INSERT INTO TEST1 VALUES(4,name4);INSERT INTO TEST1 VALUES(5,name5);SQL> select * from test1;        ID NAME---------- --------------------         1 name1         2 name2         3 name3         4 name4         5 name5INSERT INTO TEST2 VALUES(1,China);INSERT INTO TEST2 VALUES(2,Japan);INSERT INTO TEST2 VALUES(3,USA);SQL> SELECT * FROM TEST2;        ID COUNTRY---------- ----------         1 China         2 Japan         3 USA

2、笛卡尔积,即交叉连接cross join列出两张表中所有组合的值。

SQL> insert into test2 values(10,Hongkong);SQL> select * from test1 right join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA                                        10 Hongkong
SQL> select * from test1, test2;--不加连接条件时,默认使用交叉连接。        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         1 China         3 name3                         1 China         4 name4                         1 China         5 name5                         1 China         1 name1                         2 Japan         2 name2                         2 Japan         3 name3                         2 Japan         4 name4                         2 Japan         5 name5                         2 Japan         1 name1                         3 USA         2 name2                         3 USA         3 name3                         3 USA         4 name4                         3 USA         5 name5                         3 USA         1 name1                        10 Hongkong         2 name2                        10 Hongkong         3 name3                        10 Hongkong         4 name4                        10 Hongkong         5 name5                        10 Hongkong已选择20行。SQL> select * from test1 cross join test2;---跟上面语句执行结果一样。        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         1 China         3 name3                         1 China         4 name4                         1 China         5 name5                         1 China         1 name1                         2 Japan         2 name2                         2 Japan         3 name3                         2 Japan         4 name4                         2 Japan         5 name5                         2 Japan         1 name1                         3 USA         2 name2                         3 USA         3 name3                         3 USA         4 name4                         3 USA         5 name5                         3 USA         1 name1                        10 Hongkong         2 name2                        10 Hongkong         3 name3                        10 Hongkong         4 name4                        10 Hongkong         5 name5                        10 Hongkong已选择20行。SQL> select * from test1, test2 where test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USASQL> select * from test1 cross join test2 on test1.id=test2.id; --当使用关键字corss join时,不能使用on 来加条件。只能使用where.....select * from test1 cross join test2 on test1.id=test2.id                                     *1 行出现错误:ORA-00933: SQL 命令未正确结束SQL> select * from test1 cross join test2 where test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA

3、内连接join即inner join. 

SQL> select * from test1 join test2 on test1.id= test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USASQL> select * from test1 inner join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA

4、左连接(外连接包括左外连接、右外连接及全连接,而左外连接及右外连接简称左连接和右连接,即outer可省略不与

SQL> select * from test1 left outer join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA         5 name5         4 name4SQL> select * from test1 left join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA         5 name5         4 name4

5、右连接

SQL> select * from test1 right join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA                                        10 HongkongSQL>

6、全连接

SQL> select * from test1 full join test2 on test1.id=test2.id;        ID NAME                         ID COUNTRY---------- -------------------- ---------- ----------         1 name1                         1 China         2 name2                         2 Japan         3 name3                         3 USA         4 name4         5 name5                                        10 Hongkong已选择6行。SQL>

总结:

其实总的连接查询也就4种:内连接、外连接(左连接、右连接、全连接)

JOIN默认就是内连接inner join,其中inner可省略不写。如果表中有至少一个匹配,则返回行。
外连接可省略outer:
LEFT JOIN: 以左表为主,即使右表中没有匹配,也从左表返回所有的行。
RIGHT JOIN:以右表为主, 即使左表中没有匹配,也从右表返回所有的行。
FULL JOIN: 只要其中一个表中存在匹配,就返回行。

(最近重新拾起ORACLE数据库技术知识,整理下以前学过的知识点,怎么自己印象中竟然有这么多种的连接查询,以至于曾经混乱了很久:join,inner join, left join, right join, full join, full outer join, left outer join, right outer join, cross join),其实想想原来竟是这么简单。

SQL内连接-外连接join,left join,right join,full join