在本教學中,您將學習如何使用Oracle LEFT JOIN子句來查詢多個表中的數據。
Oracle LEFT JOIN子句簡介
以下語句說明連接兩個表T1和T2時的LEFT JOIN子句的語法:
SELECT
column_list
FROM
T1
LEFT JOIN T2 ON
join_predicate;
在這個查詢中,T1是左表,T2是右表。查詢將T1表中的每一行與T2表中的行進行比較。如果T1和T2表中的一對行滿足連接謂詞,查詢將組合兩個表中行的列值,並將結果行記錄包含在結果集中。
如果T1表中的行在T2表中沒有找到匹配的行,則查詢將會將SELECT子句中出現在T2表的每個列的值設置為NULL並與T1表的行記錄組合作為結果集輸出。
換句話說,左連接(Left join)返回左表中的所有行,並從右表中返回匹配的行。
Oracle LEFT JOIN示例
請參閱示例資料庫中的以下orders和employees表,其ER結構圖如下所示 -

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;
執行上面查詢語句,得到以下結果 -

如上圖中,結果包括訂單表中的所有行。 對於在employees表中沒有匹配行的orders表中的行記錄時,使用NULL值(紅色線框內)。
Oracle LEFT JOIN 連接多個表
以下語句使用LEFT JOIN子句演示如何連接三個表:orders, employees 和 customers,如下查詢語句 -
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 LEFT與USING子句聯接
USING子句指定在連接表時要測試哪個列的相等性。以下顯示了如何在LEFT JOIN中使用USING子句的語法:
SELECT
column_list
FROM
T1
LEFT JOIN T2 USING(c1,c2,c3, ...);
在這個語句中,USING子句中列出的列必須在T1和T2表中有存在。
上面查詢語句使用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;
執行上面查詢語句,得到以下結果 -

上面語句檢索所有客戶及其訂單。對於尚未下過任何訂單的客戶,SELECT子句使用NULL設置在orders表的列,即:order_id,status和order_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;
執行上面查詢語句,得到以下結果 -

現在,如果將條件從WHERE子句移動到LEFT JOIN的ON子句:
SELECT
order_id,
status,
employee_id,
last_name
FROM
orders
LEFT JOIN employees ON
employee_id = salesman_id
AND order_id = 58;
執行上面查詢語句,得到以下結果 -

在這種情況下,查詢將返回所有訂單,但只有訂單58具有與其關聯的銷售員數據。
請注意,對於內連接,置於ON中的條件與置於WHERE子句中的條件相同。
在本教學中,您已學習如何使用Oracle LEFT JOIN子句從多個表中檢索數據。
