SQL

[SQL] 복습문제 - Join

breadz 2021. 7. 11. 18:57

Q_ 이름과 부서위치를 출력하시오!

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

 

Q_ 위의 결과를 다시 출력하는데 부서위치가 DALLAS인 사원들만 출력하시오!

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

 

Q_ 직업이 SALESMAN인 사원들의 이름과 월급과 직업과 부서위치를 출력하시오!

select e.ename, e.sal, e.job, d.loc, d.deptno
from emp e, dept d
where e.deptno = d.deptno
and e.job = 'SALESMAN';

// 아래와 같이 select절의 deptno에 테이블 alias를 안 적으면 값이 출력되지 않는다.

// e.deptno 헉은 d.deptno 둘중 아무거나 상관없다.

select ename, sal, job, loc, deptno
from emp e, dept d
where e.deptno = d.deptno
and job = 'SALESMAN';

 

Q_ 위의 결과를 다시 출력하는데 이름과 월급과 직업과 부서위치, 부서번호를 출력하시오!

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

 

Q_ 월급이 3000 이상인 사원들의 이름과 월급과 부서위치를 출력하시오!

select e.ename, e.sal, d.loc
from emp e, dept d
where e.deptno = e.deptno
and e.sal >= 3000;

 

Q_ 부서위치, 이름, 월급, 순위를 출력하는데 순위가 월급이 높은 순서대로 순위를 출력하시오!

※ rank : 중복 값에 대해 동일한 순위로 출력하고, 중복 값 다음 순위에 대해서는 앞에 중복된 값 개수만큼 제외하고(건너뛰고) 그 다음 순위를 출력한다.

※ dense_rank() (order by 컬럼) : 중복 값에 대해 동일한 순위로 출력하고, 중복 값 다음 순위에 대해서 다음 순위를 순차적으로 출력한다.

select loc, ename, sal
    , dense_rank() over (order by sal desc) rank
from emp e, dept d
where e.deptno = d.deptno;

 

Q_ 위의 결과를 다시 출력하는데 부서위치별로 각각 순위가 출력되게하시오 !

※ partition by : 전체 행에 순위를 출력하는게 아니라, ~~별 순위를 출력되게 하고 싶을 때

select loc, ename, sal
    , dense_rank() over (partition by loc order by sal desc) rank
from emp e, dept d
where e.deptno = d.deptno;

 

Q_ 부서명, 해당 부서에 근무하는 사원들의 이름을 가로로 출력하시오 !

※ listagg ( [합칠 컬럼명] , [구분자] ) within group(order by [정렬 컬럼명] ) 

select d.dname
    , listagg(e.ename, ' ') within group(order by ename)
from emp e, dept d
where e.deptno = d.deptno
group by d.dname;

 

Q_ emp 테이블과 salgrade 테이블을 서로 조인해서 이름, 월급, 등급(grade) 를 출력하시오 !

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

 

Q_ 부서위치, 부서위치별 토탈월급을 출력하시오 !

select loc, sum(e.sal)
from dept d, emp e
where e.deptno = d.deptno
group by loc;

 

Q_ 위의 결과를 다시 출력하는데 부서위치가 DALLAS 는 제외하고 출력하시오 !

select loc, sum(e.sal)
from dept d, emp e
where e.deptno = d.deptno
and loc != 'DALLAS'
group by loc;

 

Q_ 부서위치, 부서위치별 토탈월급을 출력하는데 가로로 출력하시오!

select 
     sum(decode(loc,'NEW YORK', sal)) as newyork
    ,sum(decode(loc,'DALLAS',sal)) as dallas
    ,sum(decode(loc,'CHICAGO', sal)) as chicago
    ,sum(decode(loc,'BOSTON', sal)) as boston
from emp e, dept d
where e.deptno = d.deptno;

vs

select loc,
     sum(decode(loc,'NEW YORK', sal)) as newyork
    ,sum(decode(loc,'DALLAS',sal)) as dallas
    ,sum(decode(loc,'CHICAGO', sal)) as chicago
    ,sum(decode(loc,'BOSTON', sal)) as boston
