-
SQL_Equi Join & Self JoinData Base_Oracle/SQL 2020. 1. 6. 22:11
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할 수 있다는 것을 알아두면 좋을 것 같습니다.
'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