1. 程式人生 > >內連線(INNER JOIN)

內連線(INNER JOIN)

內連線組合兩張表,並且基於兩張表中的關聯關係來連線它們。使用內連線需要指定表中哪些欄位組成關聯關係,並且需要指定基於什麼條件進行連線。內連線的語法如下:


INNER JOIN table_name ON condition

其中table_name 為被關聯的表名,condition則為進行連線時的條件。

下面的SQL語句檢索所有的客戶姓名為MIKE的客戶的訂單號以及訂單價格:


SELECT FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM" 

執行完畢我們就能在輸出結果中看到下面的執行結果:


FNumber FPrice

K001 100.00

K002 200.00

T003 300.00

T001 300.00

在這個SQL 語句中,首先列出了組成結果集所需要的列名,而後則是在FROM 關鍵字後指定需要的表,在INNER JOIN關鍵字後指明要被連線的表,而在ON關鍵字後則指定了進行連線時所使用的條件。由於T_Customer和T_Order表中都有名稱為FId的列,所以在ON關鍵字後的條件中使用FId欄位的時候必須顯示的指明這裡使用FId欄位屬於哪個表。比如下面的SQL語句在執行的時候則會報出“列名FId不明確”的錯誤資訊:


SELECT FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= FId WHERE T_Customer.FName="TOM" 

同樣如果在SELECT語句後的欄位列表中也不能存在有歧義的欄位,比如下面的SQL語句執行會出錯:


SELECT FId,FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM" 

必須為FId欄位顯式的指定所屬的表,修正後的SQL語句如下:


SELECT T_Order.FId,FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM" 

執行完畢我們就能在輸出結果中看到下面的執行結果:


FId FNumber FPrice

1 K001 100.00

2 K002 200.00

3 T003 300.00

6 T001 300.00

為了避免列名歧義並且提高可讀性,這裡建議使用表連線的時候要顯式列所屬的表,如下:


SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice FROM T_Order INNER JOIN T_Customer ON T_Order.FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM" 

指定列所屬的表後,我們就可以很輕鬆的引用同名的欄位了,比如下面的SQL語句檢索所有的訂單以及它們對應的客戶的相關資訊:


SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice,T_Customer.FId,T_Customer.FName,T_Customer.FAge FROM T_Order INNER JOIN T_Customer ON T_Order.FCustomerId= T_Customer.FId 

在大多數資料庫系統中,INNER JOIN中的INNER是可選的,INNER JOIN是預設的連線方式。也就是下面的SQL語句同樣可以完成和檢索所有的訂單以及它們對應的客戶的相關資訊的功能:


SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice,T_Customer.FId,T_Customer.FName,T_Customer.FAge FROM T_Order JOIN T_Customer

ON T_Order.FCustomerId= T_Customer.FId 

執行完畢我們就能在輸出結果中看到下面的執行結果:


FId FNumber FPrice FId FName FAge

1 K001 100.00 1 TOM 21

2 K002 200.00 1 TOM 21

3 T003 300.00 1 TOM 21

4 N002 100.00 2 MIKE 24

5 N003 500.00 3 JACK 30

6 T001 300.00 4 TOM 25

為了明確指定欄位所屬的表,上面的SQL語句中多次出現了T_Order、T_Customer,當欄位比較多的時候這樣的SQL語句看起來非常繁雜,為此可以使用表別名來簡化SQL語句的編寫,比如下面的SQL語句就與上面的SQL語句是等價的:


SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c.FAge FROM T_Order o JOIN T_Customer c ON o.FCustomerId= c.FId 

執行完畢我們就能在輸出結果中看到下面的執行結果:


FId FNumber FPrice FId FName FAge

1 K001 100.00 1 TOM 21

2 K002 200.00 1 TOM 21

3 T003 300.00 1 TOM 21

4 N002 100.00 2 MIKE 24

5 N003 500.00 3 JACK 30

6 T001 300.00 4 TOM 25

在使用表連線的時候可以不侷限於只連線兩張表,因為有很多情況下需要聯絡許多表。

例如,我們需要檢索每張訂單的訂單號、價格、客戶姓名、訂單型別等資訊,由於客戶資訊和訂單型別資訊是儲存在另外的表中的,因此需要同時連線T_Customer和T_OrderType兩張表才能檢索到所需要的資訊,編寫如下SQL語句即可:


INNER JOIN T_OrderType ON T_Order.FTypeId= T_OrderType.FId

執行完畢我們就能在輸出結果中看到下面的執行結果:


FNumber FPrice FName FName

K001 100.00 TOM MarketOrder

K002 200.00 TOM MarketOrder

T003 300.00 TOM LimitOrder

N002 100.00 MIKE LimitOrder

N003 500.00 JACK StopLimit Order

T001 300.00 TOM Stop Order