from emp e, dept d
where e.deptno = d.deptno
group by loc;

 

※ PIVOT 연산자 이용하기, from절에 subquery로 가상의 테이블을 만들어 놓은뒤 PIVOT이용

select *
from ( select d.loc, e.sal
       from emp e, dept d
       where e.deptno = d.deptno )
pivot ( sum(sal) for loc in ('NEW YORK','DALLAS','CHICAGO','BOSTON'));

 

Q_ 어느 부서위치에 사원이 배치 되지 않았는지 확인하시오 !

select d.deptno, nvl(count(e.ename),0)
from emp e, dept d
where e.deptno (+) = d.deptno
group by d.deptno
order by 1;

 

Q_ 양쪽에 다 아웃터 조인 사인을 써서 결과를 보게하려면 어떻게 해야하는가 ?

FULL OUTER JOIN : 양쪽 테이블의 모든 값을 출력

LEFT OUTER JOIN : 왼쪽 테이블의 모든 값을 출력

RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값을 출력

select *
from emp e full outer join dept d
on e.deptno = d.deptno;

 

Q_ 부서위치, 부서위치별 토탈월급을 출력하시오 !

select loc, sum(sal)
from emp e, dept d
where e.deptno(+) = d.deptno
group by loc;

 

Q_ 부서위치, 부서위치별 인원수를 출력하는데 사원이 없는 부서위치는 인원수가 0 으로 출력되게 하시오 !

select loc, nvl(count(e.ename),0) cnt
from emp e, dept d
where e.deptno (+) = d.deptno
group by loc;

 

Q_ 사원이름, 관리자의 이름을 출력하시오

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

 

Q_ 사원 이름, 관리자 이름을 출력하는데 관리자 보다 더 많은 월급을 받는 사원들만출력하시오 !

select e.ename 사원, m.ename 관리자
from emp e, emp m
where e.mgr = m.empno
and e.sal > m.sal;

 

Q_ 사원이름, 관리자 이름을 출력하는데 관리자보다 먼저 입사한 사원들만 출력하시오!

select e.ename 사원, m.ename 관리자
from emp e, emp m
where e.mgr = m.empno
and e.hiredate < m.hiredate;

 

Q_ 사원이름, 부서위치, 월급, 급여등급(grade) 를 출력하시오

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

 

Q_ 이름과 부서위치를 출력하는데 on 절을 사용한 조인으로 구현 하시오 !

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

 

Q_ 직업이 SALESMAN 인 사원들의 이름과 부서위치와 직업을 출력하시오 !(ON 절을 사용한 조인으로 수행)

select e.ename, d.loc, e.job
from emp e join dept d
on e.deptno = d.deptno
where e.job = 'SALESMAN';

 

Q_ 이름, 월급, 부서위치, 급여등급을 출력하는데 ON 절을 사용한 조인으로 수행하시오 !

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

 

Q_ 이름과 부서위치를 출력하는데 using 절을 사용한 조인으로 수행하시오 !

select e.ename, d.loc
from emp e join dept d using(deptno);

 

Q_ 이름과 부서위치를 출력하는데 naturual 조인으로 수행하시오 !

select e.ename, d.loc
from emp e natural join dept d;

 

Q_ 이름과 부서위치를 출력하는데 cross join 하시오

※ 한 쪽 테이블의 모든 행과 다른 테이블의 모든 행을 join함

select e.ename, d.loc
from emp e cross join dept d;

=> 56개의 행 출력

 

Q_ 이름과 부서위치를 출력하는 아래의 SQL 을 1999 ANSI 문법으로 수행하시오 !

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

select e.ename, d.loc
from emp e right outer join dept d
on e.deptno = d.deptno ;

 

'SQL' 카테고리의 다른 글

[SQL] 복습문제 - Subquery  (0) 2021.07.12
[SQL][TIL] GROUP BY, ROLLUP, CUBE  (0) 2021.07.09
[SQL][TIL] 집합 연산자  (0) 2021.07.09
[SQL][TIL] ADSQL문제풀이  (0) 2021.07.09
[SQL][TIL] exists 연산자 (where절의 in 연산자 대신 사용)  (0) 2021.07.08