오라클에서 조인을 할 때 오라클 조인(Oracle Join)과 안시 조인(ANSI JOIN)을 사용할 수 있다. 오라클 9i 까지는 오라클 조인만 사용할 수 있으며, 오라클 10g부터는 안시 조인을 추가로 사용할 수 있다. 최근 구축되는 시스템은 대부분 안시 조인을 사용하지만, 과거에 구축되어 있는 시스템은 오라클 조인을 많이 사용하고 있기 때문에 오라클 조인 방식도 꼭 알고 있어야 한다.
조인은 크게 위의 5가지 정도로 분류할 수 있다. 조인 (INNER JOIN)과 아우터 조인 (LEFT OUTER JOIN)은 아주 많이 사용하니, ANSI JOIN과 Oracle Join을 비교하여 두 가지 방식 모두 익혀 두어야 한다.
조인 (INNER JOIN)
안시 조인 (ANSI JOIN)
SELECT a.empno
, a.ename
, a.deptno
, b.dname
FROM emp a
INNER JOIN dept b
ON a.deptno = b.deptno
WHERE a.job = 'MANAGER'
위의 예제는 EMP 테이블과 DEPT 테이블을 조인(내부 조인)하여 DEPT 테이블의 DNAME(부서명)을 조회한 쿼리이다.
조인(INNER JOIN)은 메인 테이블과 조인 테이블에 조인 칼럼(deptno)의 값이 동시에 존재해야 조회가 된다.
위의 조인 구조를 보면 EMP 테이블의 "GENT"는 DEPT 테이블과 조인이 안되었기 때문에 데이터 조회에서 제외된다.
▼ 위의 ANSI JOIN을 Oracle Join으로 변경하면 아래와 같다.
오라클 조인 (Oracle Join)
SELECT a.empno
, a.ename
, a.deptno
, b.dname
FROM emp a
, dept b
WHERE a.job = 'MANAGER'
AND a.deptno = b.deptno
오라클 조인은 조인 칼럼(deptno) 조건을 WHERE 절에 작성하면 된다.
아우터 조인 (LEFT OUTER JOIN)
안시 조인 (ANSI JOIN)
SELECT a.empno
, a.ename
, a.deptno
, b.dname
FROM emp a
LEFT OUTER JOIN dept b
ON a.deptno = b.deptno
WHERE a.job = 'MANAGER'
위의 예제는 EMP 테이블과 DEPT 테이블을 아우터 조인(외부 조인)하여 DEPT 테이블의 DNAME(부서명)을 조회한 쿼리이다. 아우터 조인(OUTER JOIN)은 조인 테이블의 값이 존재하지 않아도 메인 테이블의 데이터가 조회된다. 조인 테이블의 값을 가져오지 못하면 NULL로 표시된다.
(메인 테이블) LEFT OUTER OIN (조인 테이블) 왼쪽 테이블이 메인 테이블이 된다.
아우터 조인은 메인 테이블의 데이터가 모두 조회되고, 조인 테이블의 값을 참조하여 조인이 되었을 경우 해당 값(dname)을 표시하고 조인이 되지 않았을 경우 NULL로 표시한다. 조인(INNER JOIN)인 처럼 조인이 되지 않았다고 조회에서 제외하지 않는다.
▼ 위의 ANSI JOIN을 Oracle Join으로 변경하면 아래와 같다.
오라클 조인 (Oracle Join)
SELECT a.empno
, a.ename
, a.deptno
, b.dname
FROM emp a
, dept b
WHERE a.job = 'MANAGER'
AND a.deptno = b.deptno(+)
조인 조건을 ON절에서 WHERE 절로 위치가 변경되었고 조인 칼럼에 (+)이 붙어있다.
조인 칼럼에 (+)를 붙이면 해당 칼럼의 테이블이 조인 테이블이 된다.
아우터 조인의 핵심은 메인 테이블의 데이터는 무조건 조회가 되고 조인 테이블은 참조 용도로만 사용된다.
아우터 조인 (RIGHT OUTER JOIN)
안시 조인 (ANSI JOIN)
SELECT a.empno
, a.ename
, a.deptno AS emp_deptno
, b.deptno
, b.dname
FROM emp a
RIGHT OUTER JOIN dept b
ON a.deptno = b.deptno
WHERE (a.job = 'MANAGER'
OR a.job IS NULL)
RIGHT OUTER JOIN은 LEFT OUTER JOIN과 동일한 아우터 조인이며, 다른 점은 오른쪽(RIGHT) 테이블이 메인 테이블이 된다. (조인 테이블) RIGHT OUTER OIN (메인 테이블)
DEPT 테이블이 메인 테이블이기 때문에 DEPT 테이블의 모든 데이터가 조회되고 EMP 테이블은 참조 용도로만 사용된다. 메인 테이블의 위치만 바뀌었을 뿐 LEFT OUTER JOIN과 조인 방법은 동일하다. 특별한 경우가 아니면 RIGHT OUTER JOIN은 사용하지 않는 것이 차후 쿼리문을 분석할 때 가독성을 좋게 할 수 있다.
DEPT 테이블이 메인 테이블이 되어서 EMP 테이블과 아우터 조인이 된다.
▼ 위의 ANSI JOIN을 Oracle Join으로 변경하면 아래와 같다.
오라클 조인 (Oracle Join)
SELECT a.empno
, a.ename
, a.deptno
, b.deptno
, b.dname
FROM emp a
, dept b
WHERE a.deptno(+) = b.deptno
AND (a.job = 'MANAGER'
OR a.job IS NULL)
오라클 조인에서는 RIGHT OUTER JOIN이라는 용어는 사용 안 하지만, 조인 칼럼의 (+) 위치를 변경 함으로써 RIGHT OUTER JOIN과 비슷하게 만들 수 있다.
RIGHT OUTER JOIN은 개념을 이해하고 있으면 된다. 아우터 조인은 LEFT OUTER JOIN을 확실히 익혀 두도록 하자.
크로스 조인 (CROSS JOIN)
안시 조인 (ANSI JOIN)
SELECT a.empno
, a.ename
, b.deptno
, b.dname
FROM emp a
CROSS JOIN dept b
WHERE a.job = 'MANAGER'
크로스 조인은 두 테이블의 모든 데이터를 서로 한 번씩 조인을 한다고 생각하면 된다.
CROSS JOIN 절에 테이블 작성하고 메인 테이블과 조인 칼럼을 연결하지 않는다.
두 테이블의 데이터가 서로 한 번씩 조인이 되기 때문에, 사원 테이블 (4행) * 부서 테이블(3행) = 총 12행이 조회된다.
크로스 조인은 아주 가끔씩 사용하기 때문에 개념을 이해하고 있으면 차후 도움이 될 수도 있다.
▼ 위의 ANSI JOIN을 Oracle Join으로 변경하면 아래와 같다.
오라클 조인 (Oracle Join)
SELECT a.empno
, a.ename
, b.deptno
, b.dname
FROM emp a
, dept b
WHERE a.job = 'MANAGER'
AND b.deptno IN (10, 20, 30)
|
오라클 조인에서 크로스 조인을 하기 위해서는 FROM 절에 테이블을 작성하고 WHERE 절에서 조인 칼럼을 작성하지 않으면 두 개의 테이블이 서로 크로스 조인된다.
풀 아우터 조인 (FULL OUTER JOIN)
안시 조인 (ANSI JOIN)
SELECT a.empno
, a.ename
, a.deptno
, b.dname
FROM emp a
FULL OUTER JOIN dept b
ON a.deptno = b.deptno
두 개의 테이블을 조인하여 조인된 데이터는 조인된 상태로 조회되고, 조인 안된 데이터는 조인이 안된 상태로 조회된다. 조인되어도 조회되고 조인이 안되어도 모두 조회된다고 생각하면 된다.
풀 아우터 조인은 ANSI JOIN에서만 사용 가능하고 Oracle Join에서는 사용할 수 없다. 자주 사용하는 조인 방법은 아니기 때문에 개념만 이해하고 있으면 좋을 듯하다.
오라클 쿼리에 익숙하지 않으면 가장 어려운 부분이 조인(Join)이다. 아래의 예제 파일을 다운로드하여 여러 번 반복해서 쿼리문을 작성해 보는 것이 가장 빨리 이해하는 방법일 것이다.