JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。
舉例來說,就是 orders 資料表的 drink_id 會對應到 drinks 資料表的 id。
我們先從FROM跟INNER JOIN找到T1和T2,因為INNER JOIN
是用來結合兩個或多個表格的行,並返回符合指定條件(Join Condition)的所有行。這些被選出來的行會被結合成一個新的表格。在這個新的表格中,你可以選擇你想要的欄位。
它只會選出參考點上「兩者皆有」的資料,如果參考點對不上的話,這筆資料就不會被查詢出來:
SELECT orders.*, drinks.`name`
FROM drinks
JOIN orders
ON drinks.`id` = orders.`drink_id`;
這段指令可以看到:
FROM
是原本的資料表。JOIN
是我們要加入查詢的另一張資料表。 (雖然在 INNER JOIN 中沒有差異,反過來也行)ON
則是參考點。在 SELECT
欄位的部分,我們不只寫了欄位名稱,連資料表名稱都寫上了,這是因為 JOIN
牽涉到多張資料表,有可能出現欄位一樣的情形。例如 drinks 有 name 代表「飲料名稱」,customers 也有 name 代表「顧客姓名」,只寫欄位名稱的話,會造成衝突,因此將資料表名稱也寫出來以免這種錯誤。
當我們使用 LEFT JOIN 時,我們會將兩個表格分成左表(left table)和右表(right table)。LEFT JOIN 會返回左表中的所有記錄,即使在右表中沒有匹配的記錄。這意味著即使左表中的某些記錄在右表中找不到對應的記錄,這些記錄仍然會出現在結果中,並且右表中對應的欄位會顯示為 NULL。
簡單來說,LEFT JOIN 會包含左表中的所有記錄,以及右表中能夠匹配的記錄。這與 INNER JOIN 不同,INNER JOIN 只會返回兩個表中都有匹配記錄的部分。
FROM
和 LEFT JOIN
中看到有 T1 和 T2,這兩個表格需要合併。NULL
。LEFT JOIN
範例:SELECT customers.customer_id, customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
透過 LEFT JOIN
操作來找出存在在左表中,但不存在右表中的記錄。這對於查找缺失數據或進行數據清理時非常有用。
例如,假設有兩個表:customers
和 orders
。我們想找出所有沒有訂單的客戶。可以使用以下查詢:
SELECT customers.customer_id, customers.name
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.order_id IS NULL;
當我們使用 RIGHT JOIN 時,我們會將兩個表格分成右表(right table)和左表(left table)。RIGHT JOIN 會返回右表中的所有記錄,即使在左表中沒有匹配的記錄。這意味著即使右表中的某些記錄在左表中找不到對應的記錄,這些記錄仍然會出現在結果中,並且左表中對應的欄位會顯示為 NULL。
簡單來說,RIGHT JOIN 會包含右表中的所有記錄,以及左表中能夠匹配的記錄。這與 INNER JOIN 不同,INNER JOIN 只會返回兩個表中都有匹配記錄的部分。
使用 RIGHT JOIN
時,右表(Right Table)的所有記錄都會包含在結果中。這個結果可以分成兩部分:
總結來說,RIGHT JOIN
的特性是確保右表中的所有記錄都會出現在合併結果中。
SELECT orders.*, drinks.`name`
FROM orders
RIGHT JOIN drinks
ON drinks.`id` = orders.`drink_id`;
SELECT orders.*, drinks.`name`
FROM drinks
LEFT JOIN orders
ON drinks.`id` = orders.`drink_id`;
SELF JOIN 是指在同一個表格中進行的 JOIN 操作。這不是一種新的 SQL 語法,而是使用現有的 JOIN 方式(如 INNER JOIN、LEFT JOIN 等)來合併同一個表格。
SELF JOIN 的主要用途是當一個表格中有多種角色或關係時,我們需要將這些角色或關係進行比較或關聯。使用 SELF JOIN 時,必須要給表格別名(Table Alias),這樣在 JOIN 條件和 SELECT 欄位的地方,才能區分到底是哪一個表格,SQL 才能正確地辨識出來。
deputy_employee_id
,則我們可以用以下的指令:SELECT e1.*, e2.name
FROM employee AS e1
JOIN employee AS e2
ON e1.deputy_employee_id = e2.id
查詢的結果將顯示每個員工(e1
)的所有資訊,以及他們的「職位代理人」(e2
)的名字。這樣可以幫助我們了解每個員工及其職位代理人之間的關係。
SELECT d1.name, d2.name as cheaper_name, d2.price
FROM drinks as d1
JOIN drinks as d2
ON d1.price > d2.price
WHERE d1.name = '冰咖啡';
查詢的結果將顯示 d1
表格中名為 '冰咖啡'
的飲料,以及所有價格比 '冰咖啡'
便宜的飲料的名字和價格。這樣可以幫助我們找到所有比 '冰咖啡'
便宜的飲料。