6.1 JOIN ~ Oracle 버전
※ 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; |