이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다. Java(TM) 플랫폼 : 1.8.0_321 Oracle IDE : 4.1.5.21.78 |
SQL-99 표준 JOIN
설명
앞서 오라클의 JOIN에 대해서 다루었다. 하지만 JOIN은 오라클에서만 사용할 수 있는 것이 아니며 DBMS마다 허용되는 JOIN의 문법이 다를 수 있다. 이럴 경우 어떠한 문제점이 생길까?
만약 운영 중인 시스템이나 진행 중인 프로젝트에서 부득이하게 DBMS를 교체하게 될 경우, 수많은 JOIN문을 수정해야 하는 최악의 사태가 발생한다.
이를 대비하여 사용할 수 있는 것이 SQL-99 표준 JOIN이다. SQL-99 표준 JOIN은 다른 DBMS에서도 사용 가능한 JOIN의 표준 문법으로 주로 FROM절에 특정 키워드를 사용하여 테이블을 조인하여 조인 조건식과 출력 행을 선정하는 조건식을 구별할 수 있다는 특징이 있다.
종류와 사용 형태
1. NATURAL JOIN
내부 조인(INNER JOIN)을 대신해 사용할 수 있는 조인 방식. 조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인을 해 주는 방식. 기존 내부 조인과 다르게 조인 기준 열을 SELECT절에 명시할 때 테이블이름을 붙이면 안 되는 특성이 있음
1-1. 사용 예시
-- query1 (NATURAL JOIN)
SELECT E.EMPNO
, E.ENAME
, E.JOB
, E.MGR
, E.HIREDATE
, E.SAL
, E.COMM
, DEPTNO
, D.DNAME
, D.LOC
FROM EMP E NATURAL JOIN DEPT D
ORDER BY DEPTNO, E.EMPNO;
1-2. 결과

2. JOIN ~ USING
내부 조인(INNER JOIN)을 대신해 사용할 수 있는 조인 방식. NATURAL JOIN과 다르게 USING 키워드에 조인 기준으로 사용할 열을 명시하여 사용
2-1. 사용 형태
FROM TABLE1 JOIN TABLE2 USING [조인에 사용할 기준열]
2-2. 사용 예시
-- query2 (JOIN ~ USING)
SELECT E.EMPNO
, E.ENAME
, E.JOB
, E.MGR
, E.HIREDATE
, E.SAL
, E.COMM
, DEPTNO
, D.DNAME
, D.LOC
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
2-3. 결과

3. JOIN ~ ON
가장 범용성 있는 조인 방식. 기존 WHERE 절에 있는 조인 조건식을 ON 키워드 옆에 작성함. 조인 기준 조건식은 ON에 명시하고 그 밖의 출력 행을 걸러 내기 위해 WHERE 조건식을 따로 사용하는 조인 방식.
3-1. 사용 형태
FROM TABLE1 JOIN TABLE2 ON [조인 조건식]
3-2. 사용 예시
-- query3 (JOIN ~ ON)
SELECT E.EMPNO
, E.ENAME
, E.JOB
, E.HIREDATE
, E.SAL
, E.COMM
, E.DEPTNO
, D.DNAME
, D.LOC
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE SAL <= 3000
ORDER BY E.DEPTNO, EMPNO;
3-3. 결과

4. OUTER JOIN
기존 문법과 다르게 WHERE절이 아닌 FROM절에서 외부 조인을 선언
4-1. 사용 형태
<LEFT OUTER JOIN>
기존 : WHERE TABLE1.COL1 = TABLE2.COL1(+)
SQL-99 : FROM TABLE1 LEFT OUTER JOIN TABLE2 ON [조인 조건식]
<RIGHT OUTER JOIN>
기존 : WHERE TABLE1.COL1(+) = TABLE2.COL1
SQL-99 : FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON [조인 조건식]
<FULL OUTER JOIN>
기존 : UNION 집합 연산자를 활용
SQL-99 : FROM TABLE1 FULL OUTER JOIN TABLE2 ON [조인 조건식]
<세 개 이상의 테이블을 JOIN 시>
기존 :
SELECT ...
FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
AND TABLE2.COL = TABLE3.COL;
SQL-99 :
SELECT ...
FROM TABLE1
JOIN TABLE2 ON [조건식]
JOIN TABLE3 ON [조건식];
4-2. 사용 예시
-- query4 (LEFT OUTER JOIN)
SELECT E1.EMPNO
, E1.ENAME
, E1.MGR
, E2.EMPNO AS MGR_EMPNO
, E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
-- query5 (RIGHT OUTER JOIN)
SELECT E1.EMPNO
, E1.ENAME
, E1.MGR
, E2.EMPNO AS MGR_EMPNO
, E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO, MGR_EMPNO;
-- query6 (FULL OUTER JOIN)
SELECT E1.EMPNO
, E1.ENAME
, E1.MGR
, E2.EMPNO AS MGR_EMPNO
, E2.ENAME AS MGR_ENAME
FROM EMP E1 FULL OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
4-3. 결과
-- query4 (LEFT OUTER JOIN)

-- query5 (RIGHT OUTER JOIN)

-- query6 (FULL OUTER JOIN)

'개발 지식 > [DBMS] Oracle' 카테고리의 다른 글
[Oracle] 서브쿼리(2) - 단일행 서브쿼리 (0) | 2022.06.03 |
---|---|
[Oracle] 서브쿼리(1) - 서브쿼리의 개념과 특징 (0) | 2022.06.02 |
[Oracle] JOIN(4) - 외부 조인(OUTER JOIN) (0) | 2022.05.31 |
[Oracle] JOIN(3) - 비등가 조인(NON-EQUI JOIN), 자체 조인(SELF JOIN) (0) | 2022.05.30 |
[Oracle] JOIN(2) - 내부 조인(INNER JOIN) (0) | 2022.05.29 |