Home 11. 조인
Post
Cancel

11. 조인

조인을 사용하면 하나의 쿼리로 다수의 테이블을 조회할 수 있다. 조인은 열 값으로 테이블 행을 연결한다.

1
2
3
4
SELECT a.deptno, a.dname, b.empno, b.ename
FROM dept a, emp b
WHERE b.deptno = a.deptno
ORDER BY 1, 3;

11.1 기본 원리

11.1.1 조인 조건

일반 조건이 열과 값을 평가하는 반면, 조인 조건은 열과 열을 평가한다. 조인은 조인 조건에 따라 카티션 곱, 등가 조인, 비등가 조인으로 구분할 수 있다.

카티션 곱

카티션 곱은 조인 조건이 없는 조인 이다. 카티션 곱이 발생하면 조인되는 테이블 행의 곱만큼 행이 반환된다.

카티션 곱은 조인 조건이 없으므로 평가 결과가 항상 TRUE 이다.

등가 조인

등가 조인은 조인 조건이 모두 등호(=)인 조인이다. 값이 동일한 경우에만 행이 반환된다. (inner join) 조인되는 테이블의 갯수가 n개라면, 테이블 간의 조인 조건은 최소 n-1개가 되어야 한다.

1
2
3
SELECT a.c1, b.c1
FROM t1 a, t2 b
WHERE b.c1 = a.c1;

비등가 조인

비등가 조인은 등호 외에 다른 조인 조건이 있는 조인이다.

1
2
3
SELECT a.c1, b.c1
FROM t1 a, t2 b
WHERE b.c1 >= a.c1;

11.1.2 조인 범위

조인 범위는 inner, outer로 구분할 수 있다.

inner join

이너 조인은 조인이 성공한 범위를 반환한다. NVL을 사용해서 널을 포함한 조인을 수행할 수 있고, IS NULL 조건을 사용할 수도 있다.

1
2
3
4
5
SELECT ...
FROM t1 a, t2 b
WHERE b.c1 = a.c1
AND b.c2 = a.c2
AND b.c3 = a.c3;

outer join

아우터 조인은 이너와 아우터를 함께 반환한다.

1
2
3
4
# 아우터 기준 반대쪽에 (+) 기호를 기술한다.
SELECT ...
FROM t1 a, t2 b
WHERE b.c1(+) = a.c1;

232~240p

11.1.3 조인 차수

조인 차수는 조인되는 테이블의 차수를 의미한다.

예) t1, t2가 1:M 관계라면 조인 차수는 1:M이다.

등가 조인시 관계 차수가 1:M이고 M쪽의 PK가 모두 등호로 입력되면 조인 차수는 1:1이 된다.

11.2 기술 순서

11.2.1 FROM 절

FROM 절의 테이블은 데이터의 논리적인 흐름에 따라 기술해야 한다. 데이터 모델과 업무 요건을 이해해야 테이블의 기술 순서를 결정할 수 있는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# t1 -> t2 -> t3 순서로 조인 수행
SELECT *
FROM t1 a, t2, b, t3 c
WHERE b.c1 = a.c1
AND c.c1 = b.c1;

# t1 -> t3 -> t2
SELECT *
FROM t1 a, t3, c, t2 b
WHERE d.c1 = a.c1
AND b.c1 = c.c1;

# t2 -> t3 -> t1
SELECT *
FROM t2 b, t3, c, t1 a
WHERE c.c1 = b.c1
AND a.c1 = c.c1

조인은 행이 가장 적게 늘어나는 순서로 수행해야 하며, FROM 절의 테이블도 동일한 순서로 기술하는 편이 바람직하다. 그리고 조인 조건에 일반 조건이 존재하는 경우 실제 행의 증감까지 고려할 필요가 있다.

FROM 절의 기술 순서는 조인의 기본 원리와도 관련이 있다.

1
2
3
4
5
6
7
8
9
# 1)
SELECT *
FROM t1 a, t2 b
WHERE b.c1(+) = a.c1;

# 2)
SELECT *
FROM t1 a, t2 b
WHERE b.c1 = a.c1(+)

1번은 t1을 기준으로 t2를 아우터 조인하고, 2번은 t2를 기준으로 t1을 아우터 조인한다. 1번이 데이터의 논리적 흐름에 부합한다. 아우터 조인의 경우 아우터 기준을 FROM 절에 먼저 기술하는 편이 바람직하다.

