SQL_Equi Join & Self Join
Equi Join - 3개 이상의 테이블에서
※ 테이블 설계를 하는 이유( 정규화, 모델링 )
하나의 테이블에 필드 개수가 너무 많아짐
→ 데이터 입/출력이 불편
→ 검색속도가 느려짐
→ RDBMS
관계형 데이터베이스로 위의 단점들을 회피
§ 형식
- 각 테이블의 primary key 확인
- join 하고자 하는 테이블의 연관된 필드 확인
- 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할 수 있다는 것을 알아두면 좋을 것 같습니다.