Oracle DBA/SQL

076 서브 쿼리 사용하기 6 (FROM절의 서브 쿼리)

Nuez 2023. 7. 5. 14:53
반응형
서브쿼리 사용 가능 서브쿼리 이름
SELECT O Scalar Subquery
FROM O In line view
WHERE O Subquery
GROUP BY X X
HAVING O Scalar Subquery
ORDER BY O Scalar Subquery

 


문제 407. (복습문제) 이름, 월급, 월급에 대한 순위를 출력하시오. 

SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS 순위
FROM emp;


문제 408. 위의 결과에서 순위가 3등과 5등을 출력하시오. 

SELECT ename, sal
FROM (SELECT ename, sal, 
            DENSE_RANK() OVER (ORDER BY sal DESC) AS 순위 
            FROM emp)
WHERE 순위 IN (3,5);

* FROM절의 서브쿼리를 써야 위의 결과를 볼 수 있음. 


SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS 순위 
FROM emp
WHERE 순위 IN (3,5);

위와 같은 경우는 오류 발생. 

수행 순서를 생각해보면 where가 먼저 실행되므로, 순위가 아직 설정되지 않은 상태에서 filter할 수 없기 때문임. 

 


 문제 409. 직업, 이름, 월급, 순위를 출력하는데 순위가 직업별로 각각 월급이 높은 순서대로 순위를 부여하시오.

SELECT job, ename, sal, DENSE_RANK() OVER (PARTITION BY job ORDER BY sal DESC) AS 순위
FROM emp;


문제 410. 위의 결과를 다시 출력하는데 순위가 1등인 사원들만 출력하시오. 

SELECT *
FROM (SELECT job, ename, sal, 
            DENSE_RANK() OVER (PARTITION BY job
            ORDER BY sal DESC)AS 순위
        FROM emp)
WHERE 순위 = 1;


문제 411. (복습문제) 사원 테이블의 평균 월급을 출력하시오.

SELECT avg(sal)
FROM emp;


문제 412. 사원테이블에서 이름, 월급, 사원 테이블의 평균월급을 출력하시오.

SELECT ename, sal, avg(sal) over () 평균월급
from emp;


문제 413. 위의 결과를 다시 출력하는데 자기의 월급이 사원 테이블의 평균월급보다 더 큰 사원들만 출력하시오.

SELECT *
FROM (SELECT ename, sal, AVG(sal) OVER () 평균월급
        FROM emp)
WHERE sal > 평균월급;


문제 414. (복습문제) 부서번호, 부서번호별 평균 월급을 출력하시오.

SELECT deptno, AVG(sal)
FROM emp
GROUP BY deptno;


문제 415. 부서번호, 이름, 월급, 자기가 속한 부서번호의 평균월급을 출력하시오.

SELECT deptno, ename, sal, AVG(sal) OVER (PARTITION BY deptno) AS 부서평균
FROM emp;


문제 416. 위의 결과를 다시 출력하는데, 자기의 월급이 자기 부서번호의 평균월급보다 더 큰 사원들만 출력하시오. 

SELECT *
FROM (SELECT deptno, ename, sal,
            AVG(sal) OVER (PARTITION BY deptno) AS 부서평균
        FROM emp)
WHERE sal > 부서평균;


문제 417. 위의 결과를 보다 느린 SQL로 작성하시오. (튜닝 전 버전)

SELECT E.deptno, E.ename, E.sal, V.부서평균
FROM emp E , (SELECT deptno, AVG(sal) 부서평균
		FROM emp
		GROUP BY deptno) V
WHERE E.deptno = V.deptno AND E.sal > V.부서평균
ORDER BY 1;


emp 테이블을 2번 스캔하기 때문에 416과 같은 결과를 반환하지만 더 느리다.