쯔이's Dev

SUBQUERY(2) 본문

SQL/SUBQUERY

SUBQUERY(2)

jjhim531 2024. 8. 27. 14:59
반응형

 [ 인라인 뷰] 

FROM절에 서브쿼리를 작성하는 것

서브쿼리를 수행한 결과를 마치 테이블처럼 사용

* 인라인뷰를 주로 사용하는 예 >> TOP-N 분석 : 상위 몇개만 조회

 

*  ROWNUM

오라클에서 제공하는 컬럼, 조회된 순서대로 1부터 순번을 부여한다.

FROM절 서브쿼리 안에서 전체 결과값의 ORDER BY절이 먼저 수행되고

 

그 결과를 가지고 WHERE절에서 ROWNUM을 부여해야한다.

 

 < 주의 !! > 

* FROM절에서 ORDER BY를 먼저 하지 않고, ROWNUM을 먼저 하면 순번이 부여된 후 재정렬 되기 때문에 순서가 뒤죽박죽으로 나타난다. 

그러므로 ROWNUM은 반드시 인라인 뷰를 활용해줘야한다.

 

EX) 전 직원 중 급여가 가장 높은 5명의 이릅, 급여 조회(TOP 5)

SELECT
    ROWNUM,
    emp_name,
    salary
FROM
    (
        SELECT
            emp_name,
            salary
        FROM
            employee
        ORDER BY
            salary DESC
    )
WHERE
    ROWNUM <= 5;

 

 

   [ 순위를 매기는 함수 ( WINDOW  FUNCTION ) ]   

무조건 SELECT절에서만 사용

* 종류 : RANK( ) OVER(정렬기준),  DANSE_RANK( ) OVER(정렬기준)

 

 

 < RANK ( )   OVER ( 정렬기준 ) > 

동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위계산

(공동 1등이 있다면 그 다음은 3등)

SELECT
    emp_name,
    salary,
    RANK()
    OVER(
        ORDER BY
            salary DESC
    ) AS "순위"
FROM
    employee;

 

 < DANSE_RANK ( )   OVER ( 정렬기준 ) > 

동일한 순위가 있다고해도 그다음 등수를 무조건 1씩 증가

(공동 1등이 있어도 그 다음은 2등)

SELECT
    emp_name,
    salary,
    DENSE_RANK()
    OVER(
        ORDER BY
            salary DESC
    ) AS "순위"
FROM
    employee;


EX) 급여가 높은 순서대로 5명

SELECT
    *
FROM
    (
        SELECT
            emp_name,
            salary,
            RANK()
            OVER(
                ORDER BY
                    salary DESC
            ) AS "순위"
        FROM
            employee
    )
WHERE
    순위 <= 5;

 

728x90
반응형

'SQL > SUBQUERY' 카테고리의 다른 글

SUBQUERY(1)  (0) 2024.08.26