[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 JOINNATURAL JOINUSING 조건절ON 조건절CROSS JOINOUTER 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를 중복 갯수만큼 늘린 결과를 반환한다.