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


上一篇: Oracle Any/Some運算符 下一篇: Oracle左連接