1. 程式人生 > 實用技巧 >SQL的內連線、左連線和右連線

SQL的內連線、左連線和右連線

外連線(out join)

外連線分為外左連線(left outer join)和外右連線(right outer join)

註釋:left outer join 與 left join 等價, 一般寫成left join
right outer join 與 right join等價,一般寫成rightjoin

左連線,取左邊的表的全部,右邊的表按條件,符合的顯示,不符合則顯示null

舉例:select <select list> from A left join B on A.id=B.id

右連線:取右邊的表的全部,左邊的表按條件,符合的顯示,不符合則顯示null

舉例:select <select list> from A rightjoin B on A.id=B.id

內連線(inner join)

內連線:也稱為等值連線,返回兩張表都滿足條件的部分

註釋:inner join 就等於 join

交叉連線(CROSS JOIN)

交叉連線:返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積

首先,先簡單解釋一下笛卡爾積:笛卡爾乘積是指在數學中,兩個集合XY的笛卡尓積(Cartesian product),又稱直積,表示為X×Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對

的其中一個成員

舉例:

現在,我們有兩個集合A和B。

A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的結果集就可以分別表示為以下這種形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的結果就可以叫做兩個集合相乘的‘笛卡爾積’。

從以上的資料分析我們可以得出以下兩點結論:

1,兩個集合相乘,不滿足交換率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相結合的所有的可能性。既兩個集合相乘得到的新集合的元素個數是 A集合的元素個數 × B集合的元素個數;

交叉連線有兩種,顯式的和隱式的,不帶ON子句,返回的是兩表的乘積,也叫笛卡爾積。
例如:下面的語句1和語句2的結果是相同的。

語句1:隱式的交叉連線,沒有CROSS JOIN。
SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;

語句2:顯式的交叉連線,使用CROSS JOIN。
SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;

內連線和where的區別:

資料庫表連線資料行匹配時所遵循的演算法就是以上提到的笛卡爾積,表與表之間的連線可以看成是在做乘法運算。

比如現在資料庫中有兩張表,student表和 student_subject表,如下所示:

  

我們執行以下的sql語句,只是純粹的進行表連線。

SELECT * from student JOIN student_subject;
SELECT * from student_subject JOIN student;

看一下執行結果:

  

   表1.0                            表1.1

從執行結果上來看,結果符合我們以上提出的兩點結論(紅線標註部分);

以第一條sql語句為例我們來看一下他的執行流程,

1,from語句把student表 和student_subject表從資料庫檔案載入到記憶體中。

2,join語句相當於對兩張表做了乘法運算,把student表中的每一行記錄按照順序和student_subject表中記錄依次匹配。

3,匹配完成後,我們得到了一張有 (student中記錄數 ×student_subject表中記錄數)條的臨時表。在記憶體中形成的臨時表如表1.0所示。我們又把記憶體中表1.0所示的表稱為‘笛卡爾積表’。  

再看一下sql中主要關鍵字的執行順序:

from
on
join
where
groupby
having
select
distinct
union
orderby

我們看到on是在join和where前面的

如果兩張表的資料量都比較大的話,先Join會先進行笛卡爾積計算,再使用where篩選,那樣就會佔用很大的記憶體空間這顯然是不合理的。所以,我們在進行表連線查詢的時候一般都會使用JOIN xxx ON xxx的語法,ON語句的執行是在JOIN語句之前的,也就是說兩張表資料行之間進行匹配的時候,會先判斷資料行是否符合ON語句後面的條件,再決定是否JOIN。

  因此,有一個顯而易見的SQL優化的方案是,當兩張表的資料量比較大,又需要連線查詢時,應該使用 FROM table1 JOIN table2 ON xxx的語法,避免使用 FROM table1,table2 WHERE xxx 的語法,因為後者會在記憶體中先生成一張資料量比較大的笛卡爾積表,增加了記憶體的開銷。

全連線(Full join)

全外連線是在結果中除了顯示滿足連線的條件的行外,還顯示了join兩側表中所有滿足檢索條件的行