這麼久終於可以靜下來整理一下工作上學到的東西了(主要還是自己太懶了。。)

廢話少説,正文開始

在公司裏,數據庫用的基本都是Oracle,所以就學了一下Oracle的一點知識,現在整理一下自己遇到的問題和學到的一些東西。

先説説自己經常搞混的內連接、外連接(大學裏一直沒搞懂。。)

數據表之間有很多種連接方式,如:內外連接等

 

一(內連接):

內連接就是我們經常説的等值連接或者自然連接。

內連接用連接 inner join(join)關鍵字連接表(或者直接用where和“=”號)。

直接上例子:

設有表如下:

學生表:

內連接join 怎麼走聯合索引_左外連接

      

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

內連接join 怎麼走聯合索引_左外連接_02

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

自然連接結果:

內連接join 怎麼走聯合索引_內連接join 怎麼走聯合索引_03

內連接(自然連接)只匹配了符合條件的記錄。

 

二(外連接):

外連接分為左外連接、右外連接以及全外連接。

1、左外連接(左邊的表不加限制),用left out join(left join)關鍵字

還是舉例子,還是上述的表:

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

左外連接結果:

內連接join 怎麼走聯合索引_外連接_04

左外連接:列出右表符合條件的記錄以及左表全部的記錄,右表沒有符合的用null表示。

Oracle可以用(+)表示外連接,當(+)跟在一個表的屬性後面時,它表示哪個表需要符合條件。放在左邊表示右外連接,放在右邊表示左外連接。

 

2、右外連接(右邊的表不加限制),用right out join(right join)關鍵字

看下面sql語句:

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

右外連接結果:

內連接join 怎麼走聯合索引_左外連接_05

右外連接跟左外連接相同,只是要求符合條件的表不同(右外連接要求列出左表符合條件的記錄)。

右外連接:列出左表符合條件的記錄以及右表全部的記錄,左表沒有符合的用null表示。

Oracle可以用(+)表示外連接,當(+)跟在一個表的屬性後面時,它表示哪個表需要符合條件。放在左邊表示右外連接,放在右邊表示左外連接。

 

3、全外連接(左右兩表都不加限制),用full out join(full join)關鍵字

還是舉例子:

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

全外連接結果:

內連接join 怎麼走聯合索引_外連接_06

全外連接對兩邊的表都不加限制,列出左右兩表所有的記錄,沒有符合條件的用null替代。

 

【雖然我走得很慢,但我從來沒有後退。】