이번 포스팅에서는 서로 다른 테이블을 결합하는 SQL JOIN에 대해 알아보도록 하겠습니다.
아래 두 테이블은 이번 포스팅을 작성하면서 사용할 celeb, snl 예제 테이블입니다.
(제로베이스 데이터스쿨 SQL 파트 강의 실습 데이터를 사용했습니다.)
1. INNER JOIN
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>
INNER JOIN <테이블B>
ON <테이블A>.<컬럼명> = <테이블B>.<컬럼명>;
여러 JOIN 방식 중 자주 사용하는 유형입니다.
마지막으로 살펴볼 SELF JOIN과 동일한 결과를 리턴합니다.
쿼리문의 ON절의 조건을 만족하는 데이터만 가져옵니다.
교집합 개념을 떠올리면 이해하기 쉽습니다.
SELECT *
FROM celeb
INNER JOIN snl
ON celeb.name = snl.host;
두 예제 테이블에 대해 INNER JOIN을 수행하는 예제입니다.
위 코드에서 ON절은 celeb 테이블의 name 값과 snl 테이블의 host 값이 동일한 데이터를 대상으로 지정합니다.
그 결과 ON절의 조건을 만족하는 데이터들만 두 테이블에서 가져오는 것을 확인할 수 있습니다.
2. LEFT JOIN
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>
LEFT JOIN <테이블B>
ON <테이블A>.<컬럼명> = <테이블B>.<컬럼명>;
LEFT JOIN은 첫 번째 테이블을 기준으로 두 번째 테이블을 합치는 JOIN 방식입니다.
첫 번째 테이블에 두 번째 테이블의 데이터를 덧붙인다고 볼 수 있습니다.
단, 합치는 테이블의 순서에 유의해야 합니다.
SELECT *
FROM celeb
LEFT JOIN snl
ON celeb.name = snl.host;
두 예제 테이블에 대해 LEFT JOIN을 수행하는 예제입니다.
오른쪽 빨간색 영역에 NULL값은 왜 생기는 걸까요?
그 이유는 첫 번째 celeb 테이블에는 snl 테이블의 몇몇 host 이름이 존재하지 않기 때문입니다.
따라서 ON절의 조건을 만족하지 못하는 데이터들은 NULL 값을 갖게 되는 것입니다.
3. RIGHT JOIN
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>
RIGHT JOIN <테이블B>
ON <테이블A>.<컬럼명> = <테이블B>.<컬럼명>;
기본적으로 LEFT JOIN과 동일하지만 두 번째 테이블로 기준이 바뀐다는 차이가 있습니다.
마찬가지로 합치는 테이블의 순서에 유의해야 합니다.
SELECT *
FROM celeb
RIGHT JOIN snl
ON celeb.name = snl.host;
두 예제 테이블에 대해 RIGHT JOIN을 수행하는 예제입니다.
LEFT JOIN의 경우와 달리 이번에는 첫 번째 파란색 영역에 NULL값이 생겼습니다.
이유는 동일합니다.
4. FULL OUTER JOIN
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>
LEFT JOIN <테이블B>
ON <테이블A>.<컬럼명> = <테이블B>.<컬럼명>
UNION
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>
RIGHT JOIN <테이블B>
ON <테이블A>.<컬럼명> = <테이블B>.<컬럼명>;
FULL OUTER JOIN은 공통되는 데이터들과 공통이 아닌 데이터들을 모두 포함하는 JOIN 방식입니다.
MySQL에서는 지원하지 않는 JOIN 방식이기 때문에 LEFT/RIGHT JOIN 코드와 UNION 명령어를 함께 사용해서 FULL OUTER JOIN을 구현할 수 있습니다.
SELECT *
FROM celeb
LEFT JOIN snl
ON celeb.name = snl.host
UNION
SELECT *
FROM celeb
RIGHT JOIN snl
ON celeb.name = snl.host;
두 예제 테이블에 대해 FULL OUTER JOIN을 수행하는 예제입니다.
첫 번째 파란색 영역과 두 번째 빨간색 영역 모두 NULL 값이 생성됐습니다.
이를 통해 FULL OUTER JOIN은 테이블의 모든 데이터를 합친다는 것을 알 수 있습니다.
5. SELF JOIN
SELECT <컬럼명1>, <컬럼명2>, ...
FROM <테이블A>, <테이블B>, ...
WHERE <조건>;
SELF JOIN은 자주 사용하는 조인 방식이며 INNER JOIN과 동일한 결과를 리턴합니다.
하지만 INNER JOIN에 비해 문법적으로 간결합니다.
한 가지 특징으로는 두 테이블에서 중복 컬럼명이 존재하지 않는다는 조건하에 컬럼명 입력시 테이블명을 생략할 수 있습니다.
SELECT *
FROM celeb, snl
WHERE celeb.name = snl.host;
두 예제 테이블에 대해 SELF JOIN을 수행하는 예제입니다.
리턴되는 결과가 INNER JOIN의 결과와 동일한 것을 확인할 수 있습니다.
마치며
이상으로 SQL JOIN에 대한 정리를 마치도록 하겠습니다.
조인이 이루어지는 순서에 유의해야 할 것 같습니다.
수평 방향으로 데이터를 조인 → SELECT 문으로 원하는 컬럼을 조회
'데이터베이스・SQL' 카테고리의 다른 글
[MySQL]SQL 쿼리문 실행 순서 정리하기 (0) | 2023.08.05 |
---|---|
[MySQL]SQL UNION 명령어 알아보기 (0) | 2023.07.26 |
[MySQL]스칼라 함수(Scalar Function) 정리 (0) | 2023.07.26 |
[MySQL]SQL 연산자 정리(비교/논리연산자) (0) | 2023.07.25 |
[MySQL]DB 테이블 데이터 다루기(INSERT/SELECT/UPDATE/DELETE) (0) | 2023.07.25 |