Skip to content

[SQL] 07. JOIN

SQL 활용: JOIN의 개념, 표준 조인, JOIN의 종류


1. JOIN의 개념

두 개 이상의 테이블들을 결합하여 데이터를 출력하는 것을 조인(JOIN)이라고 한다. 여러 테이블이 동시에 조인 되더라도 순차적으로 처리 된다.

1-1. 등가 조인

두 개의 테이블 간에 특정 칼럼 값들이 서로 정확하게 일치하는 경우에 등가 조인(EQUI JOIN)이 가능하다. WHERE절에 = 연산자를 사용해서 표현한다.

SELECT table_1.col_name, table_2.col_name, ...
FROM table_1, table_2
WHERE table_1.col_name = table_2.col_name;

1-2. 비등가 조인

두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에는 비등가 조인(Non-EQUI JOIN)을 해야 하며, = 연산자가 아닌 다른(BETWEEN, >, >=, <, <= 등) 연산자들을 사용하여 JOIN을 수행한다.

SELECT table_1.col_name_1, table_1.col_name_2, table_2.col_name_1, table_2.col_name_2 ...
FROM table_1, table_2
WHERE table_1.col_name_2 BETWEEN table_2.col_name_1 AND table_2.col_name_2;

2. 표준 조인

2-1. Standard SQL과 실제 연산자

일반 집합 연산자 실제 연산자 순수 관계 연산자 실제 연산자
UNION 연산 UNION SELECT 연산 WHERE
INTERSECTION 연산 INTERSECT PROJECT 연산 SELECT
DIFFERENCE 연산 MINUS/EXCEPT (NATURAL) JOIN 연산 다양한 JOIN
PRODUCT 연산 CROSS JOIN DIVIDE 연산 미사용

2-2. 집합 연산자

집합 연산자(Set Operator) 여러 개의 SQL문을 결합하여 결과를 하나로 추출한다. 집합 연산자를 사용하기 위한 제약 조건은 다음과 같다.

  • SELECT절의 칼럼 수가 동일
  • SELECT절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 함
    • 반드시 동일한 데이터 타입일 필요는 없음

집합 연산자의 종류는 아래와 같다. / 표시가 있으면 앞이 Oracle, 뒤가 MSSQL이다.

  • UNION
    • 합집합. 중복 행은 1개의 행으로 합침
  • UNION ALL
    • 합집합. 중복 행이라도 하나로 합치지 않고 그대로 출력
  • INTERSECT
    • 교집합. 중복 행은 하나로 합침
  • MINUS/EXCEPT
    • 차집합. 중복 행은 하나로 합침
  • CROSS JOIN
    • 곱집합(PRODUCT)
SELECT col_1, col_2, ...
FROM table_name
WHERE expression

UNION SELECT col_1, col_2, ...
FROM table_name
WHERE expression
ORDER BY ASC;

3. JOIN의 종류

ANSI/ISO SQL에서 표시하는 FROM절의 JOIN 형태는 다음과 같다.

  • INNER JOIN
  • NATURAL JOIN
  • USING 조건절
  • ON 조건절
  • CROSS JOIN
  • OUTER JOIN

3-1. INNER JOIN

INNER JOINJOIN조건에서 동일한 값이 있는 행만 반환한다. USING 조건절이나 ON 조건절을 필수적으로 사용해야 한다.

3-2. NATURAL JOIN

NATURAL JOIN은 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN을 수행한다. NATURAL JOIN이 명시되면 USING 조건절, ON 조건절, WHERE절에서 JOIN 조건을 정의할 수 없다. MSSQL에서는 지원하지 않는다.

3-3. USING 조건절

USING 조건절을 이용하면 두 테이블에서 같은 이름을 가진 칼럼들 중 특정 칼럼을 지정하여 해당 칼럼을 통해 EQUI JOIN을 수행한다. MSSQL에서는 지원하지 않는다.

Info

JOIN에 사용된 칼럼들은 같은 데이터 유형이어야 하며, ALIAS나 테이블명과 같은 접두사를 붙일 수 없다.

3-4. ON 조건절

ON 조건절을 사용하면 JOIN 서술부(ON 조건절)와 비 JOIN 서술부(WHERE절)를 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN을 사용할 수 있다.

Info

ON 조건절을 사용한 JOIN의 경우는 ALIAS나 테이블명과 같은 접두사를 사용하여 SELECT에 사용되는 칼럼을 논리적으로 명확하게 지정해주어야 한다.

3-5. CROSS JOIN

두 개의 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT와 같은 표현으로, 양쪽 집합의 M * N 건의 데이터 조합이 반환된다. 테이블 간 JOIN 조건이 없는 경우 발생한다.

3-6. OUTER JOIN

JOIN 조건에서 동일한 값이 없는 행도 반환하기 위해 사용한다.

Info

USING 조건절이나 ON 조건절을 필수적으로 사용해야 한다.

  • LEFT OUTER JOIN
    • 먼저 표기된 좌측 테이블의 데이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽음
    • 우측 테이블의 JOIN 칼럼에서 같은 값이 있으면 해당 데이터를 가져오고, 같은 값이 없는 경우에는 NULL로 채움
    • LEFT JOIN으로 표기 가능
  • RIGHT OUTER JOIN
    • 나중에 표기된 우측 테이블의 데이터를 먼저 읽은 후, 먼저 표기된 좌측 테이블에서 JOIN 대상 데이터를 읽음
    • 좌측 테이블의 JOIN 칼럼에서 같은 값이 있으면 해당 데이터를 가져오고, 같은 값이 없는 경우에는 NULL로 채움
    • RIGHT JOIN으로 표기 가능
  • FULL OUTER JOIN
    • 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 결과를 생성하고, 데이터가 없는 곳은 전부 NULL로 채움
    • FULL JOIN으로 표기 가능

Warning

OUTER JOIN에서 JOIN될 테이블의 key값에 중복값이 있을 경우 기준 테이블의 해당 Row를 중복 갯수만큼 늘린 결과를 반환한다.


Reference