제1절_표준_조인(STANDARD_JOIN)

조회 수 4586 추천 수 0 2013.09.06 23:29:12
노랑배 *.159.171.48

제 1절 표준 조인( STANDARD JOIN)


1. STANDARD SQL  개요

  • 표준 SQL의 기능
    • STANDARD JOIN 기능 추가 (CROSS, OUTER JOIN 등 새로운 FROM 절 JOIN 기능들)
    • SCALAR SUBQUERY, TOP-N QUERY 등의 새로운 SUBQUERY 기능들
    • ROLLUP, CUBE, GROUPING SETS 등의 새로운 리포팅 기능
    • WINDOW FUNCTION 같은 새로운 개념의 분석 기능들

가. 일반 집합 연산자
UNION 연산은 UNION 기능으로
INTERSECTION 연산은 INTERSECT 기능으로
DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능으로

PRODUCT 연산은 CROSS JOIN 기능으로


나. 순수 관계 연산자

SELECT 연산은 WHERE 절로 구현

PROJECT 연산은 SELECT 절로 구현

(NATURAL) JOIN 연산은 다양한 JOIN 기능으로 구현

DIVIDE 연산은 현재 사용되지 않는다.



2. FROM 절 JON 형태

  • ANSI/ISO SQL에서 표시하는 FROM 절의 JOIN 형태는 다음과 같다.
    • INNER JOIN
      • 기존 WHERE 절의 검색 조건과 JOIN 조건을 그대로 사용할 수 있으며
      • 추가된 선택 기능으로 JOIN 조건을 FROM 절에서 명시적으로 정의할 수 있게 되었다.
    • NATURAL JOIN
      • INNER JOIN의 하위 개념으로
      • 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에  EQUI JOIN을 수행한다.
    • USING 조건절
    • ON 조건절
    • CROSS JOIN
    • OUTER JOIN


3. INNER JOIN

  • INNER JOIN이란?
    • JOIN 조건에서 동일한 값이 있는 행만 반환
    • FROM 절에서 정의
    • USING, ON 조건절을 필수적으로 사용해야 함.
  • 예제 (사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다)

FROM 절 JOIN 조건

SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME

FROM    EMP INNER JOIN DEPT

ON        EMP.DEPTNO = DEPT.DEPTNO;


<결과>

DEPTNO EMPNO ENAME  DNAME 

------    -----     ------    --------- 

20          7369       SMITH   RESEARCH 

30          7499       ALLEN   SALES 

30          7521       WARD    SALES 

20          7566       JONES   RESEARCH 

...

14개의 행이 선택되었다.



4. NATURAL JOIN

  • NATURAL JOIN이란?
    • 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행
    • NATURAL JOIN이 명시되면 WHERE 절에서 JOIN 조건을 정의할 수 없다.(USING, ON 조건절)
    • SQL Server에서는 지원하지 않는다.

  • 예제 1 (사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다)

SELECT DEPTNO, EMPNO, ENAME, DNAME

FROM    EMP NATURAL JOIN DEPT;


<결과>

DEPTNO EMPNO ENAME DNAME

------    ------   ------   ------

20          7369       SMITH   RESEARCH

30          7499       ALLEN   SALES

30          7521       WARD    SALES

20          7566       JONES   RESEARCH

30          7654      MARTIN  SALES

30          7698      BLAKE    SALES

...

14개의 행이 선택되었다.


  • 기타 설명
    • JOIN 컬럼을 지정하지 않았지만 공통된 칼럼(DEPTNO)으로 JOIN 처리 함.
    • JOIN에 사용된 컬럼은 같은 데이터 유형이어야 한다.
    • ALIAS나 테이블명과 같은 접두사를 붙일 수 없다.
<사용 불가 예>
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME 
FROM EMP NATURAL JOIN DEPT; 

ERROR: NATURAL JOIN에 사용된 열은 식별자를 가질 수 없음



  • 예제 2

- 별도의 칼럼 순서를 지정하지 않으면 NATURAL JOIN의 기준이 되는 칼럼 들이 다른 칼럼보다 먼저 출력된다.

- NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리한다.


SELECT * 

FROM    EMP NATURAL JOIN DEPT;


<결과>

DEPTNO EMPNO ENAME   JOB             MGR   HIREDATE      SAL   COMM    DNAME         LOC 

-----      -----     -----      --------       ---      --------        ----    ----       ---------      ------ 

20          7369       SMITH    CLERK         7902    1980-12-17     800                   RESEARCH   DALLAS 

