데이터베이스/Oracle

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

eunsour 2020. 7. 28.
반응형
  • DBMS - Oracle Database
  • VERSION - Oracle Database 11g Release 2
  • IDE - SQL Developer

실습용 데이터를 입력하지 않고, 오라클 데이터베이스를 설치하면 기본으로 제공되는 테이블과 계정들로 학습한 내용입니다. 


※ 조인

1. 열 이름을 비교하는 조건식으로 조인하기

SELECT * FROM EMP, DEPT
    WHERE EMP.DEPTNO = DEPT.DEPTNO
    ORDER BY EMPNO;
집합 연산자와 조인의 차이점
집합 연산자를 사용한 결과는 두 개 이상 SELECT문의 결과 값을 세로로 연결한 것이고, 조인을 사용한 결과는 두 개 이상의 테이블 데이터를 가로로 연결한 것. 

결과 >> 

 

2. 테이블의 별칭 설정

SELECT * FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO
    ORDER BY EMPNO;
SELECT절의 * 사용
여러 응용 프로그램을 제작하는 프로그래밍 문장에서 SQL문을 사용할 때는 각 테이블의 모든 열을 출력할지라도 대부분 * 를 사용하지 않고 출력할 열을 하나하나 직접 명시해준다.

SELECT절에서 출력할 열을 *로 표현하면 어떤 열이 어떤 순서로 출력될지 명확히 알 수 없을 뿐만 아니라 특정 열이 새로 생기거나 삭제되거나 또는 어떤 이유로 인해 수정되었을 경우에 그 변화의 감지 및 변화에 따른 프로그램 수정이 쉽지 않을 수가 있다.

※ 조인 종류

1. 등가 조인

SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO
    ORDER BY D.DEPTNO, E.EMPNO;

결과 >> 

WHERE절에 조건식 추가하여 출력 범위 설정하기
SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME, D.LOC
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO
        AND SAL >= 3000;

결과 >>

WHERE절의 조건식을 사용해 테이블을 조인할 때 반드시 각 테이블을 정확히 연결하는 조건식이 최소한 전체 테이블 수보다 하나 적은 수만큼 있어야 한다.
조인 조건을 제대로 지정하지 않으면 필요 없는 데이터까지 모두 조합되어 데카르트의 곱으로 출력된다.

 

2. 비등가 조인

SELECT * FROM EMP E, SALGRADE S
    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

결과 >>

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

 

3. 자체 조인

하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식으로 물리적으로 동일한 테이블 여러 개를 사용할 떄 발생할 수 있는 문제점을 해결

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;

결과 >>

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

 

4. 외부 조인

조인 조건 데이터 중 어느 한쪽이 NULL임에도 결과를 출력할 때  포함시켜야 하는 경우 강제로 출력하는 방식.

 

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

 

(1) 왼쪽 외부 조인 사용하기

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;

결과 >>

 

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

 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;

결과 >>

 


※ SQL-99 표준 문법으로 배우는 조인

1. 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;
조인 조건이 WHERE절에 있는 기존 조인 방식과 달리 SQL-99 방식 조인은 FROM절에 조인 키워드를 사용하는 형태로 작성

 

2. JOIN ~ USING

NATURAL JOIN이 자동으로 조인 기준 열을 지정하는 것과 달리 USING 키워드에 조인 기준으로 사용할 열을 명시하여 사용

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

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

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

기존 WHERE절에 있는 조인 조건식을 ON 키워드 옆에 작성

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

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 DEPTNO, E.EMPNO;

 

4. OUTER JOIN

다른 SQL-99 방식의 조인과 마찬가지로 WHERE절이 아닌 FROM절에서 외부 조인을 선언한다.

 

(1) 왼쪽 외부 조인을 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;

 

(2) 오른쪽 외부 조인을 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;

 

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

왼쪽 열이 NULL인 경우와 오른쪽 열이 NULL인 경우를 모두 출력하는 방식

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절에 조인 관련 내용을 작성해야 하는 SQL-99 방식에서는 테이블의 개수가 두 개를 넘어갈 때, 다음과 같이 FROM절에 두 개 테이블을 키워드로 조인한 바로 옆에 SQL-99 방식의 조인 내용을 추가로 작성하면 세 개 이상의 테이블도 조인할 수 있다.

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

 

 

 

Reference

 
Do it! 오라클로 배우는 데이터베이스 입문
저자 : 이지훈
출판 : 이지스퍼블리싱
발매 : 2018.10.30

 

반응형

댓글