# [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>

假設有下列兩個資料表
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

```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 的資料

```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|