30          7499       ALLEN    SALESMAN  7698    1981-02-20    1600      300        SALES          CHICAGO 

30          7521       WARD     SALESMAN   7698    1981-02-22   1250       500       SALES          CHICAGO 

20          7566       JONES    MANAGER    7839    1981-04-02   2975                   RESEARCH   DALLAS 

30          7654       MARTIN  SALESMAN   7698    1981-09-28   1250      1400       SALES         CHICAGO 

...

14개의 행이 선택되었다.


  • 예제 3 (INNER JOIN 예로 NATURAL JOIN과의 차이)

SELECT * 

FROM EMP INNER JOIN DEPT 

ON     EMP.DEPTNO = DEPT.DEPTNO;


EMPNO ENAME  JOB             MGR    HIREDATE     SAL   COMM  DEPTNO DEPTNO  DNAME        LOC 

----       -----     ------          ---      -------         ---     ----      -----      -----       --------       ----- 

7369      SMITH    CLERK         7902   1980-12-17      800                20           20           RESEARCH    DALLAS 

7499      ALLEN    SALESMAN  7698    1981-02-20    1600     300      30           30           SALES          CHICAGO 

7521      WARD     SALESMAN  7698    1981-02-22    1250      500     30           30           SALES           CHICAGO 

...

14개의 행이 선택되었다.


  • INNER JOIN의 경우는 두 테이블의 컬럼이 모두 출력된다.
  • 중복 테이블의 경우 별개의 컬럼으로 표시한다.



  • NATURAL JOIN과 INNER JOIN의 차이
    • NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리하지만
    • INNER JOIN은 모두 표시한다.

<예제>


DEPT 테이블

EPTNO DNAME LOC 

-------- ---------- --------- 

10 ACCOUNTING NEW YORK 

20 RESEARCH DALLAS 

30 SALES CHICAGO 

40 OPERATIONS BOSTON 

4개의 행이 선택되었다.


DEPT_TEMP 테이블

EPTNO DNAME LOC 

-------- ---------- --------- 

10 ACCOUNTING NEW YORK 

20 R&D DALLAS 

30 MARKETING CHICAGO 

40 OPERATIONS BOSTON 

4개의 행이 선택되었다.



<NATURAL JOIN 경우>

SELECT * 

FROM DEPT NATURAL INNER JOIN DEPT_TEMP;


DEPTNO   DNAME             LOC 

------       ----------        ---------- 

10            ACCOUNTING    NEW YORK 

40            OPERATIONS     BOSTON

2개의 행이 선택되었다.



<INNER JOIN 경우>

SELECT * 

FROM DEPT JOIN DEPT_TEMP 

ON DEPT.DEPTNO = DEPT_TEMP.DEPTNO

AND DEPT.DNAME = DEPT_TEMP.DNAME 

AND DEPT.LOC = DEPT_TEMP.LOC;


DEPTNO     DNAME           LOC              DEPTNO    DNAME              LOC 
------       ----------        --------        ------        ----------         ------ 
10             ACCOUNTING   NEW YORK     10              ACCOUNTING    NEW YORK 
40             OPERATIONS   BOSTON         40              OPERATIONS     BOSTON 
2개의 행이 선택되었다.




5. USING 조건절

  • USING 조건절이란?
    • FROM절에 USING 조건절을 이용하여 같은 이름을 가진 칼럼중에 원하는 칼럼에 대해서만 EQUI JOIIN을 할 수 있다.
      (NATURAL JOIN에서는 모든 일치되는 칼럼을 조인하지만 USING은 원하는 칼럼만 JOIN한다)
    • SQL SERVER에서는 지원하지 않는다.
    • JOIN 칼럼에 대해서 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다.

잘못된 사례

SELECT DEPT.DEPTNO, DEPT.DNAME, DEPT.LOC, DEPT_TEMP.DNAME, DEPT_TEMP.LOC   => ALIAS 사용 불가

FROM    DEPT JOIN DEPT_TEMP 

USING   (DEPTNO); 


ERROR: USING 절의 열 부분은 식별자를 가질 수 없음 


바른 사례

SELECT DEPTNO, DEPT.DNAME, DEPT.LOC, DEPT_TEMP.DNAME, DEPT_TEMP.LOC 

FROM    DEPT JOIN DEPT_TEMP 

USING   (DEPTNO);


<실행결과>

DEPTNO    DNAME            LOC             DNAME              LOC 

-------      ---------          ---------     -----------         -------- 

