在本教學中,您將學習如何使用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)返回左表中的所有行,並從右表中返回匹配的行。
請參閱範例資料庫中的以下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
值(紅色線框內)。
以下語句使用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;
執行上面查詢語句,得到以下結果 -
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
。
以下語句查詢獲得訂單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
子句從多個表中檢索資料。