OracleDB Join

Join
  • Join
  • 하나 이상(Self Join)의 태이블에서 데이터를 질의 할 때 Join을 사용합니다.
  • WHERE절에서 =로 비교를 하는데, 두개 이상의 테이블에서 공통적인 컬럼에 의해 논리적으로 결합된 것을 말합니다.  - Equi Join
  • 하나 이상의 테이블에 동일한 컬럼이 있을 때 동일한 컬럼 앞에 테이블 이름을 붙입니다.
    Join 조건이 주어지지 않을 경우 Cartesian Product로 인식하여 연산합니다.

 

  • Equi Join
select * from emp,dept;


위의 질의처럼 아무런 조건을 주지 않았을 경우 Cartesian Product가 수행되어 카디널리티가 56이 됩니다.

select empno, ename, sal, dept.deptno, dname, loc 
from emp, dept 
where emp.deptno = dept.deptno;

select e.empno, e.ename, e.sal, d.deptno, d.dname, d.loc 
from emp e, dept d
where e.deptno = d.deptno;

조건을 주어서 Join을 준 결과입니다. 전자는 조건만 주었고 후자의 경우에는 별명을 붙이고 성능을 조금 더 향상시키기 위하여 찾아야 하는 테이블 까지 명시해서 질의를 하였습니다.

 

  • Natural Join
select empno, ename, deptno, dname from emp natural join dept;

WHERE 절이 사라졌습니다. 질의를 작성하는게 매우 간편해졌습니다. 하지만 우리가 질의 하지 않는 부분을 서버에서 하기 때문에 이 또한 성능에 지장을 주게 됩니다.

select e.empno, e.ename, d.deptno, d.dname from emp e natural join dept d;


에러가 나고 말았습니다. 오류를 보아하니 Natural Join 에서 Join조건에 해당하는 컬럼은 테이블 별명을 적용하면 안된다는 것을 알게되었습니다.

 

  • Self Join
select * from (select empno, ename, mgr from emp)e , (select empno, ename from emp) x
where e.mgr = x.empno;

이런식으로 표현한 질의가 Self Join입니다.

 

  • OuterJoin

조금 전 위의 Self Join은 조건이 부합하지 않으면 아예 튜플조차 나오지 않습니다. 그럴 경우에 나타 낼 수 없는 조건 쪽에 (+)을 붙이면 조건에 맞지않는 튜플 까지 나옵니다.

select * from (select empno, ename, mgr from emp)e , (select empno, ename from emp) x
where e.mgr = x.empno(+);


조건에 부합하지 않는 KING까지 나오는 것을 확인 하실 수 있습니다.