10             ACCOUNTING   NEW YORK   ACCOUNTING     NEW YORK 

20             RESEARCH       DALLAS        R&D                   DALLAS 

30             SALES             CHICAGO      MARKETING       CHICAGO 

40             OPERATIONS    BOSTON      OPERATIONS      BOSTON 

4개의 행이 선택되었다.


  • 예제 1 (DEPT와 DEPT_TEMP 테이블의 DNAME 칼럼을 조인 조건으로 INNER JOIN의 USING 조건절을 수행한다.)

SELECT * 

FROM    DEPT JOIN DEPT_TEMP 

USING    (DNAME);


<결과>

DNAME            DEPTNO  LOC              DEPTNO     LOC 

----------        ------      ---------      -------       --------- 

ACCOUNTING  10             NEW YORK    10             NEW YORK 

OPERATIONS   40            BOSTON        40             BOSTON 

2개의 행이 선택되었다.


<결과 설명>

두 테이블에서 컬럼값이 같은 로우만 출력되고 DNAME를 식별자로 정렬한다.



예제 2 (칼럼명이 모두 같은 DEPT와 DEPT_TEMP 테이블을 LOC와 DEPTNO 2개 칼럼을 이용한

           INNER JOIN의 USING 조건절로 수행한다.)

SELECT * 

FROM    DEPT JOIN DEPT_TEMP 

USING   (LOC, DEPTNO);


<결과>

LOC             DEPTNO  DNAME              DNAME

 --------      ------      ----------          ---------- 

NEW YORK    10           ACCOUNTING    ACCOUNTING 

DALLAS         20           RESEARCH        R&D 

CHICAGO       30           SALES              MARKETING 

BOSTON        40           OPERATIONS    OPERATIONS 

4개의 행이 선택되었다.


<결과 설명>

조인에 참여한 LOC와 DEPTNO 컬람값이 같은 로우만 출력한다.

JOIN 조건에 참여하지 않은 DNAME 칼럼은 2개의 칼럼으로 표시된다.



6. ON 조건절

  • ON 조건절 특징
    • ON 조건절을 사용하면 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있다.
    • 임의의 JOIN 조건을 지정할 수 있다.
    • 이름이 다른 칼럼명을 JOIN 조건으로 사용할 수 있다.
    • JOIN 칼럼명을 명시할 수 있다.
    • ALIAS나 테이블 명과 같은 접두사를 사용할 수 있다.


가. WHERE절과의 혼용

  • 예제 (부서코드 30인 부서의 부서의 소석 사원 이름 및 소속 부서 코드, 부서 코드, 부서 이름을 찾아본다.)

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME 

FROM    EMP E JOIN DEPT D 

ON        (E.DEPTNO = D.DEPTNO) 

WHERE   E.DEPTNO = 30;


<결과>

ENAME    DEPTNO DEPTNO DNAME 

-------     ------     ------     ------ 

ALLEN      30           30          SALES 

WARD       30           30          SALES 

MARTIN    30           30          SALES 

BLAKE      30           30           SALES 

TURNER    30           30          SALES

JAMES      30           30          SALES 

6개의 행이 선택되었다.


나. ON 조건절 + 데이터 검증 조건 추가

  • ON 조건절에 데이터 검색 조건을 추가할 수 있다.
  • 검색 조건 목적인 경우는 WHERE절을 사용할 것을 권고한다.
    (다마 아우터 조인에서 조인의 대상을 제한하기 위한 목적으로 사용되는 추가 조건의 경우는 ON 절에 표기한다.)

  • 예제 (매니저 사원번호가 7698번인 사원들의 이름 및 소속 부서 코드, 부서 이름을 찾아본다)

SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME 

FROM    EMP E JOIN DEPT D 

ON        (E.DEPTNO = D.DEPTNO AND E.MGR = 7698); 


위 SQL과 아래 SQL은 같은 결과를 얻을 수 있다. 


SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME 

FROM    EMP E JOIN DEPT D 

ON        (E.DEPTNO = D.DEPTNO) 

WHERE  E.MGR = 7698;


<실행결과>

ENAME     MGR   DEPTNO DNAME 

-------      ----    ------     ------ 

ALLEN      7698    30             SALES 

WARD       7698    30             SALES 

MARTIN    7698    30             SALES 

TURNER   7698    30             SALES 

JAMES     7698    30             SALES 

5개의 행이 선택되었다.



다. ON 조건절 예제

  • 예제 1 (팀과 스타디움 테이블을 스타디움ID로 JOIN하여 팀이름, 스타디움ID, 스타디움 이름을 찾아본다.)

