
inner join, left (outer) join, right (outer) join에 대해서 알아보자
사용할 예시 테이블은 아래와 같다.

users table
| id | name | |
|---|---|---|
| 1 | kim@gmail.com | kim |
| 2 | lee@gmail.com | lee |
| 3 | park@gmail.com | park |
channels table
| id | name | user_id |
|---|---|---|
| 1 | kimtube | 1 |
| 2 | leetube | 2 |
SELECT [...] FROM [table A] INNER JOIN [table B] ON A.Value = B.Value;
SELECT * FROM users INNER JOIN channels ON users.id = channels.user_id;
실행 결과
| id | name | id | name | user_id | |
|---|---|---|---|---|---|
| 1 | kim@gmail.com | kim | 1 | kimtube | 1 |
| 2 | lee@gmail.com | lee | 2 | leetube | 2 |
SELECT * FROM channels INNER JOIN users ON users.id = channels.user_id;
실행 결과
| id | name | user_id | id | name | |
|---|---|---|---|---|---|
| 1 | kimtube | 1 | 1 | kim@gmail.com | kim |
| 2 | leetube | 2 | 2 | lee@gmail.com | lee |
SELECT * FROM channels, users WHERE channels.user_id = users.id;
위와 같이 작성한 것을 암시적으로 작성했다고 한다.
실행 결과는 명시적 표현과 동일하게 나온다.
(channels를 먼저 작성할 경우 channels의 fields와 records 먼저 나오고 users가 나온다.)
SELECT [...] FROM [table A] LEFT JOIN [table B] ON A.Value = B.Value;
왼쪽 테이블을 중심으로 오른쪽 테이블을 매칭시킨다.
왼쪽의 record는 무조건 표시하고,
오른쪽의 record 중 조건에 맞는 record가 없다면, null로 표시.
오른쪽의 record 중 조건에 맞는 record가 여러 개면, 왼쪽의 record를 여러번 표시.
SELECT u.name AS user_name, c.name AS channel_name
FROM users AS u LEFT JOIN channels AS c
ON u.id = c.user_id;
실행 결과
| user_name | channel_name |
|---|---|
| kim | kimtube |
| lee | leetube |
| park | null |
is null을 활용해서 한쪽 테이블에만 존재하는 데이터도 뽑아낼 수 있다.
SELECT u.name AS user_name, c.name AS channel_name
FROM users AS u LEFT JOIN channels AS c
ON u.id = c.user_id
WHERE c.user_id is null;
실행 결과
| user_name | channel_name |
|---|---|
| park | null |
SELECT [...] FROM [table A] RIGHT JOIN [table B] ON A.Value = B.Value;
오른쪽 테이블을 중심으로 왼쪽 테이블을 매칭시킨다.
오른쪽의 record는 무조건 표시하고,
왼쪽의 record 중 조건에 맞는 record가 없다면, null로 표시.
왼쪽의 record 중 조건에 맞는 record가 여러 개면, 오른쪽의 record를 여러번 표시.
SELECT u.name AS user_name, c.name AS channel_name
FROM channels AS c RIGHT JOIN users AS u
ON u.id = c.user_id;
쉬운 비교를 위해 LEFT JOIN의 예시와 FROM 절의 user와 channel의 위치만 바꿨다.
실행 결과
| user_name | channel_name |
|---|---|
| kim | kimtube |
| lee | leetube |
| park | null |
SELECT u.name AS user_name, c.name AS channel_name
FROM channels AS c RIGHT JOIN users AS u
ON u.id = c.user_id
WHERE c.user_id is null;
실행 결과
| user_name | channel_name |
|---|---|
| park | null |