# [SQL]JOIN 觀念 ###### tags: `SQL` `database` > [time= 2019 11 06 ] > 原文 & 參考: > https://dotblogs.com.tw/hatelove/2010/01/23/sql-join-concept > https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ <br> ![](https://i.imgur.com/f9MwmbG.png) 假設有下列兩個資料表 USER: |userID|userName| |------|------| |1|Roy| |2|Vivi| |3|Allen| <br> USERMESSAGE: |messageID|userID|message| |------|------|------| |1|2|hello Vivi| |2|3|hello Allen| |3|4|hello jones| <br><br> ## INNER JOIN ```sql= SELECT * FROM USER A JOIN USERMESSAGE B ON A.USERID = B. USERID ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |2|Vivi|1|2|hello Vivi| |3|Allen|2|3|hello Allen| <br><br> ## FULL JOIN ```sql= SELECT * FROM USER A FULL JOIN USERMESSAGE B ON A.USERID = B. USERID ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |1|Roy|NULL|NULL|NULL| |2|Vivi|1|2|hello Vivi| |3|Allen|2|3|hello Allen| |NULL|NULL|3|4|hello jones| <br><br> ## LEFT JOIN ```sql= SELECT * FROM USER A LEFT JOIN USERMESSAGE B ON A.USERID = B. USERID ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |1|Roy|NULL|NULL|NULL| |2|Vivi|1|2|hello Vivi| |3|Allen|2|3|hello Allen| USER 資料表的資料一定會顯示(因為是 LEFT), 但 USERMESSAGE 只會顯示匹配成功的資料, 所以沒匹配到的其餘都帶 NULL <br><br> ## RIGHT JOIN ```sql= SELECT * FROM USER A RIGHT JOIN USERMESSAGE B ON A.USERID = B. USERID ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |2|Vivi|1|2|hello Vivi| |3|Allen|2|3|hello Allen| |NULL|NULL|3|4|hello jones| USERMESSAGE 資料表的資料一定會顯示(因為是 RIGHT), 但 USER 只會顯示匹配成功的資料, 所以沒匹配到的其餘都帶 NULL <br><br> ## 顯示所有 USER 但不交集 USERMESSAGE ![](https://i.imgur.com/dybi8Bs.png) ```sql= SELECT * FROM USER A LEFT JOIN USERMESSAGE B ON A.USERID = B. USERID WHERE B.USERID IS NULL ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |1|Roy|NULL|NULL|NULL| 因為條件 B.USERID IS null 讓原本 USER 和 USERMESSAGE 都有的資料過濾掉了 <br><br> ## 去除 USER 交集 USERMESSAGE 的資料 ![](https://i.imgur.com/btYhLLf.png) ```sql= SELECT * FROM USER A FULL JOIN USERMESSAGE B ON A.USERID = B. USERID WHERE A.USERID IS NULL OR B.USERID IS NULL ``` 結果為: |userID|userName|messageID|userID|message| |------|------|------|------|------| |1|Roy|NULL|NULL|NULL| |NULL|NULL|3|4|hello jones|