# 05 連結兩個或多個表格資料的 JOIN ## LEFT JOIN ![CleanShot 2024-01-24 at 16.16.24@2x](https://hackmd.io/_uploads/HyrDPHRFT.jpg) LEFT JOIN 是以左表格作爲**主表格**,右表格則是**從表格** `product_category 1->* product_category` ```sql= SELECT * FROM product LEFT JOIN product_category ON product.product_category_id = product_category.product_category_id ``` ![CleanShot 2024-01-24 at 16.36.26@2x](https://hackmd.io/_uploads/HkPu3BRFT.jpg) 重複的欄位名稱:product_category_id ### 爲表格取別名 ```sql= SELECT p.product_id, p.product_name, pc.product_category_id, pc.product_category_name FROM product AS p LEFT JOIN product_category AS pc ON p.product_category_id = pc.product_category_id ORDER BY pc.product_category_name, p.product_name ``` ### JOIN 同一個表格 ![CleanShot 2024-01-24 at 16.42.28@2x](https://hackmd.io/_uploads/r1PF6rRKp.jpg) ## RIGHT JOIN ![CleanShot 2024-01-24 at 16.44.30@2x](https://hackmd.io/_uploads/BJbbRrRFT.jpg) RIGHT JOIN 是以右表格作爲**主表格**,左表格則是**從表格** ```sql= SELECT * FROM product RIGHT JOIN product_category ON product.product_category_id = product_category.product_category_id ``` ![CleanShot 2024-01-24 at 16.47.07@2x](https://hackmd.io/_uploads/By0AABRt6.jpg) > table1 LEFT JOIN table2 是否等同於 table2 RIGHT JOIN table1? 是 ## INNER JOIN ![CleanShot 2024-01-24 at 16.51.04@2x](https://hackmd.io/_uploads/H1UKJI0K6.jpg) LEFT JOIN ![CleanShot 2024-01-24 at 16.53.06@2x](https://hackmd.io/_uploads/H1YWeLRFp.jpg) RIGHT JOIN ![CleanShot 2024-01-24 at 16.55.01@2x](https://hackmd.io/_uploads/H1P_xIRtT.jpg) INNER JOIN ![CleanShot 2024-01-24 at 16.55.32@2x](https://hackmd.io/_uploads/SkD9e8CFT.jpg) ## 篩選連結資料時常見的陷阱 ```sql= SELECT * FROM customer AS c LEFT JOIN customer_purchases AS cp ON c.customer_id = cp.customer_id WHERE cp.customer_id > 0 ``` > 有 WHERE 子句跟沒有 WHERE 子句差別在哪? 沒有購買記錄的 customer 會被篩除 所以如果希望看到右邊表格沒有對應的資料也可以回傳 NULL,那就不要對右邊表格做篩選 --- 現在想要寫一個查詢,回傳所有除了 2019-04-03 以外購買的顧客清單(包含尚未有購買記錄的) ```sql= SELECT c.*, cp.market_date FROM customer AS c LEFT JOIN customer_purchases AS cp ON c.customer_id = cp.customer_id WHERE cp.market_date <> '2019-04-03' ``` 這樣會有什麼問題? 問題1: 沒有購買記錄的顧客會被篩除 ![CleanShot 2024-01-24 at 17.07.06@2x](https://hackmd.io/_uploads/r1Ar7IRta.jpg) 解法: ```sql= SELECT c.*, cp.market_date FROM customer AS c LEFT JOIN customer_purchases AS cp ON c.customer_id = cp.customer_id WHERE (cp.market_date <> '2019-04-03' OR cp.market_date IS NULL) ``` ![CleanShot 2024-01-24 at 17.07.23@2x](https://hackmd.io/_uploads/B1xP7LCtp.jpg) 問題2: 同一位顧客的名字會出現很多次 解法: ```sql= SELECT DISTINCT c.* FROM customer AS c LEFT JOIN customer_purchases AS cp ON c.customer_id = cp.customer_id WHERE (cp.market_date <> '2019-04-03' OR cp.market_date IS NULL) ``` ## JOIN 兩個以上的表格 ![CleanShot 2024-01-24 at 17.09.22@2x](https://hackmd.io/_uploads/HyBAmLRtT.jpg) A LEFT JOIN B, B LEFT JOIN C ```sql= SELECT b.booth_number, b.booth_type, vba.market_date, v.vendor_id, v.vendor_name, v.vendor_type FROM booth AS b LEFT JOIN vendor_booth_assignments AS vba ON b.booth_number = vba.booth_number LEFT JOIN vendor AS v ON v.vendor_id = vba.vendor_id ORDER BY b.booth_number, vba.market_date ``` A LEFT JOIN B A LEFT JOIN C ![CleanShot 2024-01-24 at 17.11.51@2x](https://hackmd.io/_uploads/SyUPN8Rtp.jpg)