ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL_Equi Join & Self Join
    Data Base_Oracle/SQL 2020. 1. 6. 22:11

    Equi Join - 3개 이상의 테이블에서

    ※ 테이블 설계를 하는 이유( 정규화, 모델링 )

    하나의 테이블에 필드 개수가 너무 많아짐
    → 데이터 입/출력이 불편
    → 검색속도가 느려짐

    → RDBMS
    관계형 데이터베이스로 위의 단점들을 회피

    § 형식

    1. 각 테이블의 primary key 확인
    2. join 하고자 하는 테이블의 연관된 필드 확인
    3. where 조건식 : [ join 테이블 수 - 1 ]개의 조건식으로 연결

    # 예제 - 3개 이상의 테이블

    ▷ bonus테이블에 데이터 입력
    [ SQL> insert into bonus values('SMITH', 'CLERK', 800, null)
    insert into bonus values('ALLEN', 'SALESMAN', 1600, 300)
    insert into bonus values('WARD', 'SALESMAN', 1250, 500);
    SQL> select * from bonus; ]

    ENAME JOB SAL COMM
    SMITH CLERK 800  
    ALLEN SALESMAN 1600 300
    WARD SALESMAN 1250 500

    ※ scott 계정의 bonus테이블은 로우가 비어있기 때문에 값을 채워야 함

     

    ▷ 각 테이블 간의 연관된 필드 확인

    EMP DEPT BONUS
    DEPTNO(FK) DEPTNO(PK)  
    ENAME   ENAME
    JOB   JOB
    SAL   SAL
    COMM   COMM

    ※ emp테이블과 bonus테이블의 공통 필드는 4개가 있지만
    ename이 행을 구분하는 역할을 할 수 있기 때문에 유용함

     

    { 문제 }
    ▷ emp테이블에서 사번, 이름, 업무, 급여, 보너스 출력
    dept테이블에서 부서명 출력
    emp테이블에서 업무가 SALESMAN인 사원의 정보 조회
    단, bonus테이블과 같이 3개의 테이블을 조인해서 작성

     

    ▶ [ SQL> select e.empno, e.ename, e.job, e.sal, e.comm, d.dname from emp e, dept d, bonus b where e.deptno=d.deptno and e.ename=b.ename and e.job='SALESMAN'; ]

    EMPNO ENAME JOB SAL COMM DNAME
    7521 WARD SALESMAN 1250 500 SALES
    7499 ALLEN SALESMAN 1600 300 SALES

    ※ 테이블 3개를 join하는 조건식 2개와 SALESMAN을 찾는 조건식 1개
    ※ 연산자는 모두 =가 쓰였기 때문에 equi join이라고 할 수 있음


    Self Join (Mirror Join)

    상대 테이블 또는 상대 테이블 내 연관 필드가 없을 때
    자기 테이블 내의 칼럼을 참조한 뒤 가상으로 테이블을 만들어서 Join

    # 예제

    ▷ 사원 이름과 그의 직속상관에 해당하는 사원 이름을 출력

     

    ▶ [ SQL> select w.ename || '의 직속상관은 ' || m.ename || '입니다.'
    from emp w, emp m
    where w.mgr = m.empno; ]

    W.ENAME || '의 직속상관은 ' || M.ENAME || '입니다.'
    FORD의 직속상관은 JONES입니다.
    SCOTT의 직속상관은 JONES입니다.
    ...

    ※ KING(사장)의 직속상관은 없기 때문에 전체 14명 중 13명만 출력됨


    3개의 테이블에서 Equi Join을 사용하는 방법에 대해 알아보았습니다.

    Self Join은 자주 사용되지는 않지만 A필드가 포함된 테이블의 B필드를

    Join할 수 있다는 것을 알아두면 좋을 것 같습니다.

    'Data Base_Oracle > SQL' 카테고리의 다른 글

    SQL_Ansi Join  (0) 2020.01.06
    SQL_Non-Equi Join & Outer Join  (0) 2020.01.06
    SQL_Inner Join(Equi Join) & 테이블 별칭 부여  (0) 2020.01.06
    SQL_Join 개요 & Cross Join  (0) 2020.01.06
    SQL_Constraint Enable / Disable  (0) 2020.01.06

    댓글

Designed by Tistory.