7. 조인(JOIN)

1. 조인이란?

조인(JOIN)은 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과셋으로 출력하는 SQL 명령이다.

테이블 간에 일치하는 칼럼을 기준으로 두 테이블을 하나로 합쳐 보여주는 방식으로 작동한다.

 

조인은 FROM의 테이블1을 기준으로 JOIN의 테이블2를 ON 키워드 다음의 조건으로 연결한다.

이때 사용하는 칼럼을 조인 칼럼이라고 하는데, 보통 한 테이블의 외래키(FK)와 다른 테이블의 기본키(PK)를 사용한다.

 

1.1. 기본 문법

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

 

조인 결과로 두 테이블의 칼럼이 일치하는 두 튜플(행)이 나란히 연결되어 출력된다.

 

1.2. 조인의 특징

 

1) 조인 칼럼이 필요하다

두 테이블 간에 조인을 수행하기 위해서는 최소한 하나의 조인 칼럼이 필요하다.

이 칼럼을 통해 두 테이블이 어떻게 연결될지 결정된다.

 

2) 조인 칼럼은 자료형이 일치해야 한다

자료형이 같은 칼럼만 조인 칼럼이 될 수 있다.

예를 들어 정수형 칼럼과 문자형 칼럼을 조인하면 에러가 발생한다.

 

3) 조인 조건을 명시해야 한다

두 테이블을 조인할 때 어떻게 연결할지 조인 조건을 명시해야 한다.

이는 ON 다음에 작성한다.

 

4) 연속적으로 조인할 수 있다

JOIN절 다음에 다시 JOIN절을 추가하면 여러 테이블에 걸쳐 연결이 가능하다.

 

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

 

5) 중복 칼럼은 테이블명을 붙여 구분한다

조인한 두 테이블에 같은 칼럼명이 있을 경우 SELECT에서 '테이블명.칼럼명'으로 테이블명을 붙여야 한다.

중복 칼럼이 아니라면 테이블명은 생략 가능하다.

 

SELECT 테이블1.id, 테이블1.name, 테이블2.date
FROM 테이블1 
JOIN 테이블2 ON 테이블1.id = 테이블2.id;

 

6) 테이블명에 별칭을 사용할 수 있다

FROM과 JOIN에 들어가는 테이블에 AS로 별칭을 붙여 사용할 수 있다.

별칭을 사용하면 코드를 더 간결하게 작성할 수 있다.

 

SELECT e.id, e.name, d.name AS department_name
FROM employees AS e
JOIN departments AS d ON e.dept_id = d.id;

 

7) 적절한 조인 유형을 선택한다

어떤 조인 유형을 선택하냐에 따라 결과 테이블의 형태와 데이터가 달라진다.

그러므로 상황에 따라 적절한 조인 유형을 선택해야 한다.

 

 

2. 조인 유형

2.1. INNER JOIN (내부 조인)

INNER JOIN은 기본 조인 방식으로 양쪽 테이블에서 조인 조건을 만족하는 데이터를 찾아 조인한다.

INNER 키워드는 생략 가능하며, JOIN만 사용하면 INNER JOIN을 사용하는 것이다.

 

INNER JOIN에는 조인 조건이 일치하는 데이터만 출력되고 NULL은 출력되지 않는다.

 

ex)

SELECT e.name, d.name AS department
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;

 

 

2.2. LEFT JOIN (왼쪽 조인)

LEFT JOIN은 왼쪽 테이블(FROM절의 테이블)의 모든 데이터에 대해 오른쪽(JOIN절의 테이블)의 데이터를 조인한다.

왼쪽 테이블은 모든 데이터를 출력하고, 오른쪽 테이블은 조건에 만족하는 데이터를 찾고, 없으면 NULL로 채운다.

 

ex)

SELECT e.name, d.name AS department
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;

 

 

2.3. RIGHT JOIN (오른쪽 조인)

RIGHT JOIN은 LEFT JOIN과 반대로 오른쪽 테이블의 모든 데이터에 대해 왼쪽의 데이터를 조인한다.

작동 방향만 반대가 됐을 뿐 사용 방법은 동일하다.

 

ex)

SELECT e.name, d.name AS department
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;

 

 

2.4. FULL JOIN (완전 조인)

FULL JOIN은 두 테이블의 모든 데이터를 결합하는 조인이다.

두 테이블에 조인 칼럼이 같은 데이터뿐만 아니라 없는 데이터도 NULL로 채운다.

LEFT JOIN과 RIGHT JOIN의 결과를 모두 합치고 중복 튜플을 제거한다고 이해하면 된다.

 

ex)

SELECT e.name, d.name AS department
FROM employees e
FULL JOIN departments d ON e.dept_id = d.id;

 

* 참고: MySQL은 FULL JOIN을 직접 지원하지 않지만, UNION 연산자를 이용해 같은 결과를 만들 수 있다.

 

 

3. UNION으로 FULL JOIN 구현

UNION 연산자는 두 쿼리의 결과 테이블을 하나로 합치는 집합 연산자로, 중복 튜플은 자동으로 제외하고 합친다.

만약 중복 튜플을 제거하고 싶지 않다면 UNION ALL 연산자를 사용한다.

 

UNION 연산자를 사용하려면 두 쿼리의 결과 테이블 내 칼럼 개수와 각 칼럼의 자료형이 일치해야 한다.

 

사용법:

(쿼리1) 
UNION 
(쿼리2)

 

UNION 연산자를 이용해 FULL JOIN의 결과를 만들려면 LEFT JOIN 결과와 RIGHT JOIN 결과를 UNION으로 합치면 된다.

 

ex)

(
    SELECT e.name, d.name AS department
    FROM employees e
    LEFT JOIN departments d ON e.dept_id = d.id
) 
UNION
(
    SELECT e.name, d.name AS department
    FROM employees e
    RIGHT JOIN departments d ON e.dept_id = d.id
);

 

'학습 > DB' 카테고리의 다른 글

9. 서브쿼리  (0) 2025.03.14
8. 그룹화, 정렬, 제한  (0) 2025.03.06
6. 관계와 제약조건  (0) 2025.02.26
5. 자료형과 필터링  (1) 2025.02.23
4. 집계 함수 및 데이터 처리  (0) 2025.02.21