在本教學中,您將學習Oracle INNER JOIN
子句,用來從表中檢索在其他表的匹配行的行。
Oracle INNER JOIN語法簡介
在關係資料庫中,數據分佈在許多相關的表中。例如,在樣本資料庫中,銷售訂單數據主要存儲在orders
和order_items
表中。參考以下ER圖結構 -
orders
表存儲訂單的標題資訊,order_items
表存儲訂單購買貨物的明細。
訂單(orders
)表通過order_id
列鏈接到order_items
表。這意味著對於orders
表中的每一行,我們都可以在order_items
表中,通過order_id
列中找到具有相同值的一個或多個行數據。
要從兩個或多個相關表中查詢數據,請使用INNER JOIN
子句。 以下語句說明如何連接兩個表T1
和T2
。
SELECT
*
FROM
T1
INNER JOIN T2 ON join_predicate;
下麵讓我們仔細地來看看上面的語句:
- 首先,在這種情況下,在
FROM
子句之後的T1
是指定的主表。 - 其次,在
INNER JOIN
子句中指定條件join_predicate
。上面語句中的連接表是T2
。 - 第三,連接謂詞指定了連接表的條件。只有滿足連接謂詞的行記錄才會包含在結果集中。
查詢通過基於連接謂詞組合表T1
和T2
的列值來返回結果集。它將表T1
的每一行與表T2
的行進行比較,以查找滿足連接謂詞的所有行記錄。只要通過匹配非NULL
值來滿足連接謂詞,則T1
和T2
表的每對匹配行的列值就會被合併到結果集中的一行中。
1. Oracle INNER JOIN示例
以下查詢使用INNER JOIN
子句從orders
表和order_items
表中檢索數據:
SELECT
*
FROM
orders
INNER JOIN order_items ON
order_items.order_id = orders.order_id
ORDER BY
order_date DESC;
在這個例子中,連接謂詞(條件)是 -
order_items.order_id = orders.order_id
查詢將orders
表中的每一行與order_items
表中的行進行比較。當兩個表中的行在order_id
列中具有相同的值時,查詢將兩個表的行中的列值合併到結果行中,並將其包含在結果集中。
所以,執行上面查詢語句,得到以下結果 -
2. 使用USING子句的Oracle INNER JOIN示例
除ON
子句外,還可以使用USING
子句指定在連接表時要測試哪些列的相等性。
下麵用USING
子句說明INNER JOIN
的語法。
SELECT
*
FROM
T1
INNER JOIN T2 ON( c1, c2, ... );
請注意,USING
子句中列出的列(如c1
和c2
)必須在T1
和T2
表中都存在(可用)。
以下示例使用INNER JOIN
和USING
子句從orders
表和order_items
表中檢索數據:
SELECT
*
FROM
orders
INNER JOIN order_items USING( order_id )
ORDER BY
order_date DESC;
執行上面示例代碼,得到以下結果 -
3. INNER JOIN多表連接示例
內部聯接子句可以聯接兩個以上的表。 在實踐中,應該限制連接表的數量來提高性能。 以下語句顯示如何連接三個表:
以下語句顯示如何連接三個表:orders
,order_items
和customers
, 為了保證查詢語句的效率,超過三個表連接慎用。
SELECT
name,
order_id,
order_date,
item_id,
product_id,
quantity,
unit_price
FROM
orders
INNER JOIN order_items
USING(order_id)
INNER JOIN customers
USING(customer_id)
ORDER BY
order_date DESC,
order_id DESC,
item_id ASC;
執行上面查詢語句,得到以下結果 -
以下示例說明如何連接四個表:orders
,order_items
,customers
和products
。參考以下查詢語句 -
SELECT
name AS customer_name,
order_id,
order_date,
item_id,
product_name,
quantity,
unit_price
FROM
orders
INNER JOIN order_items
USING(order_id)
INNER JOIN customers
USING(customer_id)
INNER JOIN products
USING(product_id)
ORDER BY
order_date DESC,
order_id DESC,
item_id ASC;
執行上面示例查詢語句,得到以下結果 -
在本教學中,您已學習如何使用Oracle內部聯接從表中檢索具有其他表的匹配行的數據記錄。