Programming/SQL

SQL 조인 - 오라클 조인

해치 2020. 5. 6. 17:51
728x90

1. equi join

2. non equi join

3. outer join

4. self join


조인이란?

여러개의 테이블의 컬럼들을 하나의 결과로 볼 때 사용하는 SQL 문법

 

1. equi join - 조인 조건에서 사용하는 연산자가 = 인 경우

예제) 이름, 부서위치를 출력하시오

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

-> where절에 조인 조건을 준다. 

 

만약에 조인 조건을 주지 않는다면

하나씩 다 조인한다.

 

2. non equi join - 조인하려는 두 테이블 사이의 연결고리 연산자가 =이 아닌경우의 조인

 

예제) 이름, 월급, 등급을 출력하시오

 

-> 등급 테이블 생성

create table salgrade
( grade   number(10),
  losal   number(10),
  hisal   number(10) );
 
insert into salgrade  values(1,700,1200);
insert into salgrade  values(2,1201,1400);
insert into salgrade  values(3,1401,2000);
insert into salgrade  values(4,2001,3000);
insert into salgrade  values(5,3001,9999);
 
commit;

-> SQL 쿼리

select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;

 

문제) 위의 결과에서 급여 등급이 5등급인 사원들만 출력하시오

select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal
  and s.grade =5;

-> where절에 조인조건 쓴 후에 조건 쓰면 된다.

 

※ 여러개의 테이블 조인하기

dept -------------------- emp -------------------- salgrade

          조인연결고리               조인연결고리

             ↓                                 ↓

 e.deptno = d.deptno    e.sal between s.losal and s.hisal

테이블 n개를 조인하려면 조인 연결고리가 (n-1)개 있어야 한다.

 

문제) 이름, 월급, 부서위치, 급여등급을 출력하시오

select e.ename, e.sal, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal;

 

 

3. outer join - equi join으로는 볼 수 없는 결과를 볼 때 사용하는 조인 문법

 

-> dept테이블 확인

select *
from dept;

-> 이름과 부서위치를 출력해라

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

=> dept 테이블에 BOSTON이 존재하지만 BOSTON은 출력되지 않음

emp 테이블에는 deptno가 40번 부서번호를 갖는 사원이 없어서 조인이 안됐다.

따라서 BOSTON에 부서가 있다는 정보도 출력되지 않았다.

 

BOSTON이 나오게 하려면?

select e.ename, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno;

우측이 outer join한 결과

부족한 쪽 조인조건데 (+) 표시를 해주면 된다.

 

4. self join - 자기 자신의 테이블과 조인하는 문법

예제) 사원 테이블의 조직도를 확인하시오

select empno, ename, mgr
from emp;

mgr은 직속상사의 사원번호

7566은 FORD의 관리자인 JONES에게는 사원번호이지만

          JONES의 부하인 FORD에게는 MGR번호이다.

 

문제) 사원이름, 그 사원의 관리자의 이름을 출력하시오

select e.ename, m.ename as 관리자
from emp e, emp m
where e.mgr = m.empno;