SELECT TEAM_NAME, TEAM.STADIUM_ID, STADIUM_NAME 

FROM    TEAM JOIN STADIUM 

ON         TEAM.STADIUM_ID = STADIUM.STADIUM_ID 

ORDER BY STADIUM_ID; 


위 SQL은 STADIUM_ID라는 공통된 칼럼이 있기 때문에 아래처럼 USING 조건절로 구현할 수도 있다. 


SELECT TEAM_NAME, STADIUM_ID, STADIUM_NAME 

FROM    TEAM JOIN STADIUM 

USING    (STADIUM_ID) 

ORDER BY STADIUM_ID; 


위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다. 


SELECT TEAM_NAME, TEAM.STADIUM_ID, STADIUM_NAME

FROM    TEAM, STADIUM 

WHERE   TEAM.STADIUM_ID = STADIUM.STADIUM_ID 

ORDER BY STADIUM_ID;


<실행결과>

TEAM_NAME      STADIUM_ID  STADIUM_NAME 

-------------      ---------      ------------- 

광주상무              A02              광주월드컵경기장 

강원FC                A03              강릉종합경기장 

제주유나이티드FC A04              제주월드컵경기장 

...

15개의 행이 선택되었다.

  • 예제 2 
    (팀과 스타디움 테이블을 팀ID로 JOIN하여 팀이름, 팀ID, 스타디움 이름을 찾아본다. STADIUM에는 팀ID가 HOMETEAM_ID라는 칼럼으로 표시되어 있다.)

SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME 

FROM    TEAM JOIN STADIUM 

ON         TEAM.TEAM_ID = STADIUM.HOMETEAM_ID 

ORDER BY TEAM_ID; 


위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다. 


SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME 

FROM    TEAM, STADIUM 

WHERE  TEAM.TEAM_ID = STADIUM.HOMETEAM_ID 

ORDER   BY TEAM_ID; 


<실행결과>

TEAM_NAME TEAM_ID STADIUM_NAME 

-----------    -------   ------------- 

울산현대         K01         울산문수경기장 

삼성블루윙즈   K02         수원월드컵경기장 

스틸러스          K03        포항스틸야드 

...

15개의 행이 선택되었다.


라. 다중 테이블 JOIN


  • 예제 1 (사원과 DEPT 테이블의 소속 부서명, DEPT_TEMP 테이블의 바뀐 부서명 정보를 출력한다.)

SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME 

FROM    EMP E JOIN DEPT D 

ON        (E.DEPTNO = D.DEPTNO) 

             JOIN DEPT_TEMP T 

ON        (E.DEPTNO = T.DEPTNO); 


위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다. 


SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME

FROM    EMP E, DEPT D, DEPT_TEMP T 

WHERE  E.DEPTNO = D.DEPTNO 

AND      E.DEPTNO = T.DEPTNO;


<실행결과>

EMPNO DEPTNO DNAME         NEW_DNAME 

------   ------     ---------      ----------- 

7369      20           RESEARCH    R&D 

7499      30           SALES          MARKETING 

7521      30           SALES          MARKETING 

...

14개의 행이 선택되었다.


예제 2 (GK 포지션의 선수별 연고지명, 팀명, 구장명을 출력한다.)

SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션, T.REGION_NAME 연고지명, T.TEAM_NAME 팀명,

             S.STADIUM_NAME 구장명

FROM    PLAYER P JOIN TEAM T 

ON        P.TEAM_ID = T.TEAM_ID 

            JOIN STADIUM S 

ON       T.STADIUM_ID = S.STADIUM_ID 

WHERE P.POSITION = 'GK' 

ORDER BY 선수명; 


<실행결과>

선수명 포지션 연고지명 팀명       구장명 

-----   ----      ------ -------- ---------- 

강성일 GK        대전     시티즌    대전월드컵경기장 

권정혁 GK       울산      울산현대 울산문수경기장 

권찬수 GK       성남      일화천마 성남종합운동장 

김대희 GK       포항      스틸러스 포항스틸야드 

...

43개의 행이 선택되었다.


예제 3 (홈팀이 3점 이상 차이로 승리한 경기의 경기장 이름, 경기 일정, 홈팀 이름과 원정팀 이름 정보를 출력한다)

SELECT ST.STADIUM_NAME, SC.STADIUM_ID, SCHE_DATE, HT.TEAM_NAME, AT.TEAM_NAME, 

             HOME_SCORE, AWAY_SCORE 

