개발 지식/[DBMS] Oracle

[Oracle] JOIN(5) - SQL-99 표준 JOIN

devGSP 2022. 6. 1. 08:00
반응형
이 게시물은 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. 결과

join5_q1

 

 

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. 결과

join5_q2

 

 

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. 결과

join5_q3

 

 

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)

 

join5_q4


-- query5 (RIGHT OUTER JOIN)

 

join5_q5


-- query6 (FULL OUTER JOIN)

 

join5_q6

 

반응형