[DB] 테이블 조인하기

artp·2025년 3월 27일
0

database

목록 보기
7/10
post-thumbnail

7. 테이블 조인하기

7.1 조인이란

7.1.1 조인의 개념

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

조인(join)을 통해 여러 테이블의 데이터를 마치 하나의 테이블처럼 활용할 수 있습니다.

조인 형식은 다음과 같습니다.

SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블A
JOIN 테이블B ON 테이블A.조인_컬럼 = 테이블B.조인_컬럼;
  • FROM 절의 '테이블 A'를 기준으로 JOIN 절의 '테이블 B'를 연결하라는 의미입니다.
  • ON 키워드 다음에는 조인 조건(두 테이블을 하나로 연결하는 조건)을 작성하는데, 이때 사용하는 컬럼을 조인 컬럼이라고 합니다.
  • 조인 컬럼(join column)은 두 테이블을 조인하기 위해 사용하는 컬럼으로, 보통 한 테이블의 외래키(FK)와 다른 테이블의 기본키(PK)를 사용합니다.

7.1.2 조인의 특징

두 테이블을 하나로 합치는 조인은 7가지 특징이 있습니다.

1. 조인 컬럼이 필요함

두 테이블 간에 조인을 수행하기 위해서는 최소한 하나의 공통 컬럼, 즉 조인 컬럼이 필요합니다.
조인 컬럼은 보통 한 테이블에서는 외래키(FK)이고, 다른 테이블에서는 기본키(PK)가 됩니다.

2. 조인 컬럼은 자료형이 일치해야 함

조인 컬럼은 서로 자료형이 일치해야 합니다. 예를 들어 정수형 값을 가진 컬럼과 문자형 값을 가진 컬럼을 조인하려고 하면 에러가 납니다. 자료형이 같은 컬럼만 조인 컬럼이 될 수 있습니다.

3. 조인 조건을 명시해야 함

두 테이블을 조인하려면 두 테이블을 어떻게 연결할지를 조인 조건으로 명시해야 합니다.
이는 JOIN 절의 ON 키워드 다음에 작성합니다.

4. 연속적으로 조인할 수 있음

조인은 2개 테이블뿐만 아니라 3개, 4개 ... 로 늘려가며 수행할 수 있습니다. 다음과 같이 JOIN 절을 추가하면 comments 테이블과 users 테이블을 합친 결과에 다시 photos 테이블을 합칠 수 있습니다.

-- 연속 조인 연습
SELECT nickname, body, filename					-- 4. 원하는 컬럼 조회
FROM comments									-- 1. comments 테이블에
JOIN users ON comments.user_id = users.id		-- 2. users 테이블 조인하고
JOIN photos ON comments.photo_id = photos.id;	-- 3. 다시 photos 테이블 조인 후

5. 중복 컬럼은 테이블명을 붙여 구분함

조인한 두 테이블에 중복 컬럼, 즉 같은 컬럼명이 있을 경우 '테이블명.컬럼명'과 같이 컬럼명 앞에 테이블명을 붙여 사용합니다. 중복 컬럼인데 테이블명을 명시하지 않으면 에러가 발생합니다.
중복 컬럼이 아니라면 테이블명은 생략할 수 있습니다.

-- 중복 컬럼 id에 테이블명 명시
SELECT comments.id, body, users.id, nickname
FROM comments
JOIN users ON comments.user_id = users.id
WHERE photo_id = 2;

6. 테이블명에 별칭을 사용할 수 있음

조인하는 테이블명은 별칭을 붙여 사용할 수 있습니다. 테이블명을 그대로 사용하지 않고 별칭을 붙이면 쿼리의 가독성을 높이고 쿼리 작성을 간소화할 수 있습니다. 별칭을 붙일 때는 AS 키워드를 사용합니다.

-- comments 테이블과 users 테이블에 별칭 붙이기
SELECT nickname, body
FROM comments AS c
JOIN users AS u ON c.user_id = u.id;

7. 적절한 조인 유형을 선택해야 함

조인할 때는 상황에 따라 적절한 조인 유형(INNER, LEFT, RIGHT, FULL)을 선택해야 합니다. 어떤 조인 유형을 선택하느냐에 따라 테이블의 형태와 포함되는 데이터가 달라집니다.

7.2 조인의 유형

조인의 유형에는 INNER 조인, LEFT 조인, RIGHT 조인, FULL 조인이 있습니다.

7.2.1 INNER 조인

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

INNER 조인의 형식은 다음과 같습니다.

SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블A
INNER JOIN 테이블B ON 테이블A.조인_컬럼 = 테이블B.조인_컬럼;
  • INNER 키워드는 생략할 수 있습니다. 따라서 JOIN만 단독으로 사용할 경우 INNER JOIN을 의미합니다.

7.2.2 LEFT 조인

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

LEFT 조인의 형식은 다음과 같습니다.

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

7.2.3 RIGHT 조인

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

RIGHT 조인의 형식은 다음과 같습니다.

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

일반적으로는 왼쪽 테이블을 기준으로 하는 LEFT JOIN을 사용하는 것이 권장됩니다.
LEFT JOIN은 더 직관적이며, 표준 SQL에서도 가장 널리 사용되는 방식이기 때문입니다.

7.2.4 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);

7.3 정리

7.3.1 조인

테이블 간에 일치하는 컬럼을 기준으로 두 테이블을 하나로 합치는 명령입니다. 두 테이블을 연결하면 각 테이블에 따로 저장된 데이터들을 한 번에 조회할 수 있습니다.

7.3.2 조인 컬럼

두 테이블을 조인하는 데 사용하는 컬럼으로, 두 테이블 간에 공통된 값을 가지고 있는 컬럼을 사용합니다. 보통 한 테이블의 외래키(FK)와 다른 테이블의 기본키(PK)를 조인 컬럼으로 사용합니다.

7.3.3 INNER 조인

가장 기본이 되는 조인으로, 두 테이블에서 조인 조건을 만족하는 데이터를 찾아 연결합니다. INNER 키워드는 생략할 수 있습니다.

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

7.3.4 LEFT 조인

왼쪽 테이블(FROM 절의 테이블)의 모든 데이터에 대해 오른쪽 테이블(JOIN 절의 테이블)의 조인 조건을 만족하는 데이터를 찾아 조인하고, 조인이 불가능한 데이터는 NULL 값으로 채워 결과 테이블을 완성합니다.

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

7.3.5 RIGHT 조인

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

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

7.3.6 FULL 조인

두 테이블 간 모든 튜플을 결합하는 조인입니다. 두 테이블에 조인 컬럼 값이 같은 데이터뿐만 아니라 한 테이블에만 존재하는 데이터도 모두 반환하고 빈 컬럼은 NULL 값으로 채웁니다.
MySQL에서는 FULL 조인을 지원하지 않습니다.

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

7.3.7 UNION 연산자

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

(쿼리 A)
UNION
(쿼리 B);
profile
donggyun_ee

0개의 댓글