從今天開始我決定每周抽出一些空閑時間,記錄一下Oracle的一些基礎知識,也算是方便用baidu和google的人吧。
今天介紹一個非常有數學氣息的--串連。
首先介紹我今天需要使用的兩張表,test1和test2。test1是學生基本資料表,包括學生的名字和學號;test2是成績表,有學生學號,成績這兩列。
表的資料如:
test1:
test2:
這兩個表由stu_id進行關聯。
好了,現在介紹第一種串連形式:內串連。代碼如下:
SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
FROM TEST1 T1
INNER JOIN TEST2 T2
ON T1.STU_ID = T2.STU_ID;
這中查詢的結果是:
很不幸,玄燁同學沒去考試。因此查不出成績來。但是我現在很想很想得到一張完全的成績單,包括沒去考試的玄燁同學,因為我要開家長會了,怎麼辦呢?這個時候就可以用到外串連:
SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
FROM TEST1 T1
LEFT OUTER JOIN TEST2 T2
ON T1.STU_ID = T2.STU_ID;
結果如下:
這裡的基本原理就是關係代數,可以參考《資料庫系統概論》(王珊,薩師煊)第二章的內容。
有左串連就有右串連。給test2增加幾行,stu_id不在test1的記錄。然後寫這個SQL:
SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
FROM TEST1 T1
RIGHT OUTER JOIN TEST2 T2
ON T1.STU_ID = T2.STU_ID;
這樣就取到了並不滿足相等條件的test2中的記錄,紅框框中的:
現在我想取到所有的,也就是說test1中沒成績的和test2中沒有名字的記錄,這個時候就要用到全外串連
SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE
FROM TEST1 T1
FULL OUTER JOIN TEST2 T2
ON T1.STU_ID = T2.STU_ID;
得到的結果:
還有種自然串連,平時我也不用,結果嘛,自己看吧。先看SQL:
SELECT STU_ID, STU_NAME, SCORE FROM TEST1 T1 NATURAL JOIN TEST2 T2;
結果:
我感覺這個和以下的SQL結果是一樣的:
SELECT T1.STU_ID, T1.STU_NAME, T2.SCORE FROM TEST1 T1, TEST2 T2 WHERE T1.STU_ID = T2.STU_ID;
也和第一個內串連的一樣。自然串連還有好幾種寫法,這裡就不一一介紹了,因為我平時工作也用不到,基本上不會,也就不抄書了。