지극히 개인적인 공부 노트/데이터베이스(Database)

[SQL] JOIN 활용하기

AS J 2021. 9. 26. 20:16

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;