신입 개발자가 되기 위해 공부했던 독학 자료들/Oracle

CH 8 . 여러 테이블을 하나의 테이블처럼 사용하는 조인

Seojoo21 2022. 3. 8. 18:47

출처: <비전공자도 기초부터 확실하게! 오라클로 배우는 데이터베이스 입문>, 이지훈, 이지스퍼블리싱

 

CH 8. 여러 테이블을 하나의 테이블처럼 사용하는 조인 

8-1. 조인

1) 집합 연산자와 조인의 차이점

- 조인(join)은 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용하는 방식이다.

- 집합 연산자를 사용한 결과는 두 개 이상의 SELECT문의 결과 값을 세로로 연결한 것이고, 조인을 사용한 결과는 두 개 이상의 테이블 데이터를 가로로 연결한 것이라고 볼 수 있다. 

 

2) 여러 테이블을 사용할 때의 FROM 절 

- 지금까지 사용한 SELECT문은 FROM절에 EMP 테이블 하나만을 명시했다.

- 하지만 FROM절에는 여러 개 테이블을 지정하는 것이 가능하다. 조금 더 정확하게는 꼭 테이블이 아니더라도 테이블 형태, 즉 열과 행으로 구성된 데이터 집합이면 모두 FROM절에 지정 가능하다. 

- 뷰(view), 서브쿼리(subquery) 등이 이에 해당하며 이 내용에 대해서는 나중에 다시 살펴보겠다.

 

- SELECT절의 여러 열을 구분할 때와 마찬가지로 FROM절에 여러 테이블을 명시할 때 쉼표(,)를 구분자로 사용하여 지정한다. 그리고 WHERE, GROUP BY, ORDER BY절 등 다른 절도 그대로 사용할 수 있다.

SELECT 
FROM 테이블1, 테이블2, ... , 테이블N

- SCOTT 계정 소유의 EMP 테이블에는 사원 정보가 저장되어 있고 DEPT 테이블에는 부서 정보가 저장되어 있다. 만약 사원 정보와 더불어 근무 부서 이름 또는 부서 위치 정보 등을 한 번에 조회하려면 EMP 테이블과 DEPT 테이블을 조인해서 출력해야 한다. 

- 즉 FROM절에 EMP 테이블과 DEPT 테이블을 함께 명시해 주어야 한다. 

 

예) FROM절에 여러 테이블 선언하기 

- 이렇게 EMP 테이블과 DEPT 테이블을 FROM절에 함께 명시하여 출력하면 생각보다 많은 양의 데이터가 출력된다. 이는 FROM절에 명시한 각 테이블을 구성하는 행이 모든 경우의 수로 조합되어 출력되기 때문이다. 위의 예제의 경우 EMP 테이블과 DEPT 테이블을 FROM절에 지정한 결과, 즉 조인한 결과 값의 행 수는 14에 4를 곱한 56개가 된다. 

 

3) 조인 조건이 없을 때의 문제점

- 하지만 이 출력 결과에는 문제가 있다. 가장 먼저 출력된 EMP 테이블 SMITH를 보면 SMITH 사원의 DEPTNO은 20으로 SMITH 사원의 근무 부서는 DALLAS에 있는 RESEARCH 부서이다.

- 조인을 통한 출력은 결과로 나올 수 있는 모든 행을 조합하기 때문에 사원 데이터와 부서 데이터가 정확히 맞아떨어지지 않는 데이터도 함께 출력된다.

- 명시한 테이블의 데이터를 가로로 연결하기 위해 조인을 사용하지만, 어떤 데이터를 가로로 정확히 연결해야 하는지의 기준은 데이터베이스가 아닌 SQL문을 작성하는 프로그래머가 정해 주어야 한다. 

 

- 조인을 사용한 데이터 출력은 조인 대상 테이블이 많을수록 조합 데이터 중 정확한 데이터만을 뽑아내기 위해 많은 고민을 해야 한다. 이때 출력 행을 선정하는 조건식을 명시하는 WHERE절이 중요한 역할을 한다. 

