Oracle SQL

SQL 문제 10-11일차

JaeGuin 2021. 9. 29. 10:46

10일차

 

10일차는 Connect by 구문관련 내용입니다.


  MGR 컬럼은 해당 사원에 바로 한단계 위에 있는 관리자입니다. 즉 아래 예제를 설계로 표현 한 것 입니다. 가장 상위 김CEO는 상위 관리자가 없으므로 MGR에서 NULL로 표현합니다.

(실무에서는 NULL이 아닌 특정 값 넣음 인덱스 스캔 때문에)
  ex) CEO
          I       I

        한 부장      이 부장
I          I        I
김사원   이대리    권과장

 



1. 가장 상위 관리자(MGR)부터 하위 사원까지 관계를 아래 예제처럼 출력하세요?

ex) 최 상위 관리자(MGR)NULL

 

   

더보기

select 
mgr, empno, ename, 
sys_connect_by_path(ename, '>') as relation
from emp
start with mgr is null
connect by prior empno = mgr;

 

 

2. JONES(사원번호 7566)의 밑에 있는 사원을 모두 아래 예제처럼 출력하세요?

ex)

 

 

 

더보기

select 
mgr, empno, ename, 
sys_connect_by_path(ename, '>') as relation
from emp
start with mgr = '7566' 
connect by prior empno = mgr;

 

 

3. ALLEN (사원번호 7499)의 위에 있는 사원을 모두 아래 예제처럼 출력하세요?

ex)

 

 

 

더보기

select
mgr, empno, ename, 
sys_connect_by_path(ename, '>') as relation
FROM EMP
START WITH EMPNO = '7698'
CONNECT BY PRIOR MGR = EMPNO;

 

 

4. BLAKE (사원번호 7698), CLARK(사원번호 7782) 의 밑에 있는 사원을 모두 아래 예제처럼 출력하세요?

ex) DEPTH 도 표현

 

 

더보기

SELECT LEVEL depth,mgr, empno, ename, 
sys_connect_by_path(ename, '>') as relation
FROM emp
START WITH EMPNO in (7698, 7782) 
CONNECT BY PRIOR empno = mgr;

 

 

5. 가장 말단에 있는 사원을 모두 아래 예제처럼 출력하세요?

ex) 자기 밑에 아무도 없는 사원

 

 

더보기

SELECT LEVEL depth, mgr, empno, ename, 
sys_connect_by_path(ename, '>') as relation
FROM emp
WHERE CONNECT_BY_ISLEAF = 1
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR;

 

 

 

 

 

11일차

 

1. 직업이 판매원(SALESMAN)이 아닌 직업들의 월 급여 합계가 5000을 초과하는 직업 출력하시오.

 

 

더보기

select job, sum(sal)
from emp
where job not in ('SALESMAN') 
group by job
having sum(sal) > 5000;

 

 

2. 사원수가 3명 이상인 부서명과 사원수와 총 급여(SAL)를 출력하시오.

 

 

더보기

select d.dname, count(*)사원수, sum(sal)
from emp e, dept d
where e.deptno = d.deptno 
group by d.dname 
having count(*) >= 3;

 

 

3. 각 직업(JOB)별로 모든 사원의 급여(SAL) 1000을 넘는 직업의 급여(SAL) 합계를 출력하시오.

 

 

더보기

select job, sum(sal)
from emp
group by job
having job not in (select job from emp where sal < 1000);