內連接組合兩張表,並且基於兩張表中的關聯關系來連接它們。使用內連接需要指定表中哪些字段組成關聯關系,並且需要指定基於什么條件進行連接。內連接的語法如下:
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