self join/outer join

DBTool/Oracle 2009. 6. 30. 13:41

*.join
*-self join : 자기자신의 테이블에서 특정값호출위해 조인.

-- 사원번호, 사원명, 상사의 사원번호, 상사이름
ex)
select a.empno as "사원번호", a.ename as "사원명", b.mgr as "상사사번", b.ename as "상사이름"
from emp a, emp b
where a.empno = b.mgr


-- 사원명, 부서번호, 부서이름 조회
select e.ename, e.deptno, d.dname
from emp e join dept d on e.deptno=d.deptno

40번 부서 사람이 없으니, 조회 안됨.

*-outer join : (+) 연산자로 추가해서 반대쪽에 있는 데이터 null값도 보여줌(반대편 컬럼전체보여줌).
ex)
select e.ename, e.deptno, d.dname
from emp e, dept d
where e.deptno(+)=d.deptno
ex)
select e.ename, e.deptno, d.dname
from emp e full outer join dept d
on e.deptno=d.deptno(+)
ex)
select e.ename, e.deptno, d.dname
from emp e left outer join dept d
on e.deptno=d.deptno(+)
ex)
select e.ename, e.deptno, d.dname
from emp e right outer join dept d
on e.deptno(+)=d.deptno

--
--1.EQUI
--EMPNO, ENAME, DNAME, LOC
select e.empno, e.ename, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno;

--2.NATURAL
--EMPNO, ENAME, DNAME
select e.empno, e.ename, d.dname
from emp e natural join dept d;

--3.JON USING
--EMPNO, ENAME, DNAME, LOC
select e.empno, e.ename, d.dname, d.loc
from emp e join dept d using(deptno);

--4.JOIN ON
--EMPNO, JOB, SAL, DNAME, LOC
select e.empno, e.job, e.sal, d.dname, d.loc
from emp e join dept d on e.deptno=d.deptno;

--1.사원들의 이름, 부서번호, 부서이름
select e.ename, d.deptno, d.dname
from emp e join dept d on e.deptno=d.deptno;

--2.부서번호가 30인 사람들의 이름, 직급, 부서번호, 부서위치
select e.ename, e.job, e.deptno, d.loc
from emp e join dept d on e.deptno=d.deptno
where e.deptno=30;

--3.커미션 받는 사람이름, 커미션, 부서이름, 부서위치
select e.ename, e.comm, d.deptno, d.loc
from emp e join dept d on e.deptno=d.deptno
where comm is not null;

--4.DALLAS에서 근무하는 사원 이름, 직급, 부서번호, 부서이름
select e.ename, e.job, e.deptno, d.dname
from emp e join dept d on e.deptno=d.deptno
where d.loc='DALLAS';

--5.이름에 A가 들어가는 사원들의 이름과 부서이름
select e.ename, d.dname
from emp e join dept d on e.deptno=d.deptno
where e.ename like '%A%';

--6.사원이름과 직급, 급여, 급여등급
select e.ename, e.job, e.sal, s.grade
from emp e join salgrade s on e.sal between s.losal and s.hisal;

--7.사원이름, 부서번호, 해당사원과 같은부서에 근무하는 사원을 출력(self join)
select e.ename as "나의 이름", e.deptno, e1.ename as "그대의 이름"
from emp e join emp e1 on e.deptno=e1.deptno and e.ename<>e1.ename
order by e.ename asc;

Posted by 말없제이
,