SQL문은 ISO/ANSI에서 관계형 데이터베이스 표준 언어로 지정(SQL-82)된 후 SQL-92를 거쳐 SQL-99 표준 문법이 나왔습니다.
그리고 오라클은 9i 버전부터 SQL-99 방식의 문법을 지원하고 있습니다.
SQL-99 조인은 앞에서 배운 조인 방식과 같은 기능이지만 문법이 조금 다릅니다.
또한, 다른 DMBS 제품에서도 사용가능하고 앞에서 배운 조인 방식과 더불어 SQL-99 방식의 조인도 많이 사용하기 때문에 간단하게 사용법을 알아보려고 합니다.
NATURAL JOIN
은 등가 조인을 대신하여 사용할 수 있는 조인 방식입니다.
조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인을 해주는 방식입니다.
[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
[출력결과]
EMP테이블과 DEPT테이블의 공통 컬럼은 DEPTNO
입니다.
그렇다면 조인기준에 해당되는 컬럼은 DEPTNO입니다.
NATURAL JOIN을 사용할 때는 SELECT절에 조인기준이 되는 컬럼의 이름을 명시할 때 테이블 이름을 붙이면 안되는 특성이 있습니다.
또한 WHERE절이 아닌 FROM절에 조인 키워드를 사용
하기 때문에 주의해야 합니다.
JOIN ~ USING 또한 등가조인을 대신하여 사용하는 조인방식입니다
위에서 설명한 NATURAL JOIN과 기능상 차이가 없으므로 바로 예제를 보도록 하겠습니다.
[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
[출력결과]
JOIN ~ USING ()은 ( )
안에 조인 기준이 되는 컬럼을 명시하여 사용합니다.
위에서 배운 NATURAL JOIN과 마찬가지로 조인 기준이 되는 컬럼을 SELECT절에 명시할 때 테이블 이름이 붙으면 안되는 특징이 있으며 조인 키워드를 FROM
절에 사용합니다.
JOIN ~ ON
을 사용하여 조인을 하는 방식도 있지만, SQL-99이전 방식의 등가조인과 유사한 방식으로 사용됨으로 간단한 예시만 보겠습니다.
SELECT E.DEPTNO
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
위와 같은 형식으로 사용되며, SELECT절에 조인 기준이 되는 컬럼을 명시할 때 테이블이름이 붙어야 합니다.
SQL-99이전과는 다르게 직접적으로 OUTER JOIN
이라는 키워드를 사용합니다.
개인적인 생각으로 외부조인을 사용할 때는 SQL-99버전을 사용하는것 더 좋다고 생각하며 이렇게 생각하는데에는 2가지 이유가 있습니다.
기존에는 Full Outer Join을 사용하기 위해서는 두 개의 쿼리를 작성하고 UNION집합 연산자를 사용해야 했습니다.
하지만 SQL-99 버전에서는 FULL OUTER JOIN
키워드를 사용할 수 있습니다.
[`왼쪽 외부조인(LEFT OUTER JOIN) SQL-99 예시]`
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_NAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO
[실행결과]
외부조인 포스팅을 보신분들은 알겠지만, SQL-99이전 버전의 결과와 동일합니다.
하지만 조인조건을 FROM절에 기술하고, (+)
기호를 사용하지 않습니다.
오른쪽 외부조인, 전체 외부조인의 경우에는 키워드만 바꿔주면 되기때문에 예시를 살펴보지 않겠습니다.
SQL-99 방식의 조인형식
NATURAL JOIN
DEPT DJOIN
DEPT D USING (DEPTNO)
JOIN
DEPT D ON (E.DEPTNO = D.DEPTNO)
LEFT OUTER JOIN
EMP E2 ON (E1.MGR = E2.EMPNO)
RIGHT OUTER JOIN
EMP E2 ON (E1.MGR = E2.EMPNO)
FULL OUTER JOIN
EMP E2 ON (E1.MGR = E2.EMPNO)