Oracle左连接、右连接、全外连接以及(+)号⽤法
sql left join 多表连接1、准备⼯作
Oracle 外连接(OUTER JOIN)包括以下:
左外连接(左边的表不加限制)
右外连接(右边的表不加限制)
全外连接(左右两表都不加限制)
对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常省略OUTER关键字,写成:LEFT/RIGHT/FULL JOIN。
在左连接和右连接时都会以⼀张A表为基础表,该表的内容会全部显⽰,然后加上A表和B表匹配的内容。如果A表的数据在B表中没有记录。那么在相关联的结果集⾏中列显⽰为空值(NULL)。
对于外连接,也可以使⽤“(+) ”来表⽰。关于使⽤(+)的⼀些注意事项:
1. (+)操作符只能出现在WHERE⼦句中,并且不能与OUTER JOIN语法同时使⽤。
2. 当使⽤(+)操作符执⾏外连接时,如果在WHERE⼦句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
3. (+)操作符只适⽤于列,⽽不能⽤在表达式上。
4. (+)操作符不能与OR和IN操作符⼀起使⽤。
5. (+)操作符只能⽤于实现左外连接和右外连接,⽽不能⽤于实现完全外连接。
创建两张表,插⼊数据⽤于学习测试:
CREATE TABLE t_A (
id number,
name VARCHAR2(10)
);
CREATE TABLE t_B (
id number,
name VARCHAR2(10)
);
INSERT INTO t_A VALUES(1,'A');
INSERT INTO t_A VALUES(2,'B');
INSERT INTO t_A VALUES(3,'C');
INSERT INTO t_A VALUES(4,'D');
INSERT INTO t_A VALUES(5,'E');
INSERT INTO t_B VALUES(1,'AA');
INSERT INTO t_B VALUES(1,'BB');
INSERT INTO t_B VALUES(2,'CC');
INSERT INTO t_B VALUES(1,'DD');
2、左外连接(LEFT OUTER JOIN/ LEFT JOIN)
LEFT JOIN是以左表的记录为基础的,⽰例中t_A可以看成左表,t_B可以看成右表,它的结果集是t_A表中的全部数据,再加上t_A表和t_B表匹配后的数据。换句话说,左表(t_A)的记录将会全部表⽰出来,⽽右表(t_B)只会显⽰符合搜索条件的记录。t_B表记录不⾜的地⽅均为NULL。
select*from t_A a left join t_B b on a.id = b.id;
或
select*from t_A a left outer join t_B b on a.id = b.id;
⽤(+)来实现,这个+号可以这样来理解: + 表⽰补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显⽰,所以是左连接。
Select*from t_A a,t_B b where a.id=b.id(+);
3、右外连接(RIGHT OUTER JOIN/RIGHT JOIN)
和LEFT JOIN的结果刚好相反,是以右表(t_B)为基础的。它的结果集是t_B表所有记录,再加上t_A和t_B匹配后的数据。 t_A表记录不⾜的地⽅均为NULL。
select*from t_A a right join t_B b on a.id = b.id;
或
select*from t_A a right outer join t_B b on a.id = b.id;
⽤(+)来实现,这个+号可以这样来理解: + 表⽰补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显⽰,所以是右连接。
Select*from t_A a,t_B b where a.id(+)=b.id;
4、全外连接(FULL OUTER JOIN/FULL JOIN)
左表和右表都不做限制,所有的记录都显⽰,两表不⾜的地⽅均为NULL。全外连接不⽀持(+)写法。
select*from t_A a full join t_B b on a.id = b.id;
或
select*from t_A a full outer join t_B b on a.id = b.id;
补充
select*from t_A a,t_B b where a.id = b.id;
select*from t_A a join t_B b on a.id = b.id;
select*from t_A a where a.id in (select b.id from t_B b);
select*from t_A a where exists (select1from t_B b where a.id = b.id);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论