- 위 예에서 알 수 있듯이 EMP 테이블의 사원 정보에는 부서 번호를 의미하는 DEPTNO 열이 존재한다. 그리고 DEPT 테이블 역시 DEPTNO 열을 기준으로 부서 정보를 저장하고 있다. 따라서 EMP 테이블과 DEPT 테이블의 데이터를 가로로 연결할 때 각 테이블의 DEPTNO가 같은 데이터만 조회할 수 있다면 정확한 결과를 얻을 수 있다. 

- 따라서 서로 다른 테이블인 EMP 테이블과 DEPT 테이블에 같은 이름의 DEPTNO 열을 구별하는 방법이 필요하다. 이때 사용하는 것이 바로 다음과 같이 열 앞에 테이블 이름을 명시하여 특정 열이 어느 테이블에 속한 열인지를 구별하는 방식이다.

테이블 이름.열이름

- 그럼 위에서 사용한 SQL문을 DEPTNO 열 기준으로 다시 정확하게 출력해보자. 아래와 같이 특정 열 값이 같은 데이터를 출력하는 방법이 앞으로 우리가 가장 많이 다루게 될 대표적인 조인 방식이다. 

4) 테이블의 별칭 설정

- FROM 절에 지정한 테이블에는 SELECT절의 열에 사용한 것처럼 별칭을 지정할 수 있다.

- 테이블에 별칭을 지정할 때는 명시한 테이블 이름에서 한 칸 띄운 후에 지정한다. 

FROM 테이블 이름1 별칭1, 테이블 이름2 별칭2...

- 지정한 별칭은 테이블의 열을 지칭하는 데 사용할 수 있다. 위의 SELECT문에 사용한 EMP 테이블과 DEPT 테이블의 별칭을 각각 E, D로 지정한 SELECT문은 다음과 같다. 별칭은 출력 결과에 영향을 주지 않는다.

 

8-2. 조인 종류

- 두 개 이상의 테이블을 하나의 테이블처럼 가로로 늘어뜨려 출력하기 위해 사용하는 조인은 대상 데이터를 어떻게 연결하느냐에 따라 등가조인, 비등가 조인, 자체 조인, 외부 조인 등으로 구분한다. 

 

1) 등가 조인

- 등가 조인(equi join)은 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식이다. 

- 말이 어렵지만 이 방식은 위의 EMP 테이블과 DEPT 테이블을 조인할 때 DEPTNO 열을 사용한 예제에서 다룬 방식이다.

- 등가 조인은 내부 조인 또는 단순 조인으로 부르기도 한다. 

- 등가 조인은 일반적으로 가장 많이 사용되는 조인 방식으로 이름을 특별히 명시하지 않으면 '조인을 사용한다'는 것은 대부분 등가 조인, 즉 특정 열 값이 일치한 출력 결과를 사용하는 방식이다. 

 

1-1) 여러 테이블의 열 이름이 같을 때 유의점 

- EMP 테이블과 DEPT 테이블은 DEPTNO 열 값이 같은 조건으로 조인이 가능했다.

- 등가 조인을 사용할 때 조인 조건이 되는 각 테이블의 열 이름이 같을 경우에 해당 열 이름을 테이블 구분 없이 명시하면 다음과 같이 오류가 발생하여 실행되지 못한다. 

 

예) 두 테이블에 부서 번호가 똑같은 열 이름으로 포함되어 있을 때 

- 오류 문구를 통해 알 수 있듯이 DEPTNO 열은 두 테이블에 모두 존재하는 열이므로 어느 테이블에 속해 있는 열인지 반드시 명시해야 한다. DEPTNO 열을 제외한 EMP 테이블 열과 DEPT 테이블 열은 이름이 겹치지 않으므로 어느 테이블의 열인지 명시하지 않아도 상관이 없다.

* 실무에서 SQL문을 사용할 때는 다소 번거롭더라도 테이블끼리 겹치지 않는 열 이름이라도 대부분 테이블이나 별칭을 명시한다. 조인 테이블의 개수가 열 개를 넘기도 하고 각 테이블별 열 개수가 몇 십개를 넘는 경우도 흔하기 때문이다. 

 

예) 열 이름에 각각의 테이블 이름도 명시할 때 

 

1-2) WHERE절에 조건식 추가하여 출력 범위 설정하기 

- 출력행을 더 제한하고 싶다면 WHERE절에 조건식으로 추가로 지정해 줄 수 있다.

