백엔드 개발자
SQL JOIN 종류 [ INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN] 본문
JOIN
두 개의 테이블을 합치는 것을 JOIN이라고 한다.
JOIN을 하는 방법은 크게 4가지 정도가 있다.
설명을 위해 두 개의 테이블이 있다고 가정하겠다.
User 테이블
user_id | name | age | item_id |
---|---|---|---|
1 | 홍길동 | 20 | 1 |
2 | 최세은 | 25 | 2 |
3 | 이가경 | 25 | 3 |
Item 테이블
item_id | name | price |
---|---|---|
1 | 부활 | 1000 |
2 | 시간증가 | 500 |
INNER JOIN
우선 가장 많이 사용되는 JOIN 방법이다.
A와 B테이블의 공통된 부분만 가져오는 것이다.
그냥 JOIN 명령어를 사용하면 기본적으로 INNER JOIN 을 한다.
SELECT * FROM User A
INNER JOIN Item B ON
A.item_id = B.item_id
결과는 두 테이블에 공통적으로 존재하는 것만 나오므로
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
이러한 결과가 나오게 된다.
User 테이블의 3번은 아이템 id가 3이라고 하는데 item_id 가 3인 것은 존재하지 않으므로 나오지 않는다.
LEFT OUTER JOIN
LEFT OUTER JOIN 은 LEFT JOIN 이라고도 한다.
왼쪽 테이블을 기준으로 왼쪽 테이블의 내용은 전부 출력하고 오른쪽 테이블과 공통인 부분을 매핑하여 보여주는 방식이다.
SELECT * FROM User A
LEFT JOIN Item B ON
A.item_id = B.item_id
결과 :
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
3 | 이가경 | 25 | 3 | null | null |
왼쪽 테이블을 모두 보여주는데 B테이블과 매칭되는 것이 없으면 null 로 표시해준다.
RIGHT OUTER JOIN
LEFT OUTER JOIN 과 마찬가지로 방향만 전환된 케이스이다.
이것은 오른쪽 테이블을 기준으로 오른쪽 테이블의 내용은 전부 출력하고 왼쪽 테이블과 공통인 부분을 매핑하여 보여준다.
LEFT JOIN으로 구현가능하므로 대부분 LEFT JOIN 으로 해결한다. (위에서 테이블 순서만 바꾸면 됨.)
그래서 사용예시를 보자면
SELECT * FROM User A
RIGHT JOIN Item B ON
A.item_id = B.item_id
결과 :
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
FULL OUTER JOIN
이 방식은 모든 테이블 값을 가져온다.
이 명령어를 지원하지는 않고 LEFT JOIN 과 OUTER JOIN 을 합쳐서 사용할 수 있다.
SELECT * FROM User A
LEFT JOIN Item B ON
A.item_id = B.item_id
UNION
SELECT * FROM User A
RIGHT JOIN Item B ON
A.item_id = B.item_id
UNION 을 사용하여 LEFT JOIN 결과 값과 RIGHT JOIN 결과를 합쳐 출력할 수 있다. UNION 은 기본적으로 DISTINCT 이다.
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
3 | 이가경 | 25 | 3 | null | null |
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
==> LEFT JOIN 결과와 RIGHT JOIN 결과가 합쳐지는데
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
1 | 홍길동 | 20 | 1 | 부활 | 1000 |
2 | 최세은 | 25 | 2 | 시간증가 | 500 |
3 | 이가경 | 25 | 3 | null | null |
==> 중복된 결과는 제거되므로 이러한 결과가 나오게 된다.
EXCLUSIVE JOIN
추가로 EXCLUSIVE JOIN 도 있다.
A 테이블과 B 테이블에서 A 테이블에만 해당하는 값들을 가져오는 것이다.
이것도 LEFT JOIN 을 이용하여 구현할 수 있다.
SELECT * FROM User A
LEFT JOIN Item B ON
A.item_id = B.item_id WHERE B.item_id IS NULL
B의 아이디 값이 null 이면 B에는 존재하지 않는 것이므로 A테이블에만 해당되는 값들을 구할 수 있다.
결과 :
user_id | name | age | item_id | name | price |
---|---|---|---|---|---|
3 | 이가경 | 25 | 3 | null | null |
끝 ~~
'CS > 데이터베이스' 카테고리의 다른 글
DB 트랜잭션과 격리 수준 (0) | 2024.11.07 |
---|