Itwill 학습내용 정리/1. SQL

6.1 JOIN ~ Oracle 버전

cannonvirus 2019. 4. 25. 16:43


※ EMP, DEPT, SALGRADE 테이블 구조

emp
dept
salgrade


※ JOIN

equi join outer join non equi join self join

 

1. equi join(inner join) ~ 연결고리가 "="인 조인문법

 # 문제 94. 이름, 월급, 부서명, 직업, 부서번호를 출력하는데 월급이 1000~3000 사이만 출력하시오.

 

select e.ename, e.sal, d.dname, e.job, e.deptno

  from emp e, dept d

  where e.deptno = d.deptno and e.sal between 1000 and 3000;

 # 문제 95. 아래와 같이 출력되게 하시오.

 

select d.loc, listagg(e.ename,',') within group (order by e.ename asc) 명단

  from emp e, dept d

  where e.deptno = d.deptno

  group by d.loc;

 # 문제 96. 지역별 월급의 합을 다음과 같이 출력하시오.

 

 - pivot

select *

  from ( select d.loc 지역, e.sal 총월급 from emp e, dept d where e.deptno = d.deptno )

  pivot( sum(총월급) for 지역 in ('NEW YORK' as "NEW YORK",  'DALLAS' as DALLAS,  'CHICAGO' as CHICAGO) );

 

 - decode

select sum( decode (d.loc, 'NEW YORK', e.sal, null) ) "NEW YORK", sum( decode (d.loc, 'DALLAS', e.sal, null) ) DALLAS, sum( decode (d.loc, 'CHICAGO', e.sal, null) ) CHICAGO

  from emp e, dept d

  where e.deptno = d.deptno;

 

2. outer join ~ equi join으로는 볼 수 없는 결과를 보기 위해

 # 문제 97. 부서위치, 부서위치별 총월급을 출력하는데 BOSTON도 출력하고 총월급이 높은 곳부터 출력되게 하시오.

 

select d.loc, sum(e.sal)

  from emp e, dept d

  where e.deptno(+) = d.deptno

  group by d.loc

  order by 2 desc;

 

- 마지막 order by 2 desc; 대신에 order by 2 desc nulls last;를 사용하면 null값이 맨 아래로 이동하게 된다.

 

 

3. non equi join

 # 문제 98. 이름, 월급, 등급을 출력하시오. (emp, salgrade 조인)

 

select e.ename, e.sal, s.grade

  from emp e, salgrade s

  where e.sal between s.losal and s.hisal;

 # 문제 99. 등급, 등급별 해당하는 사원들의 이름을 가로로 출력하시오.

 

select s.grade 등급, listagg(e.ename, ', ') within group (order by e.ename) 명단

  from emp e, salgrade s

  where e.sal between s.losal and s.hisal

  group by s.grade;

 # 문제 100. 아래와 같이 출력해 보시오.

 

select s.grade 등급, listagg(e.ename || '(' || d.loc || ')',  ', ') within group (order by e.ename) 명단

  from emp e, salgrade s, dept d

  where ( e.sal between s.losal and s.hisal ) and ( e.deptno = d.deptno )

  group by s.grade;

 

4. self join

 # 문제 101. 사원이름과 직속상사(mgr) 이름을 출력하시오.

 

select 사원.ename 사원, 관리자.ename 관리자

  from emp 사원, emp 관리자

  where 사원.mgr = 관리자.empno;

 # 문제 102. 다음과 같은 결과를 출력해보시오.

 

select 관리자.ename||'('||관리자.sal||')' MGR, listagg(사원.ename||'('||사원.sal||')',', ') within group (order by 사원.sal desc) 사원

  from emp 사원, emp 관리자

  where 사원.mgr = 관리자.empno

  group by 관리자.ename, 관리자.sal

  order by 관리자.sal desc, 관리자.ename;