- 예를 들어 사원 번호, 이름, 급여, 근무 부서를 함께 출력하되 급여가 3000 이상인 데이터만 보려면 EMP 테이블과 DEPT 테이블의 조인 조건 외에 급여 관련 조건을 추가로 지정하여 다음과 같이 사용할 수 있다.

 

예) WHERE절에 추가로 조건식 넣어 출력하기

 

1-3) 조인 테이블 개수와 조건식 개수의 관계 

- 조인에 대해 처음 설명할 때 조인 조건을 제대로 지정하지 않으면 데카르트 곱 때문에 정확히 연결되지 않아서 필요 없는 데이터까지 모두 조합되어 출력되는 예를 살펴보았다. 

- 기본적으로 데카르트 곱 현상이 일어나지 않게 하는 데 필요한 조건식의 최소 개수는 조인 테이블 개수에서 하나를 뺀 값이다. 

- 예를 들어 A와 B 테이블을 조인할 경우에 A와 B를 정확히 연결해 주는 열이 하나 필요하다. 이는 위에어 살펴본 EMP 테이블과 DEPT 테이블의 DEPTNO 열과 같은 역할을 한다.

- 만약 테이블이 A, B, C라면 A와 B를 연결해 줄 열 하나, A와 B가 연결된 상태에서 C를 연결해 줄 열 하나가 추가로 더 필요하다.

- WHERE절의 조건식을 사용해 테이블을 조인할 때 반드시 각 테이블을 정확히 연결하는 조건식이 최소한 전체 테이블 수보다 하나 적은 수만큼은 있어야 한다는 것을 잊지 말아야 한다.  

 

 

2) 비등가 조인

- 비등가 조인(non-equi join)은 등가 조인 방식 외의 방식을 의미한다.

- 앞에서 다룬 조인 예제는 모두 EMP 테이블과 DEPT 테이블을 사용했지만, 이번에는 급여 등급 데이터를 가지고 있는 SALGRADE 테이블과 EMP 테이블을 조인해보자. 

 

- SALGRADE 테이블은 각 급여 등급의 기준이 되는 최소 금액 및 최대 금액을 저장하고 있다. 

- 만약 각 사원 정보와 더불어 사원의 급여 등급 정보를 함께 출력하고자 한다면 EMP 테이블과 SALGRADE 테이블을 조인해야 한다. 

- 하지만 사용하는 열의 일치 여부를 기준으로 테이블을 조인하는 등가 조인 방식은 이 두 테이블의 연결에 적합하지 않다. 왜냐하면 급여 등급을 맞춰 주려면 사원의 급여 금액이 일치하는 것이 아니라 최소 급여(SALGRADE 내 LOSAL)과 최대 급여(SALGRADE 내 HISAL) 사이에 있어야 하기 때문이다. 

- 이런 경우에 BETWEEN A AND B 연산자를 사용하면 EMP 테이블과 SALGRADE 테이블 조인을 손쉽게 처리할 수 있다. 

 

예) 급여 범위를 지정하는 조건식으로 조인하기 

- WHERE절에 조인 조건을 지정하지 않으면 데카르트 곱이 발생하여 각 사원별로 다섯 개 급여 등급이 모두 연결되어 출력된다. 따라서 EMP 테이블의 14개 행과 SALGRADE 테이블의 5개 행이 연결되어 총 70개의 결과가 나온다.

 

3) 자체 조인

- EMP 테이블에는 직속 상관의 사원 번호가 저장된 MGR 열이 있다. EMP 테이블의 사원 정보와 해당 사원의 직속 상관의 사원 번호를 나란히 함께 출력해야 하는 경우를 생각해보자. 

- MGR 열이 특정 사원의 직속 상관의 사원 번호를 가리키는 데이터이므로 이 열의 데이터와 사원 번호를 잘 이용하면 사원 정보와 직속 상관의 정보를 연결할 수 있을 것이다. 즉, 아래 그림처럼 현재 행에 MGR 열 값을 EMPNO 열 값으로 사용하고 있는 데이터를 연결해주면 된다. 

