0
 45   5   2
  View Articles

Name  
   손병목  (2002-03-28 22:19:51, Hit : 11776, Vote : 953)
Homepage  
   http://www.itmembers.net
Subject  
   오라클 데이터 검색 - JOIN (1) EquJoin
지금까지 우리는 하나의 테이블을 대상으로 검색 연습을 했습니다.
이번 시간에는 두 개 이상의 테이블로부터 원하는 데이터를 검색할 수 있는 방법에 대해 알아보기로 하죠.

두 개 이상의 테이블로부터 원하는 정보를 검색하기 위해서는 JOIN 문을 사용합니다.
그러나 JOIN이 반드시 두 개 이상의 테이블에서만 사용되는 것은 아닙니다. 하나의 테이블에서도 JOIN을 사용하여 마치 두 개의 테이블인 것처럼 사용할 수도 있습니다.(이것을 Self Join이라고 하는데 다음 시간에 다룹니다.)

JOIN 방법에는 EQUJOIN, NON-EQUJOIN, OUTER JOIN, SELF JOIN 등이 있는데
이번 시간에는 EQUJOIN에 대해서만 알아보기로 하겠습니다.
나머지 세 종류의 JOIN 방법은 다음 시간에 다루기로 하죠.

먼저 실습을 통해 EQUJOIN이 어떤 것인지 눈으로 확인부터 하죠.

아래와 같이 EMP_SKILL 테이블과 SKILL 테이블이 있다고 할 때,


EMP_NUM, SKILL_NO, SKILL_NAME을 한번에 표시하고 싶습니다.

그런데 EMP_NUM 컬럼은 EMP_SKILL 테이블에만 있고,
EMP_NO 컬럼은 EMP_SKILL과 SKILL 테이블 모두에 있고,
SKILL_NAME 컬럼은 SKILL 테이블에만 있습니다.
즉 표시하고 싶은 컬럼이 두 개의 테이블에 나뉘어 있다는 것입니다.

이럴 때 두 개의 테이블에서 원하는 컬럼만 골라서 표시하려 한다면 JOIN을 사용합니다.

  1. 실습을 하기 전에 SKILL 테이블 하나를 만듭시다.
    다음 코드를 그대로 복사하여 실행하면 위와 같은 SKILL 테이블이 만들어집니다.

    DROP TABLE SKILL;

    CREATE TABLE SKILL
    (  SKILL_NO CHAR(4) PRIMARY KEY,
       SKILL_NAME VARCHAR2(30) NOT NULL);

    INSERT INTO SKILL VALUES ('C101', 'CUSTOMER ENGINEER');
    INSERT INTO SKILL VALUES ('D101', 'DATABASE ADMIN');
    INSERT INTO SKILL VALUES ('E101', 'ERP ENGINEER');
    INSERT INTO SKILL VALUES ('P101', 'PROGRAMMER');
    INSERT INTO SKILL VALUES ('S101', 'SYSTEM PROGRAMMER');
    INSERT INTO SKILL VALUES ('S102', 'SYSTEM ADMIN');


  2. 다음과 같이 입력하여 그 결과를 살펴 봅시다.

    SELECT        A.EMP_NUM,
            A.SKILL_NO,
            B.SKILL_NAME
    FROM        EMP_SKILL          A,
            SKILL                B
    WHERE        A.SKILL_NO = B.SKILL_NO;


    FROM 절을 유의해서 보세요.
    EMP_SKILL 테이블을 A라고 하고, SKILL 테이블을 B라고 한다는 뜻입니다.
    그럴 때, A의 EMP_NUM과 A의 SKILL_NO와 B의 SKILL_NAME을 표시하라는 뜻입니다.
    그런데 모두 표시하라는 것은 아닙니다. WHERE 절을 보면 A의 SKILL_NO와 B의 SKILL_NO가 같은 것만 표시하라는 것이죠.

    이해되시죠?


