ITmembers.net 아카이브 · 2002–2009

재미로 배우는 오라클 & SQL 강좌

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

지난 시간에 JOIN 중에서도 EQUJOIN에 대해서만 알아봤습니다. 아울러 Cartisian Product의 개념에 대해서도 알아봤죠.
이번 시간에는 NON-EQUJOIN과 SELF JOIN에 대해 알아보겠습니다.
그리고 다음 시간에는 마지막으로 OUTER JOIN에 대해 다룰 예정입니다.


  1. NON-EQUJOIN

    EQUJOIN이 아닌 것이 NON-EQUJOIN입니다.(썰렁~)
    당연한 말이지만 지난 시간에 실습한 EQUJOIN에서 WHERE 조건식에 등호(=)가 사용되었습니다.
    이를테면 아래와 같은 식이라는 거죠.

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

    위에서 A.SKILL_NO와 B.SKILL_NO가 같다는 조건식이 있습니다.
    NON-EQUJOIN은 위와 같은 등호(=)를 이용한 조건식을 사용하지 않는 경우를 말합니다.

    예를 들어 다음과 같이 BETWEEN을 사용하여 특정 범위를 지정할 수도 있습니다.

    SELECT A.DEPTNO, A.DNAME, B.AMOUNT
            FROM DEPT A, DEPT_SALES B
    WHERE A.DEPTNO BETWEEN '100' AND '300';

  2. SELF JOIN

    셀프 조인은 동일한 테이블에서 서로 다른 행을 연결하는 방법입니다. 두 개의 서로 다른 테이블을 JOIN하는 것과 같은 방식으로 합니다.

    먼저 실습을 위해 다음 내용을 복사해서 실행합니다.(기존의 EMP 테이블을 비우고 새롭게 만든 다음 내용을 집어 넣는 명령들입니다.)

    DROP TABLE EMP;
    CREATE TABLE EMP (
            EMP_NUM CHAR(5) PRIMARY KEY,
            LAST_NAME VARCHAR2(30) NOT NULL,
            FIRST_NAME VARCHAR2(30) NOT NULL,
            JOB_CODE CHAR(2) NOT NULL,
            ADDRESS VARCHAR2(100),
            MGR_NUM CHAR(5) );
    INSERT INTO EMP VALUES ( '10001', 'GRANT', 'LINDA', 'PE', '34 of 1st Street', NULL);
    INSERT INTO EMP VALUES ( '10002', 'AMY',   'JONATHAN', 'PS', '200 Rose Street', '10001');
    INSERT INTO EMP VALUES ( '10003', 'HUROW', 'LILY', 'SS', '101 Bear Town', '10001');
    INSERT INTO EMP VALUES ( '10004', 'ADAM', 'EVELY', 'CS', '202 Declaration Drive', '10003');
    INSERT INTO EMP VALUES ( '10005', 'JULIE', 'ROSE', 'PE', '788 McTyne Street', '10003');
    INSERT INTO EMP VALUES ( '10006', 'ALBERT', 'MAY', 'SS', '320 Elaine Ave', '10003');



    위의 EMP a와 EMP b는 동일한 테이블입니다.
    EMP를 보세요. 둘째 줄을 보면 사원번호 10002인 AMY의 매니저번호는 10001입니다.
    그런데 첫째 줄을 보면 사원번호 10001은 GRANT입니다.
    즉 AMY의 매니저는 GRANT라는 뜻이죠.
    마찬가지로 HUROW의 매니저도 GRANT, ADAM의 매니저는 HUROW가 됩니다.

    여기서 다음과 같이 각각의 사원에 대한 매니저의 이름을 조회하려면 어떻게 해야할까요?



    일단 아래 내용을 보기 전에 스스로 잠시 생각해 보시길...

    SELECT A.EMP_NUM,
            A.LAST_NAME  "EMP_NAME",
            A.MGR_NUM,
            B.LAST_NAME  "MANAGER_NAME"
    FROM EMP A,
            EMP B
    WHERE A.MGR_NUM = B.EMP_NUM;

    이렇게 하면 됩니다. 직접 실행해서 결과를 보세요.

    WHERE 절을 보면 A.MGR_NUM과 B.EMP_NUM이 마치 다른 테이블의 컬럼처럼 보입니다. 그러나 FROM 절을 보면 아시다시피 하나의 EMP 테이블을 A와 B 두 가지로 명명했습니다.
    위의 2행에서 A.LAST_NAME "EMP_NAME"이라고 쓴 것은 원래 컬럼 이름인 "LAST_NAME"을 실제 표시할 때는 "EMP_NAME"이라고 보여주라는 뜻입니다.(실제 컬럼 이름이 바뀌는 것이 아니라 SELECT 문으로 조회할 때만 바뀌어 보이는 것입니다.)


이상 동주 아빠 손병목이었습니다.