- 하지만 지금까지 사용한 SELECT문 방식으로는 위의 그림과 같이 현재 행을 벗어나 다른 행의 데이터를 가져올 수 없다. 특정 행의 MGR열의 데이터와 일치한 데이터가 EMPNO 열에 저장된 데이터를 가져와야 사원과 직속 상관을 나란히 출력할 수 있다.

 

- 이를 해결할 가장 손쉬운 방법은 EMP 테이블과 완전히 똑같은 테이블을 하나 더 만들어 조인해 주는 것이다. 

- 만약 EMP 테이블과 완전히 같은 COPY_EMP 테이블이 존재한다면 아래와 같이 SELECT문을 작성할 수 있다. WHERE절에 명시된 조인 조건을 눈여겨보자.

SELECT * 
FROM EMP E, COPY_EMP C
WHERE E.MGR = C.EMPNO;

- COPY_EMP 테이블이 EMP 테이블과 완전히 같은 구성과 데이터를 가지고 있다면 14개 데이터를 가진 두 테이블이 조합되므로 행의 총 개수는 196개로 예상할 수 있다. 하지만 WHERE절 조건으로 EMP 테이블에 MGR 열과 일치한 데이터를 가진 COPY_EMP 테이블의 EMPNO 열을 연결한다면 같은 테이블이 두 개 있어야 한다는 점에서 문제가 있다. 

- 간단하게 생각한다면 데이터 저장 용량이 두 배가 되는 문제가 있고, 그보다 좀 더 심각한 문제는 EMP 테이블에 데이터를 추가하거나 삭제하거나 변경할 때 COPY_EMP 테이블도 같은 데이터를 유지해야 하므로 추가 작업이 필요하다는 것이다. 

- 저장 용량의 문제는 추가 저장 장치를 구매하면 되므로 비교적 가벼운 문제에 해당하나 두 번째 문제와 같이 특정 데이터 작업이 한 번씩 더 발생한다는 것은 제공하려는 서비스 품질에 꽤 치명적일 수 있다.

- 이를 규모의 문제로 볼 때 대부분의 응용 프로그램에서 활용하는 데이터베이스는 어마어마한 수준의 작업이 실시간으로 이루어지므로 반복 작업 횟수 증가는 응용 프로그램 동작 효율에 악영향을 미친다. 따라서 이런 상황은 반드시 피해야 한다.

 

- 자체 조인(self join)은 하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식으로 앞에서 물리적으로 동일한 테이블 여러 개를 사용할 때 발생할 수 있는 문제점을 해결한다.

- 개념 이해를 돕기 위해 다소 장황하게 설명했지만 실제 사용 방법은 아주 간단하다.

- 자체 조인은 FROM절에 같은 테이블을 여러 번 명시하되 테이블의 별칭만 다르게 지정하는 방식으로 사용한다. 

 

예) 같은 테이블을 두 번 사용하여 자체 조인하기 

SELECT E1.EMPNO, E1.ENAME, E1.MGR, 
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;

- 위의 SELECT문은 EMP 테이블을 자체조인을 사용하여 사원 정보와 직속 상관 정보를 나란히 출력한다. 하나의 테이블이지만 SELECT문 내부에서 별칭을 각각 달리주어 논리적으로 다른 테이블인 것처럼 명시하여 두 테이블을 조인하는 방식이다. 

- 결과에 MGR열이 NULL인 KING은 제외되었다는 것을 기억하자. 자체 조인 역시 두 개 테이블에서 지정한 열 중 일치한 데이터를 기준으로 조인되었으므로 큰 범위에서는 등가 조인으로 볼 수 있다. 

 

4) 외부 조인(아우터 조인)

- 앞에서 확인한 자체 조인의 실습 결과 행 수는 13개였다. EMP 테이블은 14개 행이 존재하는데 실습 결과가 13개 나온 이유는 EMP 테이블의 KING 데이터 때문이다.

- EMP 테이블의 KING은 사원 테이블에서 최고 직급인 PRESIDENT이므로 상급자가 존재하지 않는다. 즉 KING의 MGR 열의 값은 NULL이다. 따라서 조인 조건에 사용한 EMP 테이블의 MGR 열과 일치한 EMPNO을 가진 행이 존재하지 않으므로 최종 출력에서 제외된 것이다.  

 

