Oracle左連線


在本教學中,您將學習如何使用Oracle LEFT JOIN子句來查詢多個表中的資料。

Oracle LEFT JOIN子句簡介

以下語句說明連線兩個表T1T2時的LEFT JOIN子句的語法:

SELECT
    column_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;

在這個查詢中,T1是左表,T2是右表。查詢將T1表中的每一行與T2表中的行進行比較。如果T1T2表中的一對行滿足連線謂詞,查詢將組合兩個表中行的列值,並將結果行記錄包含在結果集中。

如果T1表中的行在T2表中沒有找到匹配的行,則查詢將會將SELECT子句中出現在T2表的每個列的值設定為NULL並與T1表的行記錄組合作為結果集輸出。

換句話說,左連線(Left join)返回左表中的所有行,並從右表中返回匹配的行。

Oracle LEFT JOIN範例

請參閱範例資料庫中的以下ordersemployees表,其ER結構圖如下所示 -

Oracle左連接

orders表儲存銷售訂單標題資料。它的salesman_id列參照employees表中的employee_id列。

salesman_id列的值部分是無效的,這意味著並不是所有的訂單都有負責訂單的銷售人員。

以下語句從orders表和employees表中檢索所有訂單和員工資料:

SELECT
  order_id, 
  status, 
  first_name, 
  last_name
FROM
  orders
LEFT JOIN employees ON employee_id = salesman_id
ORDER BY
  order_date DESC;

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

Oracle左連接

如上圖中,結果包括訂單表中的所有行。 對於在employees表中沒有匹配行的orders表中的行記錄時,使用NULL值(紅色線框內)。

Oracle LEFT JOIN 連線多個表

以下語句使用LEFT JOIN子句演示如何連線三個表:orders, employeescustomers,如下查詢語句 -

SELECT
    order_id,
    name AS customer_name,
    status,
    first_name,
    last_name
FROM
    orders
LEFT JOIN employees ON
    employee_id = salesman_id
LEFT JOIN customers ON
    customers.customer_id = orders.customer_id
ORDER BY
    order_date DESC;

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

Oracle左連接

Oracle LEFT與USING子句聯接

USING子句指定在連線表時要測試哪個列的相等性。以下顯示了如何在LEFT JOIN中使用USING子句的語法:

SELECT
    column_list
FROM
    T1
LEFT JOIN T2 USING(c1,c2,c3, ...);

在這個語句中,USING子句中列出的列必須在T1T2表中有存在。

上面查詢語句使用USING子句改寫後等同於使用ON子句的語句,以下所示:

SELECT
    column_list
FROM
    t1
LEFT JOIN t2 ON
    t1.c1 = t2.c1
    AND t1.c2 = t2.c2
    AND t1.c3 = t2.c3
    AND ... ;

以下語句演示如何在LEFT JOIN中使用USING子句:

SELECT
    name,
    order_id,
    status,
    order_date
FROM
    customers
LEFT JOIN orders
        USING(customer_id)
ORDER BY
    name;

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

Oracle左連接

上面語句檢索所有客戶及其訂單。對於尚未下過任何訂單的客戶,SELECT子句使用NULL設定在orders表的列,即:order_idstatusorder_date

ON與WHERE子句中的條件

以下語句查詢獲得訂單ID為58的訂單和銷售員資料。

SELECT
    order_id,
    status,
    employee_id,
    last_name
FROM
    orders
LEFT JOIN employees ON
    employee_id = salesman_id
WHERE
    order_id = 58;

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

Oracle左連接

現在,如果將條件從WHERE子句移動到LEFT JOINON子句:

SELECT
    order_id,
    status,
    employee_id,
    last_name
FROM
    orders
LEFT JOIN employees ON
    employee_id = salesman_id
    AND order_id = 58;

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

Oracle左連接

在這種情況下,查詢將返回所有訂單,但只有訂單58具有與其關聯的銷售員資料。

請注意,對於內連線,置於ON中的條件與置於WHERE子句中的條件相同。

在本教學中,您已學習如何使用Oracle LEFT JOIN子句從多個表中檢索資料。