3 minute read

Updated:

여러 테이블의 데이터를 조인해서 출력하기 1(EQUI JOIN)

예제) 사원 테이블과 부서테이블을 조인해서 이름과 부서위치를 출력하세요.

select e.ename, d.loc, e.deptno 
from emp e, dept d -- 테이블 별칭
where e.deptno = d.deptno;
  • 테이블명을 명시하는 게 쿼리 성능이 좋다. 불필요하게 검색하는 시간이 없어지므로.

예제2) 직업이 SALESMAN인 사원들의 이름과 직업과 부서위치를 출력하세요

select e.ename, e.job, d.loc 
from emp e, dept d -- 테이블 별칭
where e.deptno = d.deptno and e.job = 'SALESMAN';

예제3) DALLAS에서 근무하는 사원들의 이름과 월급과 부서위치를 출력하세요

select e.ename, e.sal, d.loc 
from emp e, dept d -- 테이블 별칭
where e.deptno = d.deptno and d.loc = 'DALLAS';

여러 테이블의 데이터를 조인해서 출력하기 2(NON EQUI JOIN)

  • 공통된 컬럼이 없는 경우 조인하는 방법

예제) 사원 테이블과 급여 테이블과 조인하여 이름과 월급과 월급에 대한 등급을 출력하세요

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

예제2) 급여등급이 4등급인 사원들의 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하세요.

select e.ename, e.sal
from emp e, salgrade s 
where e.sal between s.losal and s.hisal and s.grade=4
order by e.sal desc;

여러 테이블의 데이터를 조인해서 출력하기 3(OUTER JOIN)

  • +는 데이터가 모자란 테이블에 붙인다.

예제) 이름과 부서위치를 출력하는데 다음과 같이 BOSTON도 출력되게 하세요.

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

예제) 사원 테이블 전체에 이름과 부서위치를 출력하는데 JACK도 출력되게하시오.

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

여러 테이블의 데이터를 조인해서 출력하기4(SELF JOIN)

  • 자기 자신의 테이블과 조인하는 방식

예제) 직업이 SALESMAN인 사원들의 사원이름과 직업을 출력하고 관리자 이름과 관리자의 직업을 출력하세요

select 사원.ename as 사원, 사원.job as 직업, 관리자.ename as 관리자, 관리자.job as 직업
from emp 사원, emp 관리자 
where 사원.mgr = 관리자.empno;

예제2) 예제 결과를 다시 출력하는데 관리자인 사원들보다 더 많은 월급을 받는 사원들의 데이터만 출력하세요.

  • sql문의 실행 순서 상 where절에는 컬럼 별칭을 쓸 수 없다.
select 사원.ename as 사원, 사원.sal as 사원월급, 관리자.ename as 관리자, 관리자.sal as 관리자월급
from emp 사원, emp 관리자 
where 사원.mgr = 관리자.empno
and 사원.sal > 관리자.sal;

여러 테이블의 데이터를 조인해서 출력하기 5(ON절)

  • 오라클의 where절 위치에 join 조건을 on절 작성한다.

예제) on절을 사용한 조인문법으로 결과를 출력하세요

select e.ename, e.sal, e.job, d.loc
from emp e join dept d
on (e.deptno = d.deptno) --조인조건
where e.job = 'SALESMAN'; --검색조건

예제2) 월급이 1000에서 3000인 사이인 사원들의 이름과 월급과 부서위치를 on절을 사용한 조인문법으로 출력하세요.

select e.ename, e.sal, e.job, d.loc
from emp e join dept d
on (e.deptno = d.deptno) --조인조건
where e.sal between 1000 and 3000; --검색조건
  • 조인문법을 크게 오라클 조인 문법과 1999 ansi 조인문법(미국 국립 표준 협회)이 있다.
    • 오라클 조인 문법 : equi join, non equi join, outer join, self join
    • 1999 ansi 조인문법 : on절을 사용한 조인

여러 테이블의 데이터를 조인해서 출력하기 5(USING절)

예제) using절을 사용한 조인문법으로 결과를 출력하세요.

select e.ename, e.sal, e.job, d.loc
from emp e join dept d
using (deptno)
where e.job = 'SALESMAN';
  • using절에는 테이블 별칭을 쓰지 않는다.

예제2) using절을 사용한 조인문법으로 부서위치가 DALLAS인 사원들의 이름과 월급과 부서위치를 출력하세요.

select e.ename, e.sal, d.loc
from emp e join dept d
using (deptno)
where d.loc='DALLAS';

여러 테이블의 데이터를 조인해서 출력하기 6(NATURAL JOIN)

select e.ename as 이름, e.job as 직업, e.sal as 월급 , d.loc as 부서위치
from emp e natural join dept d
where e.job = 'SALESMAN';

예제) 직업이 SALESMAN이고 부서번호가 30번인 사원들의 이름과 직업과 월급과 부서위치를 출력하세요.

select e.ename as 이름, e.job as 직업, e.sal as 월급 , d.loc as 부서위치
from emp e natural join dept d
where e.job = 'SALESMAN' and deptno=30;

여러 테이블의 데이터를 조인해서 출력하기 7(LEFT/RIGHT OUTER JOIN)

select e.ename, d.loc 
from emp e right outer join dept d
on (e.deptno = d.deptno);
//where e.deptno(+) = d.deptno;  같다.

예제)이름과 직업, 월급과 부서위치를 출력하는데 사원 테이블에 JACK도 출력될 수 있도록 하세요.

--1999 ansi

select e.ename, e.job, e.sal, d.loc
from emp e left outer join dept d
on (e.deptno = d.deptno);

--오라클
select e.ename, e.job, e.sal, d.loc
from emp e, dept d
where e.deptno = d.deptno(+);

여러 테이블의 데이터를 조인해서 출력하기 8(FULL OUTER JOIN)

  • A와 B 테이블에 각각 한쪽에 데이터가 없고, 한쪽에 데이터가 있는 경우 둘다 출력하고 싶다면? 오라클에서 아래와 같은 문법은 사용할 수 있다.
  • 따라서 ansi 문법을 사용해야 한다.
select e.ename, e.job, e.sal, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno(+);

//ORA-01468: outer-join 테이블은 1개만 지정할  있습니다

예제) JACK도 출력되고 부서위치의 BOSTON도 출력되게 하세요.

select e.ename, e.job, e.sal, d.loc
from emp e full outer join dept d
on (e.deptno = d.deptno);

예제2) 직업이 ANALYST이거나 부서위치가 BOSTON인 사원들의 이름과 직업과 월급과 부서위치를 출력하는데 full outer 조인을 사용하여 출력하세요.

select e.ename, e.job, e.sal, d.loc
from emp e full outer join dept d
on (e.deptno = d.deptno)
where e.job = 'ANALYST' or d.loc = 'BOSTON';