자, 그럼 정리합니다.

  • JOIN은 하나 이상의 테이블에서 원하는 컬럼을 검색할 때 사용합니다.
  • 단, JOIN은 FROM 절에서 명시한 테이블의 컬럼에만 한정합니다.
  • 이때 컬럼 간의 값들이 서로 일치할 때만 사용하는 JOIN을 EQUJOIN이라고 합니다.(위에서 실습한 거!)
  • 반드시 WHERE 절이 있어야겠죠. 위의 예에서는 'A와 B의 EMP_NO가 같은 레코드 중에서'라는 조건이 있습니다.
    그런데 만약 WHERE 조건이 생략되면...? 뒤에 설명이 아오겠지만 Cartesian Product라는 것이 발생합니다.(뒤에서 다시 설명하겠습니다.)
  • WHERE 조건은 최소한 테이블 수에서 하나를 뺀 것만큼은 있어야 합니다. 그래야 Cartesian Product라는 게 발생하지 않습니다.
  • 위의 예에서 EMP_SKILL 테이블을 A로, SKILL 테이블을 B로 표현했죠? 이럴 때 A와 B를 Correlation Name(연관된 이름)이라고 부릅니다.


EQUJOIN에 대해 실습을 하나 더 해보죠.
다음과 같은 테이블이 있을 때
A의 EMP_NUM과 C의 EMP_NUM이 같고, B의 SKILL_NO와 C의 SKILL_NO가 같은 레코드를 골라 EMP_NUM, LAST_NAME, SKILL_NO, SKILL_NAME을 표시하려면 어떻게해야 할까요?




먼저 직접 해보시고, 답을 확인하시려면 아래의 빈 공간을 마우스로 드래그하면 보입니다.


SELECT        A.EMP_NUM,
        LAST_NAME,
        B.SKILL_NO,
        SKILL_NAME
FROM        EMP                A,
        SKILL                  B,
        EMP_SKILL        C
WHERE        C.EMP_NUM = A.EMP_NUM        
AND        C.SKILL_NO = B.SKILL_NO;




마지막으로 Cartesian Product(카티전 프로덕트)에 대해 짚고 넘어가겠습니다.
Cartesian은 원래 '데카르트의' 또는 '데카르트學'이라는 뜻입니다. 수학에서는 평행 또는 직각이라는 의미로 사용됩니다. Product는 수학에서 '곱'이라는 뜻이죠.
따라서 Cartesina Product는 '직각의 곱'(?)이라고 풀이하면...... 더 헤깔리겠죠?
수학에서 카티전 곱은 임의의 두 집합 A, B가 있을 때, A의 원소 a와 B의 원소 b를 조합하여 만든 (a,b)의 순서쌍을 모두 모은 집합을 뜻합니다. 따라서 A의 원소가 3개이고 B의 원소가 4개이면 A와 B의 Cartesian Porduct는 3×4개가 나옵니다.

아래 그림을 보시죠.


EMP_SKILL의 레코드가 7개, SKILL의 레코드가 6개가 되니까 두 테이블의 Cartesian Product는 42개의 레코드가 표시됩니다.

두 개의 테이블을 JOIN할 때 실수로 WHERE 절을 사용하지 않았거나 WHERE 조건을 잘못 지정하면 뜻하지 않게 이런 Cartesian Product가 발생하기도 합니다.
위의 그림을 보면 두 테이블의 SKILL_NO가 같은 레코드 중에서 EMP_NUM과 SKILL_NO, SKILL_NAME을 표시하면 7개의 레코드가 출력되어야 하는데,
잘못해서 WHERE A.SKILL_NO=B.SKILL_NO라는 조건을 주지 않으면 42개의 레코드가 출력됩니다.

생각보다 설명이 꽤 길어졌네요. 타이핑하느라 손가락이 다 아픕니다.
이상 동주아빠 손병목이었습니다.

Prev
   오라클 데이터 검색 - JOIN (2) NonEquJoin, SelfJoin

손병목
Next
   오라클 데이터 검색 - ORDER BY, GROUP BY

손병목


Copyright 1999-2019 Zeroboard / skin by Zetyx