- 하지만 이렇게 조인 조건 데이터 중 어느 한쪽이 NULL임에도 결과를 출력할 때 포함시켜야 하는 경우가 종종 있다. 

- 앞에서 이야기한 KING을 살펴본다면 KING의 직속상관 정보는 모두 공백으로 표시하더라도 KING 데이터를 노출해야 한다는 뜻이다.

- 이렇듯 두 테이블 간 조인 수행에서 조인 기준 열의 어느 한쪽이 NULL이어도 강제로 출력하는 방식을 외부 조인(outer join, 아우터 조인이라고 많이 부름) 이라고 한다. 

- 외부 조인은 조인 기준 열의 NULL을 처리하는 것을 목적으로 자주 사용하는 조인 방식이다. 하지만 (+) 기호를 붙이는 외부 조인 방식으로는 양쪽 모든 열이 외부 조인되는 '전체 외부 조인' 사용은 불가능하다. 

* 기본적으로 양쪽 모두를 외부 조인 하는 문법은 (+) 기호를 사용한 방식으로는 구현이 불가능하지만, 왼쪽 외부 조인을 사용한 SELECT문과 오른쪽 외부 조인을 사용한 SELECT문을 집합 연산자 UNION으로 합쳐서 같은 효과를 낼 수는 있다. 

 

**내부 조인, 외부 조인 이름에 대해서...

내부 조인(inner join) 외부 조인(outer join)
- 등가 조인, 자체 조인
(조인 조건에 해당하는 데이터가 존재할 경우에만 출력하기 때문에 외부 조인과 반대 개념으로 내부 조인이라고 함) 
 

- 외부 조인은 좌우를 따로 나누어 지정하는데 WHERE절에 조인 기준 열 중 한쪽에 (+) 기호를 붙여준다.

왼쪽 외부 조인(Left Outer Join) WHERE TABLE1.COL1 = TABLE2.COL1(+)
오른쪽 외부 조인(Right Outer Join) WHERE TABLE1.COL1(+) = TABLE2.COL1

- 두 외부 조인의 차이를 비교하기 위해 다음 두 SELECT문을 실행하고 그 결과 값을 비교해보자.

 

예) 왼쪽 외부 조인 사용하기

- 왼쪽 오부 조인을 사용한 결과가 본래 의도한 대로 출력되었다.

- 왼쪽 외부 조인은 간단히 말해서 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력하라는 뜻이다. 

- 따라서 이번에 사용한 SELECT문의 WHERE절 조건식에서 KING은 E1.MGR이 NULL로서 E2.EMPNO와 일치한 데이터가 없음에도 출력되었다. 

- 결국 이 예제는 상급자가 존재하지 않는 사원을 출력한 것이다. 

SELECT E1.EMPNO, E1.ENAME, E1.MGR, 
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+) -- 왼쪽 외부 조인 사용
ORDER BY E1.EMPNO;

예) 오른쪽 외부 조인 사용하기 

- 오른쪽 외부 조인의 경우 오른쪽 열을 기준으로 왼쪽 열 데이터의 존재와 상관없이 데이터를 출력하라는 뜻이다. 

- 아래 예제의 출력 결과를 자세히 보면 아래쪽 데이터는 왼쪽 테이블 데이터가 모두 NULL인 상태임을 알 수 있다. 즉 이 데이터들에 포함된 사원들은 부하 직원이 없는 (즉 오른쪽 사람을 직속 상관으로 둔 사람이 존재하지 않는) 가장 직책이 낮은 사원들이다. 

- 결국 이 예제는 하급자가 존재하지 않는 사원을 출력한 것이다. 

SELECT E1.EMPNO, E1.ENAME, E1.MGR, 
       E2.EMPNO AS MGR_EMPNO,
       E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO -- 오른쪽 외부 조인 사용 
ORDER BY E1.EMPNO;

 

8-3. SQL-99 표준 문법으로 배우는 조인 

- SQL-99 조인은 앞에서 배운 조인 방식과 기능은 같지만 조인을 사용하는 문법에서 다소 차이가 난다. 

- 다른 DBMS 제품에서도 사용할 수 있고 앞에서 배운 조인 방식과 더불어 많이 사용되므로 간단하게 사용법을 알아보자.

 