11.2.2 WHERE 절

WHERE 절도 데이터의 논리적 흐름에 따라 작성해야 한다.

  1. FROM 절에 첫 번째로 기술된 테이블의 일반 조건을 기술한다.
  2. FROM 절에 기술된 테이블의 순서에 따라 조인 조건과 일반 조건의 순서로 조건을 기술한다.
  3. 조인 조건은 가능한 PK와 FK 순서대로 기술하고, 먼저 조회된 테이블의 값이 입력되는 형태로 작성한다.
1
2
3
4
5
6
SELECT a.ename, b.dname
FROM emp a, dept b
WHERE a.job = 'CLERK'   -- 일반(a)
  AND a.sal >= 1000     -- 일반(a)
  AND b.deptno = a.deptno  -- 조인(b = a)
  AND b.loc = 'DALLAS'  -- 일반(b)
1
2
3
4
5
6
7
8
9
10
11
# WHERE 조건이 데이터의 논리적 흐름에 부합
SELECT *
FROM t1 a, t2 b, t3 c
WHERE b.c1 = a.c1
AND c.c2 = b.c1;

# 논리적 흐름에 부합하지 않음
SELECT *
FROM t1 a, t2 b, t3 c
WHERE b.c1 = a.c1
AND c.c2 = a.c1; -- 이부분

11.3 ANSI 조인 문법

11.3.1 NATURAL JOIN 절

이름이 같은 열로 테이블을 등가 조인한다. SELECT * FROM t1 NATURAL JOIN t2;

11.3.2 USING 절

지정한 열로 테이블을 등가 조인한다. SELECT * FROM t1 JOIN t2 USING(c1);

11.3.3 CROSS JOIN 절

카티션 곱을 생성한다. SELECT * FROM t1 a CROSS JOIN t2 b

11.3.4 INNER JOIN 절

이너 조인을 수행한다. ON 절에 조인 조건을 기술한다. SELECT * FROM t1 a INNER JOIN t2 b ON b.c1 = a.c1; INNER 키워드는 생략할 수 있다.

11.3.5 OUTER JOIN 절

아우터 조인을 수행한다. 아우터 기준에 따라 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN을 사용할 수 있다. ON절에 아우터 기준의 일반 조건을 기술하면 일반 조건과 무관하게 아우터를 반환하고, 일반 조건에 해당하는 행만 아우터 조인한다.

WHERE 절에 아우터 기준이 아닌 테이블의 일반 조건을 기술하면 아우터 조인이 이너 조인으로 변경된다.

ANSI 조인 문법과 오라클 조인문법 : 256p

11.4 파티션 아우터 조인

파티션 아우터 조인은 QUERY PARTITION 절을 사용한다.

1
2
3
4
SELECT *
FROM t1 a
LEFT OUTER JOIN t2 b PARTITION BY (b.c1)
ON b.c1 = a.c1;

11.5 활용 예제

259~282p

  • 조인 조건 : 조인 조건은 관계의 속성과 관련이 있다. 주로 비교 조건과 BETWEEN 조건을 사용하지만 다른 유형의 조건을 사용할 수도 있다.
  • 조인 범위 : 조인 범위는 관계의 옵셔널리티와 관련이 있다. 조인 기준이 아닌 테이블에 대해 필수 관계면 이너 조인, 선택 관계면 아우터 조인으로 조인해야 조인 기준이 모두 반환된다.
  • 조인 차수 : 조인 차수는 관계의 카디널리티와 관련이 있다. 테이블의 관계 차수가 1:1이면, 조인 차수도 1:1이다.
  • 기술 순서 : 조인조건, 조인 범위, 조인 차수 모두와 관련이 있다.
  • 카티션 곱 : 카티션 곱이 발생하면 행이 M * N개로 늘러나기 때문에 행 복제로 부르기도 한다.
  • 셀프 조인 : 셀프 조인은 동일한 테이블을 조인하는 것을 말한다. 예) 순환관계, 누적합 등
  • 범위 조인 : 범위 조인은 범위 속성을 가진 테이블의 조인이다.
  • 선택 조인 : 선택 조인은 서브타입이나 다중 관계를 가진 테이블을 조인할 때 사용할 수 있다.
  • 파티션 아우터 조인 : 누락된 기간 값을 채울 수 있다.
This post is licensed under CC BY 4.0 by the author.

10. GROUP BY 절과 HAVING 절

12. 서브 쿼리