FROM    SCHEDULE SC JOIN STADIUM ST 

ON        SC.STADIUM_ID = ST.STADIUM_ID

            JOIN TEAM HT 

ON       SC.HOMETEAM_ID = HT.TEAM_ID 

           JOIN TEAM AT 

ON       SC.AWAYTEAM_ID = AT.TEAM_ID 

WHERE HOME_SCORE > = AWAY_SCORE +3; 


위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다. 


SELECT ST.STADIUM_NAME, SC.STADIUM_ID, SCHE_DATE, HT.TEAM_NAME, AT.TEAM_NAME, 

             HOME_SCORE, AWAY_SCORE 

FROM    SCHEDULE SC, STADIUM ST, TEAM HT, TEAM AT 

WHERE  HOME_SCORE> = AWAY_SCORE +3 

AND      SC.STADIUM_ID = ST.STADIUM_ID 

AND      SC.HOMETEAM_ID = HT.TEAM_ID 

AND      SC.AWAYTEAM_ID = AT.TEAM_ID; 


<실행결과>

STADIUM_NAME     STADIUM_ID SCHE_DATE TEAM_NAME TEAM_NAME HOME_SCORE AWAY_SCORE 

------------          ---------       --------      ---------       ---------      ---------          --------- 

서울월드컵경기장    B05                20120714      FC서울          삼성블루윙즈   3                      0 

부산아시아드경기장 C02                20120727      아이파크        시티즌            3                      0 

울산문수경기장       C04                20120803      울산현대        스틸러스         3                      0 

성남종합운동장       B02                20120317      일화천마         유나이티드      6                      0 

창원종합운동장       C05                20120427      경남FC           아이파크         5                      2 

5개의 행이 선택되었다.



7. CROSS JOIN





8. OUTER JOIN

  • OUTER JOIN이란?
    • JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
    • FULL OUTER JOIN



가. LEFT OUTER JOIN

  • LEFT OUTER JOIN이란?
    • 조인 수행시 좌측 테이블에서 데이터를 먼저 읽은 후, 우측 테이블에서 JOIN 대상을 읽어 온다.
    • 즉, 좌측 테이블이 기준이 됨

  • 예제 1 (STADIUM과 TEAM을 JOIN 하되 홈팀이 없는 경기장의 정보도 같이 출력하도록 한다)

SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME 

FROM    STADIUM LEFT OUTER JOIN TEAM 

ON        STADIUM.HOMETEAM_ID = TEAM.TEAM_ID 

ORDER BY HOMETEAM_ID; 


OUTER는 생략 가능한 키워드이므로 아래 SQL은 같은 결과를 얻을 수 있다. 


SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME 

FROM    STADIUM LEFT JOIN TEAM 

ON        STADIUM.HOMETEAM_ID = TEAM.TEAM_ID 

ORDER BY HOMETEAM_ID;


<실행결과>

STADIUM_NAME      STADIUM_ID   SEAT_COUNT HOMETEAM_ID TEAM_NAME 

------------            ---------        ----------      -----------       ---------- 

울산문수경기장         C04                46102             K01 울산현대 

수원월드컵경기장      B04                50000             K02 삼성블루윙즈 

포항스틸야드            C06                25000             K03 스틸러스 

인천월드컵경기장      B01                35000             K04 유나이티드 

전주월드컵경기장      D03                28000             K05 현대모터스 

부산아시아드경기장   C02                30000             K06 아이파크 

광양전용경기장         D01                20009             K07 드래곤즈 

성남종합운동장         B02                27000             K08 일화천마 

서울월드컵경기장      B05                66806             K09 FC서울 

대전월드컵경기장      D02                41000             K10 시티즌 

창원종합운동장         C05                27085             K11 경남FC 

광주월드컵경기장      A02                40245             K12 광주상무 

강릉종합경기장         A03                33000             K13 강원FC 

제주월드컵경기장      A04                42256             K14 제주유나이티드FC 

대구월드컵경기장      A05                66422             K15 대구FC 

안양경기장               F05                 20000                                              

마산경기장               F04                 20000                                              

일산경기장               F03                 20000                                              

부산시민경기장         F02                 30000                                              

대구시민경기장         F01                 30000                                              

20개의 행이 선택되었다.


<결과 부연설명>

INNER JOIN이라면 홈팀이 배정된 15개만 출력 되겠지만 LEFT OUTER JOIN을 사용하여 홈팀이 없는 정보까지 출력 됨.


