Data Base_Oracle/SQL

SQL_Equi Join & Self Join

pathas 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할 수 있다는 것을 알아두면 좋을 것 같습니다.