在本教學中,您將學習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
表的每對匹配行的列值就會被合併到結果集中的一行中。
以下查詢使用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
列中具有相同的值時,查詢將兩個表的行中的列值合併到結果行中,並將其包含在結果集中。
所以,執行上面查詢語句,得到以下結果 -
除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;
執行上面範例程式碼,得到以下結果 -
內部聯接子句可以聯接兩個以上的表。 在實踐中,應該限制連線表的數量來提高效能。 以下語句顯示如何連線三個表:
以下語句顯示如何連線三個表: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內部聯接從表中檢索具有其他表的匹配行的資料記錄。