1. JOIN이란?
SQL에서 두 개 이상의 테이블을 연결 또는 결합하여 데이터를 출력하는 연산이다.
연산자에 따라 EQUI JOIN, Non EQUI JOIN으로 분류할 수 있고, 사용 형태에 따라 FROM을 활용한 JOIN, Self JOIN 등이 있다.
1) EQUI JOIN - 등가 교집합
- 두 개의 테이블 간에 서로 정확하게 일치하는 경우를 활용하는 JOIN ⇒ '등가 연산자(=)'를 사용한 JOIN
- 대부분 기본키-외래키 관계를 기반으로 발생하나, 모든 조인이 그런 것은 아니다.
2) Non EQUI JOIN - 비등가 교집합
- 두 개의 테이블 간에 서로 정확하게 일치하지 않는 경우를 활용하는 JOIN ⇒ '등가 연산자 이외의 연산자(>, >=, <=, <, BETWEEN 등)'를 사용한 JOIN
2. FROM을 활용한 JOIN
INNER JOIN
JOIN 조건에서 동일한 값이 있는 행만 반환한다. INNER JOIN은 JOIN의 기본값이기 때문에 'INNER'는 생략이 가능하다.
→ 조인은 중복 사용이 가능하다.
SELECT * FROM A
[INNER] JOIN B -- INNER 생략 가능
ON A.COL_A = B.COL_B;
-- 중복 사용
SELECT * FROM A
[INNER] JOIN B ON A.COL_A = B.COL_B
JOIN C ON A.COL_AA = C.COL_CC;
USING 조건절
같은 이름을 가진 컬럼 중 원하는 컬럼에 대해서만 선택적으로 등가 조인이 가능하다.
→ 컬럼이나 테이블에 별칭을 붙일 수는 없고, 중복 사용이 가능하다.
SELECT * FROM A JOIN B
USING (COL); -- A와 B에 공통으로 있는 컬럼 COL을 명시
-- 컬럼명 겉에 괄호도 작성해주어야 한다.
NATURAL JOIN
두 테이블 간에 동일한 이름을 갖는 모든 컬럼에 대해 등가 조인을 수행한다.
→ 추가로 ON 조건절, USING 조건절, WHERE절 등에서 JOIN 조건 정의, 별칭 지정 등이 불가능하다.
SELECT *
FROM A
NATURAL JOIN B;
CROSS JOIN
JOIN 조건이 없을 경우 생길 수 있는 모든 데이터의 조합을 조회한다.
→ CROSS는 생략할 수 있는데, 크게 보면 별도의 조건이 없는 INNER JOIN과 같다.
SELECT * FROM A
[CROSS] JOIN B; -- CROSS 생략 가능
OUTER JOIN
두 개의 테이블 간에 교집합을 조회하고, 한쪽 테이블에만 있는 데이터도 포함시켜서 조회한다.
→ 빈 곳은 NULL로 출력하며, WHERE 조건절에서 한쪽에만 있는 데이터를 포함시킬 테이블 쪽으로 (+)를 명시한다.
-- 왼쪽 포함(= LEFT JOIN)
SELECT * FROM A, B
WHERE A.COL_A (+)= B.COL_B; -- 교집합 외에 A에만 있는 데이터도 포함
SELECT * FROM A
LEFT [OUTER] JOIN B -- OUTER 생략 가능
ON A.COL_A = B.COL_B;
-- 오른쪽 포함(= RIGHT JOIN)
SELECT * FROM A, B
WHERE A.COL_A =(+) B.COL_B; -- 교집합 외에 A에만 있는 데이터도 포함
SELECT * FROM A
RIGHT [OUTER] JOIN B -- OUTER 생략 가능
ON A.COL_A = B.COL_B;
-- 좌우 모두 포함(= 합집합 UNION = FULL OUTER JOIN)
-- MySQL, MariaDB 환경에서는 FULL OUTER JOIN이 불가.
SELECT * FROM A
[FULL] OUTER JOIN B -- FULL 생략 가능
ON A.COL_A = B.COL_B;
3. Self JOIN
동일 테이블 사이의 조인을 의미한다. 단, 동일 테이블 사이의 조인을 수행하면 테이블과 컬럼 이름이 모두 동일하기 때문에 식별을 위한 별칭이 필수이다.
SELECT A.COL1, B.COL2
FROM TABLE_A A, TABLE_B B -- AS를 생략한 것
WHERE A.COL_A = B.COL_B;
'지극히 개인적인 공부 노트 > 데이터베이스(Database)' 카테고리의 다른 글
[SQL] 대표적인 DDL 명령어(feat. CREATE, SHOW, USE, ALTER, DROP) (0) | 2021.09.28 |
---|---|
[SQL] 뷰(VIEW) 간단 정리 (0) | 2021.09.28 |
[SQL] 일반 집합 연산(feat. UNION, INTERSECT, EXCEPT) (0) | 2021.09.25 |
[SQL] 서브 쿼리와 서브 쿼리의 분류(feat. 반환, 위치에 따른 분류) (0) | 2021.09.24 |
[SQL] 기초적인 SQL 내장 함수(feat. COUNT, SUM, AVG, MAX, MIN, GROUP BY) (0) | 2021.09.14 |