[SQL] 데이터베이스 입문 7일차_테이블 조인하기

조인의 개념

조인(join)이란 테이블 간에 일치하는 칼럼을 기준으로 두 테이블을 하나로 합쳐 보여주는 명령입니다. 두 테이블을 연결하면 각 테이블에 따로 저장된 데이터들을 한 번에 조회할 수 있습니다.

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

FROM 절의 ‘테이블A’를 기준으로 JOIN 절의 ‘테이블B’를 연결하라는 의미입니다.
조인 칼럼(join column)은 두 테이블을 조인하기 위해 사용하는 칼럼으로, 보통 한 테이블의 외래키(FK)와 다른 테이블의 기본키(PK)를 사용합니다.

조인의 특징

  • 조인의 칼럼이 필요하다
  • 조인 칼럼은 자료형이 일치해야 한다
  • 조인 조건을 명시해야 한다
  • 연속적으로 조인할 수 있다
  • 중복 칼럼은 테이블명을 붙여 구분한다
  • 테이블명에 별칭을 사용할 수 있다
  • 적절한 조인 유형을 선택한다

조인의 유형

INNER 조인

INNER 조인은 가장 기본이 되는 조인으로 양쪽 테이블에서 조인 조건을 만족하는 데이터를 찾아 조인합니다.

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
INNER JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

LEFT 조인

LEFT 조인은 왼쪽 테이블(FROM 절의 테이블)의 모든 데이터에 대해 오른쪽 테이블(JOIN 절의 테이블)을 조인합니다. 다시 말해 왼쪽 테이블의 모든 데이터에 대해 조인 조건을 만족하는 오른쪽 테이블의 데이터를 찾아 조인하고, 오른쪽 테이블에 해당하는 데이터가 없으면 NULL 값으로 채웁니다.

구분LEFT JOIN차집합 (Difference)
결과물왼쪽 모든 행 + 오른쪽 열 정보왼쪽 데이터 중 순수하게 혼자인 행만
데이터 수왼쪽 테이블 행 수와 같거나 많음왼쪽 테이블보다 무조건 적음
NULL의 의미“여긴 정보가 없네?”라고 표시결과물 자체가 NULL인 행만 남음
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
LEFT JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

RIGHT 조인

RIGHT 조인은 오른쪽 테이블(JOIN 절의 테이블)의 모든 데이터에 대해 왼쪽 테이블(FROM 절의 테이블)을 조인합니다. 오른쪽 테이블의 모든 데이터에 대해 조인 조건을 만족하는 왼쪽 테이블의 데이터를 찾아 조인하고, 왼쪽 테이블에 해당하는 데이터가 없다면 NULL 값으로 채웁니다. LEFT 조인과 비교하면 기준 테이블만 바뀌었습니다.

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
RIGHT JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

FULL 조인

FULL 조인은 두 테이블의 모든 데이터를 결합하는 조인입니다. 두 테이블에 조인 칼럼 값이 같은 데이터뿐만 아니라 그렇지 않고 한 테이블에만 존재하는 데이터도 모두 반환하고 빈 칼럼은 NULL 값으로 채웁니다. INNER 조인, LEFT 조인, RIGHT 조인한 것을 모두 합치고 중복 튜플을 제거한다고 이해하면 쉽습니다.

SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
FULL JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

아쉽게도 MySQL은 FULL 조인을 지원하지 않습니다. 하지만 UNION 연산자를 사용하면 FULL 조인한 결과처럼 만들 수 있습니다.

UNION 연산자

UNION 연산자는 두 쿼리의 결과 테이블을 하나로 합치는 집합 연산자로, 중복 튜플을 제거하고 합칩니다. 만약 중복 튜플을 제거하지 않고 합치고 싶다면 UNION ALL 연산자를 사용합니다. UNION 연산자를 사용하려면 두 쿼리의 결과 테이블 내 칼럼 개수와 각 칼럼의 자료형이 정확히 일치해야 합니다.

-- 중복 튜플 제거하고 합치기
(쿼리A)
UNION
(쿼리B);
-- 중복 튜플 그대로 둔 채 합치기
(쿼리A)
UNION ALL
(쿼리B);

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다