Oracle內連線


在本教學中,您將學習Oracle INNER JOIN子句,用來從表中檢索在其他表的匹配行的行。

Oracle INNER JOIN語法簡介

在關聯式資料庫中,資料分佈在許多相關的表中。例如,在樣本資料庫中,銷售訂單資料主要儲存在ordersorder_items表中。參考以下ER圖結構 -

orders表儲存訂單的標題資訊,order_items表儲存訂單購買貨物的明細。

訂單(orders)表通過order_id列連結到order_items表。這意味著對於orders表中的每一行,我們都可以在order_items表中,通過order_id列中找到具有相同值的一個或多個行資料。

要從兩個或多個相關表中查詢資料,請使用INNER JOIN子句。 以下語句說明如何連線兩個表T1T2

SELECT
  *
FROM
  T1
INNER JOIN T2 ON join_predicate;

下面讓我們仔細地來看看上面的語句:

  • 首先,在這種情況下,在FROM子句之後的T1是指定的主表。
  • 其次,在INNER JOIN子句中指定條件join_predicate。上面語句中的連線表是T2
  • 第三,連線謂詞指定了連線表的條件。只有滿足連線謂詞的行記錄才會包含在結果集中。

查詢通過基於連線謂詞組合表T1T2的列值來返回結果集。它將表T1的每一行與表T2的行進行比較,以查詢滿足連線謂詞的所有行記錄。只要通過匹配非NULL值來滿足連線謂詞,則T1T2表的每對匹配行的列值就會被合併到結果集中的一行中。

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子句中列出的列(如c1c2)必須在T1T2表中都存在(可用)。

以下範例使用INNER JOINUSING子句從orders表和order_items表中檢索資料:

SELECT
  *
FROM
  orders
INNER JOIN order_items USING( order_id )
ORDER BY
  order_date DESC;

執行上面範例程式碼,得到以下結果 -

3. INNER JOIN多表連線範例

內部聯接子句可以聯接兩個以上的表。 在實踐中,應該限制連線表的數量來提高效能。 以下語句顯示如何連線三個表:

以下語句顯示如何連線三個表:ordersorder_itemscustomers, 為了保證查詢語句的效率,超過三個表連線慎用。

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;

執行上面查詢語句,得到以下結果 -

以下範例說明如何連線四個表:ordersorder_itemscustomersproducts。參考以下查詢語句 -

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內部聯接從表中檢索具有其他表的匹配行的資料記錄。