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 name5

INSERT 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 USA
SQL> 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 USA

SQL> 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 name4

SQL> 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 Hongkong

SQL>
复制代码

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>
复制代码

总结:

其实总的连接查询也就6种:交叉连接、内连接、外连接(左连接,右连接,全连接)、自连接
交叉连接:
SELECT * FROM TEST1,TEST2;取迪卡尔积。
SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID; //默认就是交叉连接
SELECT * FROM TEST1 CROSS JOIN TEST2 WHERE TEST1.ID=TEST2.ID; // WHERE不能换成ON

内连接:
内连接取的是两个表的公共部分。INNER JOIN 跟JOIN一样,必须要有关键字ON加上条件。而不能像交叉连接一样取迪卡尔积。
SELECT * FROM TEST1 JOIN TEST2 ON TEST1.ID=TEST2.ID;
SELECT * FROM TEST1 INNER JOIN TEST2 ON TEST1.ID=TEST2.ID; //两个语句执行结果一致。INNER可省略。
SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID;//交叉连接,取出满足条件的迪卡尔积。跟上面两个语句执行结果一样。

外连接:
外连接可省略outer:
LEFT JOIN: 以左表为主,即使右表中没有匹配,也从左表返回所有的行。相当于左表显示全部,右表没有的显示为空。
RIGHT JOIN:以右表为主, 即使左表中没有匹配,也从右表返回所有的行。右表显示全部,左表没有的显示为空。
FULL JOIN: 只要其中一个表中存在匹配,就返回行。相当于两张表都显示全部值,哪一个表没有对应的值则显示为空。

自连接:
自连接就是同一个表自己与自己进行连接。可以简单理解为两张表内容完全一样,表名不一样进行连接。
SQL> select * from dept,dept;
select * from dept,dept
ORA-00918: column ambiguously defined

SQL> select * from dept d1,dept d2;

原文地址:https://www.cnblogs.com/annannan/p/11299395.html