1. JOIN이란?


JOIN은 2개 이상의 테이블을 엮어서 조회하는 연산입니다.

다음과 같은 종류가 있습니다.

  1. Inner JOIN: 서로 매칭되는 것만 조회한다. (교집합)
  2. Outer JOIN: 매칭되는 데이터를 기준으로 좌측 또는 우측의 데이터도 같이 조회합니다.
    Outer JOIN은 세 종류가 있습니다 --> Left Outer JOIN, Right Outer JOIN, Full Outer JOIN
  3. Natural JOIN: 두 테이블을 JOIN할때 컬럼명, 타입이 같은 모든 컬럼을 JOIN 조건으로 사용합니다.
  4. Selft JOIN: 자기 자신의 테이블을 JOIN하는 것입니다.
    employees 테이블이 사원번호, 상사번호를 가지고 있다고 가정해보겠습니다. 이때, 특정 사원의 상사를 구하고 싶다면 Self JOIN을 사용해야합니다.

2. Inner JOIN


Inner JOIN은 두 테이블간 조건에 매칭되는 데이터만을 조회합니다. 즉, 교집합으로 볼 수 있습니다.

아래와 같은 두 테이블이 있다고 가정해보겠습니다. (해당 글의 모든 예시는 아래 테이블을 기준으로 하겠습니다.)

[그림 1] 예시 테이블

두 테이블을 JOIN하는 가장 기본적인 쿼리는 다음과 같습니다.

SELECT *
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id

-- 위 쿼리는 다음과 같이 작성할 수도 있습니다.
-- 그냥 JOIN이라 적으면 INNER JOIN으로 인식합니다.
-- ON절에 넣을 컬럼명이 서로 동일하다면 USING을 사용할 수 있습니다.
SELECT *
FROM employees e JOIN departments d
USING(department_id)

3. Self JOIN


 

사원의 매니저를 출력하고 싶다면 다음과 같이 Self JOIN을 사용합니다.

SELECT distinct(e1.employee_id), CONCAT(first_name, ' ', last_name)
FROM employees e1 JOIN employees e2
ON e1.employee_id = e2.manager_id;

4. Outer Join


모든 사원이 부서에 소속된건 아니라고 생각해보겠습니다. 이때, 모든 사원의 정보와 부서명을 함께 출력하고 싶다면 어떻게 해야할까요?

만약 INNER JOIN을 사용한다면 부서가 없는 사원은 출력에서 제외될 것입니다. 이때 OUTER JOIN이 사용됩니다.

SELECT employee_id, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
USING(department_id);