[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 JOIN
은 JOIN
조건에서 동일한 값이 있는 행만 반환한다. 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를 중복 갯수만큼 늘린 결과를 반환한다.