[DB/SQLD] 조인(Join)

1 분 소요

EQUI(등가) 조인(교집합)

조인의 가장 기본은 교집합을 만드는 것이다. 두개의 테이블 간에 일치하는 것을 조인한다.

1. EQUI(등가) 조인

SELECT * FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

equi 조인의 예시이다. “=”를 사용해 두개의 테이블을 연결했다.

2. INNER JOIN

EQUI 조인과 마찬가지로 ISO표준 SQL로 INNER JOIN이 있다. INNER JOIN은 ON문을 사용해 테이블을 연결한다.

SELECT * FROM EMP INNER JOIN DEPT
ON EMP.EMPTNO = DEPT.DEPTNO;

해시조인(Hash Join)

해시조인은 EQUI조인만 사용 가능한 방법이다. 해시조인은 먼저 선행 테이블을 결정하고 선행 테이블에서 주어진 조건에 해당하는 행을 선택한다. 해당 행이 선택되면 조인키를 기준으로 해시 함수를 사용해 해시테이블을 메인메모리에 생성하고 후행테이블에서 주어진 조건에 만족하는 행을 찾는다. 후행 테이블의 조인 키를 사용해 해시 함수를 적용하여 해당 버킷을 검색한다.

3. INTERSECT연산

intersect 연산은 두개의 테이블에서 교집합을 조회한다. 즉 두 개 테이블에서 공통된 값을 조회한다.

SELECT DEPTNO FROM EMP
INTERSECT
SELECT DEPTNO FROM DEPT;



Non-EQUI(비등가) 조인

두개의 테이블 간에 조인하는 경우 “=”을 사용하지 않고 “>”, “<”, “>=”, “<=” 등을 사용한다. 즉 정확하게 일치하지 않는 것을 조인하는 것이다.



OUTER JOIN

두 개의 테이블 간에 교집합을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회한다.

SELECT * FROM DEPT LEFT OUTER JOIN EMP
ON EMP.DEPTNO = DEPT.DEPTNO;

왼쪽 테이블에만 있는 행도 포함하려면 LEFT OUTER JOIN을, 오른쪽 테이블의 행만 포함하려면 RIGHT OUTER JOIN을 하면 된다.

FULL OUTER JOIN은 left outer join과 right outer join 모두를 하는 것이다.

SELECT * FROM DEPT, EMP
WHERE EMP.DEPTNO (+)= DEPT.DEPTNO;

oracle 데이터베이스에서는 outer join을 할 때는 “(+)” 기호를 사용해서 할 수 있다.



CROSS JOIN

cross join은 조인 조건구 없이 2개의 테이블을 하나로 조인한다. 조인구가 없기 때문에 카테시안 곱이 발생한다. 행 14개와 행4개가 있는 테이블을 조인하면 14*4=56개의 행이 조회된다.

SELECT * FROM EMP CROSS JOIN DEPT;



UNION

union을 사용해 합집합 구현이 가능하다. union 연산은 두개의 테이블을 하나로 만드는 연산이다. 주의사항은 두개의 테이블의 칼럼수, 칼럼의 데이터 형식 모두가 일치해야 한다. 만약 주의사항을 어기면 오류가 발생한다.

SELECT DEPTNO FROM EMP
UNION
SELECT DEPTNO FROM ENP;

union연산은 두개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다. 그래서 정렬과정이 발생한다.

union all은 두개의 테이블을 하나로 합치는 과정에서 중복을 제거하지 않아 정렬을 유발하지 않는다.



MINUS

minus 연산은 두개의 테이블에서 차집합을 조회한다. 즉 먼저 쓴 select문에는 있고 뒤에 쓰는 select문에는 없는 집합을 조회하는 것이다.

MS-SQL에서는 MINUS와 동일한 연산 EXCEPT가 있다.

SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM ENP;