Programming/SQL

[Oracle] 인라인 뷰(INLINE-VIEW) / RANK() OVER / DENSE_RANK() OVER / ROWNUM

Jayna. 2024. 2. 20. 14:36
728x90

 

 

[Oracle] 서브쿼리 (SUBQUERY) / 다중열 서브쿼리 / 다중행 다중열 서브쿼리

서브쿼리 구분 서브쿼리를 수행한 결과값이 몇 행 몇 열이냐에 따라서 분류 - 단일행 (단일열) 서브쿼리 - 다중행 (단일열) 서브쿼리 - (단일행) 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여

jaynarecord.tistory.com

 

인라인 뷰(INLINE-VIEW)

FROM절에서 서브쿼리 제시

-- 보너스 포함 연봉이 3000만원 이상인 사원들 조회
SELECT EMP_ID
     , EMP_NAME
     , (SALARY + (SALARY * NVL(BONUS, 0))) * 12 "보너스 연봉"
     , DEPT_CODE
  FROM EMPLOYEE
 WHERE (SALARY + (SALARY * NVL(BONUS, 0))) * 12 >= 30000000;
 
-- 인라인 뷰 사용
SELECT EMP_NAME
  FROM (SELECT EMP_ID
             , EMP_NAME
             , (SALARY + (SALARY * NVL(BONUS, 0))) * 12 "보너스 연봉"
             , DEPT_CODE
          FROM EMPLOYEE)
 WHERE "보너스 연봉" >= 30000000;

 

인라인 뷰를 주로 사용하는 예

TOP-N : 데이터베이스 상에 존재하는 자료 중 최상위 몇 개 자료를 보기 위해 사용

-- 급여가 가장 높은 직원을 조회
-- 전 직원 중 급여가 가장 높은 5명
-- ROWNUM : 오라클에서 제공해주는 컬럼, 조회된 순서대로 1부터 ... 순번을 부여해 줌
SELECT ROWNUM               --실행순서
     , EMP_NAME
     , SALARY               --3
  FROM EMPLOYEE             --1
 WHERE ROWNUM <= 5          --2
 ORDER BY SALARY DESC;      --4
 
SELECT ROWNUM
     , EMP_NAME
     , SALARY
  FROM (SELECT EMP_NAME
             , SALARY
          FROM EMPLOYEE
         ORDER BY SALARY DESC)
 WHERE ROWNUM <= 5;
728x90

 

순위를 매기는 함수

SELECT절에서만 사용 가능

RANK() OVER(정렬기준)

: 공동1위가 2명이라고 한다면 그 다음 순위는 3위

DENSE_RANK() OVER

: 공동1위가 2명이라 해도 그 다음 순위는 2위

-- 급여가 높은 순서대로 순위매기기
SELECT EMP_NAME
     , SALARY
     , RANK() OVER(ORDER BY SALARY DESC) 순위
  FROM EMPLOYEE;

SELECT EMP_NAME
     , SALARY
     , DENSE_RANK() OVER(ORDER BY SALARY DESC) 순위
  FROM EMPLOYEE;
  
-- 5위까지만 조회
SELECT EMP_NAME
     , SALARY
     , RANK() OVER(ORDER BY SALARY DESC) 순위
  FROM EMPLOYEE
 WHERE RANK() OVER (ORDER BY SALARY DESC) <= 5;
 -- 오류: RANK() OVER 은 SELECT절에서만 사용가능
 
 SELECT *
   FROM (SELECT EMP_NAME
              , SALARY
              , DENSE_RANK() OVER(ORDER BY SALARY DESC) 순위
           FROM EMPLOYEE)
  WHERE 순위 <= 5;
728x90