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>
总结:
其实总的连接查询也就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),其实想想原来竟是这么简单。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。