1. 程式人生 > >oracle join(比較全面的解釋了join)

oracle join(比較全面的解釋了join)

1、概述

1.1、所有的join連線,都可以加上類似where a.id='1000'的條件,達到同樣的效果。

1.2、除了cross join不可以加on外,其它join連線都必須加上on關鍵字,後都可加where條件。

1.3、雖然都可以加where條件,但是他們只在標準連線的結果集上查詢where條件。比如左外連線的結果沒有class的三班,所以如果加 where class.id='C003'雖然在表中有,但在左連線結果集中沒有,所以查詢後,是沒有記錄的。

2、例項,標準的join連線,(不加where條件的)

2.1、設有表如下:

學生表

      

班級表,對應學生表中的classid

2.2、自連線:join ,inner join

1 --自連線  :只返回兩張表連線列的匹配項。2 --以下三種查詢結果一樣。3 select * from student s inner join class c on s.classid=c.id; 
4 select * from student s join class c on s.classid=c.id;
5 select * from student s,class c where s.classid=c.id;

自連線結果:

2.3、笛卡兒乘積:cross join

1 --笛卡兒乘積連線 :即不加任何條件,達到 M*N 的結果集。2 --以下兩種查詢結果一樣。3
select * from student s cross join class c; 4 select * from student,class;

笛卡爾結果:

注意:如果cross join加上where s.classid=c.id條件,會產生跟自連線一樣的結果:

1 --加上條件,產生跟自連線一樣的結果。2 select * from student s cross join class c where s.classid=c.id;

自連線結果集的cross join連線結果

2.3、左外連線:left join 

1 --左連線 :列出左邊表全部的,及右邊表符合條件的,不符合條件的以空值代替。
2 --在(+)計算時,哪個帶(+)哪個需要條件符合的,另一個全部的。即放左即右連線,放右即左連線。3 --以下結果集相同。4 select * from student s left join class c on s.classid=c.id; 5 select * from student s,class c where s.classid=c.id(+);

左連線結果:

2.4、右外連線:right join

1 --右外連線 :與左連線一樣,列出右邊表全部的,及左邊表符合條件的,不符合條件2 --的用 空值  替代。3 --(+)一樣,它的位置與連線相反。4 select * from student s right join class c on s.classid=c.id;
5 select * from student s,class c where s.classid(+)=c.id;

右連線結果

2.5、全連線:full join

1 --全連線 :產生M+N的結果集,列出兩表全部的,不符合條件的,以空值代替。2 select * from student s full join class c on s.classid=c.id;

全連線結果集