나. RIGHT OUTER JOIN

  • RIGHT OUTER JOIN이란
    • 조인 수행시 우측 테이블이 기준이 되어 결과를 생성한다.

  • 예제 (EPT와 EMP를 조인하되 사원이 없는 부서 정보도 같이 출력하도록 한다.)

SELECT E.ENAME, D.DEPTNO, D.DNAME 

FROM    EMP E RIGHT OUTER JOIN DEPT D 

ON        E.DEPTNO = D.DEPTNO; 


<실행결과>

ENAME DEPTNO DNAME              LOC 

-----     ------    ---------           -------- 

CLARK     10       ACCOUNTING    NEW YORK 

KING        10       ACCOUNTING    NEW YORK 

MILLER    10       ACCOUNTING    NEW YORK 

JONES     20       RESEARCH       DALLAS 

FORD        20      RESEARCH        DALLAS 

ADAMS     20      RESEARCH        DALLAS 

SMITH      20      RESEARCH        DALLAS 

SCOTT     20      RESEARCH        DALLAS 

WARD       30      SALES               CHICAGO 

TURNER    30      SALES              CHICAGO 

ALLEN       30     SALES              CHICAGO 

JAMES      30     SALES              CHICAGO 

BLAKE      30      SALES              CHICAGO 

MARTIN    30      SALES              CHICAGO

                40      OPERA              TIONS BOSTON 

15개의 행이 선택되었다.


다. FULL OUTER JOIN

  • FULL OUTER JOIN이란?
    • 조인되는 모든 테이블의 데이터를 읽어 JOIN한다.
    • RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.


예제 (DEPT 테이블과 DEPT_TEMP 테이블의 FULL OUTER JOIN 사례를 만들기 위해 DEPT_TEMP의 DEPTNO를 수정한다. 결과적

        으로 DEPT_TEMP 테이블의 새로운 DEPTNO 데이터는 DETP 테이블의 DEPTNO와 2건은 동일하고 2건은 새로운 DEPTNO가

        생성된다.)

SELECT * 

FROM DEPT FULL OUTER JOIN DEPT_TEMP 

ON     DEPT.DEPTNO = DEPT_TEMP.DEPTNO; 


위 SQL과 아래 SQL은 같은 결과를 얻을 수 있다. 


SELECT L.DEPTNO, L.DNAME, L.LOC, R.DEPTNO, R.DNAME, R.LOC 

FROM    DEPT L LEFT OUTER JOIN DEPT_TEMP R 

ON        L.DEPTNO = R.DEPTNO

UNION 

SELECT L.DEPTNO, L.DNAME, L.LOC, R.DEPTNO, R.DNAME, R.LOC 

FROM    DEPT L RIGHT OUTER JOIN DEPT_TEMP R 

ON        L.DEPTNO = R.DEPTNO;


<실행결과>

DEPTNO DNAME             LOC             DEPTNO   DNAME           LOC 

------    ----------         --------        ------      -----------      ------ 

10          ACCOUNTING    NEW YORK                                                           

20          RESEARCH        DALLAS                                                                

30          SALES              CHICAGO       30            ACCOUNTING   NEW YORK 

40          OPERATIONS    BOSTON        40            R&D                  DALLAS 

                                                         50             MARKETING     CHICAGO 

                                                         60             OPERATIONS    BOSTON 

6개의 행이 선택되었다.



9. INNER vs OUTER vs CROSS JOIN 비교

첫 번째, INNER JOIN의 결과. 

양쪽 테이블에 모두 존재하는 키 값이 B-B, C-C 인 2건이 출력 


두 번째, LEFT OUTER JOIN의 결과. 

TAB1을 기준으로 키 값 조합이 B-B, C-C, D-NULL, E-NULL 인 4건이 출력


세 번째, RIGHT OUTER JOIN의 결과. 

TAB2를 기준으로 키 값 조합이 NULL-A, B-B, C-C 인 3건이 출력


네 번째, FULL OUTER JOIN의 결과. 

양쪽 테이블을 기준으로 키 값 조합이 NULL-A, B-B, C-C, D-NULL, E-NULL 인 5건이 출력


다섯 번째, CROSS JOIN의 결과. 

JOIN 가능한 모든 경우의 수를 표시하지만 단, OUTER JOIN은 제외한다. 

양쪽 테이블 TAB1과 TAB2의 데이터를 곱한 개수인 4 * 3 = 12건이 추출됨 키 값 조합이 

B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C 인 12건 출력