1) NATURAL JOIN

- 등가 조인을 대신해 사용할 수 있는 조인 방식으로 조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인을 해 주는 방식이다.

 

예) NATURAL JOIN을 사용하여 조인하기 

- EMP 테이블과 DEPT 테이블은 공통 열 DEPTNO을 가지고 있으므로 NATRUAL JOIN을 사용할 때 자동으로 DEPTNO 열을 기준으로 등가 조인된다. 

- 기존 등가 조인과 달리 기준 열인 DEPTNO을 SELECT절에 명시할 때 테이블 이름을 붙이면 안된다는 점을 주의해야한다. 

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;

 

 

2) JOIN ~ USING

- 등가 조인을 대신해 사용할 수 있는 조인 방식으로 NATRUAL JOIN이 자동으로 조인 기준 열을 지정하는 것과 달리 USING 키워드에 조인 기준으로 사용할 열을 명시하여 사용한다.

FROM TABLE1 JOIN TABLE2 USING (조인에 사용할 기준 열)

- JOIN ~ USING 키워드를 사용하여 EMP 테이블과 DEPT 테이블을 DEPTNO 열 기준으로 등가 조인한다면 다음과 같이 SELECT문을 작성할 수 있다. 

- 다른 조인 방식과 마찬가지로 조인된 결과 행을 추가로 제한할 때 WHERE절에 조건식을 추가하여 함께 사용할 수 있다. 

- NATURAL JOIN과 마찬가지로 조인 기준 열로 명시된 열은 SELECT절에서 테이블 이름을 붙이지 않고 작성한다.

 

예) 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;

 

3) JOIN ~ ON 

- 가장 범용성 있는 JOIN ~ ON 키워드를 사용한 조인 방식에서는 기존 WHERE절에 있는 조인 조건식을 ON 키워드 옆에 작성한다. 

- 조인 기준 조건식은 ON에 명시하고 그 밖의 출력 행을 걸러 내기 위해 WHERE 조건식을 따로 사용하는 방식이다.

* JOIN ~ ON 조인 방식은 기존 조인 방식과 크게 차이가 나지 않아 WHERE 절에 모두 명시하는 방식을 선호하는 개발자들도 많다.

FROM TABLE1 JOIN TABLE2 ON (조인 조건식)

예) JOIN ~ ON으로 등가 조인하기

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, 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, E.EMPNO;

4) OUTER JOIN

- OUTER JOIN 키워드는 외부 조인에 사용한다. 다른 SQL-99 방식의 조인과 마찬가지로 WHERE절이 아닌 FROM절에서 외부 조인을 선언한다. 기존 방식과의 차이점은 다음 표를 통해 살펴보자.

왼쪽 외부 조인 (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 (조인 조건식)

- 사원과 해당 사원의 직속 상관을 함께 출력한 SELECT문을 SQL-99 방식으로 각각 외부 조인 한 결과를 살펴보자.

 

예) 왼쪽 외부 조인을 SQL-99로 작성하기

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;

예) 오른쪽 외부 조인을 SQL-99로 작성하기

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;

 

3) 전체 외부 조인을 SQL-99로 작성하기 

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;

 

 

5) SQL-99 조인 방식에서 세 개 이상의 테이블을 조인할 때 

- 기존 조인 방식은 FROM절에 조인 테이블을 명시하고 조인 관련 조건식을 WHERE절에 명시하기 때문에 테이블 수가 두 개를 넘더라도 다음과 같이 작성하면 아무 문제가 없다.

FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
AND TABLE2.COL = TABLE3.COL

- 하지만 FROM절에 조인 관련 내용을 작성해야 하는 SQL-99 방식에서는 테이블의 개수가 두 개를 넘어갈 때 어떻게 조인해야 할지 막막할 수도 있다.

- 여러 가지 조인 키워드 방식이 있지만, 다음과 같이 FROM절에 두 개 테이블을 키워드로 조인한 바로 옆에 SQL-99 방식의 조인 내용을 추가로 작성하면 세 개 이상의 테이블도 조인할 수 있다. 

FROM TABLE1 JOIN TABLE2 ON (조건식) 
JOIN TABLE3 ON (조건식)