JOIN 이란?
SQL 이용하여 두 개의 테이블을 연결해 데이터 조회하는 것을 JOIN이라고 한다. 두 테이블 연결 작업이므로 이를 위한 연결고리가 필요하다. JOIN 칼럼은 두 테이블에서 같은 값을 가진 칼럼을 의미한다.
JOIN의 특징을 간단하게 살펴보고 넘어가려고 한다.
- JOIN 테이블은 서로 값은 값을 가진 칼럼이 존재해야 한다.
- 2개 이상의 테이블 JOIN 가능하다.
- JOIN 할 때 테이블에 대한 별칭을 사용한다.
- JOIN 시 조건이 필요하다
JOIN의 종류
막상 사진만 보면 이해하기 어려워 보일 수 있다. 하지만 학창 시절에 배운 집합을 떠올리면 이해하는데 도움이 될 것 같다. 하나씩 살펴보면서 이해해보려고 한다.
INNER JOIN
A 테이블과 B 테이블의 교집합을 생각하면 된다. 기본적인 SQL 쿼리 형태는 다음과 같다.
(A ∩ B)
SELECT *
FROM A AS a
JOIN B AS b
ON a.KEY = b.KEY
;
A, B 각각 테이블 1과 2 그리고 KEY를 COL1이라 보면 된다. 각 테이블에서 JOIN KEY COL1 값이 존재하는 데이터만 가져온 것을 확인할 수 있다.
LEFT OUTER JOIN
A, B 테이블의 교집합과 (A - B) 테이블(차집합)의 합집합이라고 보면 된다.
( (A ∩ B) ∪ (A - B) )
SELECT *
FROM A AS a
LEFT OUTER JOIN B AS b
ON a.KEY = b.KEY
;
COL1 값이 1, 2, 3인 경우는 교집합에 해당하고 나머지 5, 6은 차집합에 해당하는 값이다. 빈칸은 NULL 값이라고 보면 된다.
SELECT *
FROM A AS a
LEFT OUTER JOIN B AS b
ON a.KEY = b.KEY
WHERE b.KEY IS NULL
;
해당 이미지처럼 데이터를 뽑아 오고 싶다면 LEFT OUTER JOIN 후 위 결과 값처럼 b key 값이 NULL인 부분을 가져오면 얻을 수 있다.
RIGHT OUTER JOIN
A, B 테이블의 교집합과 (B - A) 테이블(차집합)의 합집합이라고 보면 된다.
( (A ∩ B) ∪ (B - A) )
SELECT *
FROM A AS a
RIGHT OUTER JOIN B AS b
ON a.KEY = b.KEY
;
마찬가지로 COL1 값이 1,2,3 교집합에 해당되고 나머지 4는 차집합에 해당되는 부분 빈칸은 NULL
SELECT *
FROM A AS a
RIGHT OUTER JOIN B AS b
ON a.KEY = b.KEY
WHERE a.KEY IS NULL
;
해당 이미지처럼 데이터를 뽑아 오고 싶다면 RIGHT OUTER JOIN 후 위 결과 값처럼 a key 값이 NULL인 부분을 가져오면 얻을 수 있다.
FULL OUTER JOIN
A, B 테이블의 합집합으로 이해하면 된다.
(A ∪ B)
SELECT *
FROM A AS a
FULL OUTER JOIN B AS b
ON a.KEY = b.KEY
;
결과 값은 모든 행들을 출력하고 a.KEY = b.KEY 조건에 만족하지 못하는 행들은 LEFT, RIGHT처럼 전부 NULL값을 가지게 된다.
위 결과 값대로 데이터를 얻고 싶다면
((A ∪ B) - (A ∩ B))
SELECT *
FROM A AS a
FULL OUTER JOIN B AS b
ON a.KEY = b.KEY
WHERE a.KEY IS NULL OR b.KEY IS NULL
;
a, b KEY 값들이 NULL 인 부분들만 추출해 주면 된다.
이상으로 JOIN 종류에 대해서 알아봤다. 집합만 잘 이해하고 있다면 문제없이 이해할 수 있을 거 같다.
'Devleop > MySQL' 카테고리의 다른 글
[MySQL] 원하는 문자열 부분 가져오기 (LEFT, MID, RIGHT) (0) | 2023.05.06 |
---|---|
[MySQL] GROUP : 데이터 그룹화, 집계 함수 (HAVING, COUNT, SUM, MAX, MIN, AVG) (1) | 2023.05.06 |
[MySQL] CASE 문 : 조건에 따라 값 정하기 (CASE WHEN THEN END) (0) | 2023.05.06 |