SQL - 페이징의 ROWNUM , TOP-N(ROWNUM + 인라인 뷰)

songmin jeon·2023년 11월 23일
0

1. 페이징 이란?

  • 페이징 : 데이터를 조금씩 보여주는 기술
    → 한꺼번에 많은 양의 데이터가 노출되어 서버에 부담이 가지 않도록 방지하는 기술 (아래 예시 참고)

1.1. ROWNUM

ROWNUM 은 테이블의 튜플(행)에 임시로 부여되는 일련번호

  • WHERE 조건에 ROWNUM을 사용하면 출력되는 튜플(행) 개수 제한 가능!

1.1.1. 사용하기 불편한 ROWNUM..!

예시) 그림에서 3번 빨간 동그라미의 정보만 보고 싶음

--3번 내용을 보기위해 다음과 같이 변경
SELECT ROWNUM AS RN, 직원ID, 이름, 연봉, 부서ID
FROM 직원
WHERE ROWNUM =  3;
--아래는 결과...


3번째 결과를 보기 위해선!?
=> 인라인뷰 사용 !


1.2. TOP-N 기술 (인라인뷰)

참고URL : 링크

상위 n개의 데이터를 추출하는 쿼리

ROWNUM 개념과 인라인뷰 개념을 조합해서
상위 N개의 특정 데이터만 뽑아내는 기술

1.2.1. TOP-N 기술 (예시)

연봉이 높은 5명만 출력할때 코드를 다음과 같이 작성하면 문제가 발생한다. 문제점을 파악하고 해결하시오.

SELECT  *
FROM 직원
WHERE 연봉 IS NOT NULL
AND ROWNUM <= 5
ORDER BY 연봉 DESC;

[문제점] : ORDER BY 보다 WHERE 문법(AND)이 먼저 실행되기 때문!

[해결방안] 정렬한 후에 5개의 행을 가져옴.
→ ORDER BY가 실행된 테이블에 WHERE를 적용!! (TOP-N)

  • 인라인뷰 방식 채택
    ‘뷰테이블’ 자리에 SQL 문법을 넣고 소괄호로 묶어주면
    → TOP-N 기술!!
SELECT *
FROM (SELECT  *
      FROM 직원
      WHERE 연봉 IS NOT NULL
      ORDER BY 연봉 DESC)
WHERE ROWNUM <= 5;
  • 연봉이 높은 5명으로 출력된다.

1.2.2. 실습문제 (TOP-N 기술 응용)

-- 1.  직원 중에 연봉이 낮은 하위 3명의 모든 정보를 출력해주세요.
-- (연봉NULL인 대상 제외)
SELECT *
FROM    (SELECT  *
         FROM     직원  
         WHERE   연봉 IS NOT NULL
         ORDER BY 연봉 ASC)
WHERE ROWNUM <= 3;


-- 2. 직원들 중에 가장 최근에 입사한 3명의 모든 정보를 출력해주세요.
--(입사일자가 NULL인 대상은 제외)
SELECT  *
FROM    (SELECT  *
         FROM    직원
         WHERE   입사일시 IS NOT NULL
         ORDER BY 입사일시 DESC)
WHERE   ROWNUM <= 3;

1.3 페이징 기술구현

페이징 구현전 SQL 테이브 생성과 데이터 넣기!

---게시판 테이블 만들고 데이터 100만건 넣기 
CREATE TABLE 게시판 ( 
게시판번호 NUMBER(9) PRIMARY KEY , 
작성자       VARCHAR2(50) NOT NULL , 
게시물내용 VARCHAR2(4000) NOT NULL  , 
작성일시 DATE   NOT NULL 
) ;

INSERT INTO 게시판
SELECT LEVEL                                -- 게시판번호
        , '아이디' || MOD(LEVEL , 10000)     -- 작성자 
        , '아이디' || 
           MOD(LEVEL , 10000) || 
           '님이 작성하신 게시물입니다. 이 게시물은 게시판 번호가 ' 
           || LEVEL 
           || '입니다'                       -- 게시물내용 
      , TO_DATE('20000101') + LEVEL         --2022년 1월1일부터 하루씩 게시물이 입력되는 것
  FROM DUAL
CONNECT BY LEVEL <=1000000;                 --100만건의 데이터 입력 

COMMIT; 
  1. 다음과 같이 생성된 데이터의 ROWNUM을 20번째까지 출력할 수 있다.
SELECT *
FROM (SELECT *
      FROM 게시판
   	  ORDER BY 작성일시 DESC )
WHERE ROWNUM <= 20 ;
  1. 페이징 기술 구현을 위해 다음 21번 부터 40번까지 출력하려면?
    => 2번 인라인뷰를 하면 된다.
-- 페이징 21번부터 40번까지 출력
SELECT *
FROM( SELECT ROWNUM AS RN, A.*
      FROM ( SELECT *
             FROM 게시판    
             ORDER BY 작성일시 DESC ) A
      WHERE ROWNUM <= 40 )
WHERE RN >= 21 ;

=> 21번부터 40번가지 출력됨 !

3. 41번 부터 60번까지 출력은?

--41 ~ 60번 출력
SELECT *
FROM( SELECT ROWNUM AS RN, A.*
      FROM (SELECT *
      		FROM 게시판    
            ORDER BY 작성일시 DESC ) A
            WHERE ROWNUM <= 60)
WHERE RN >= 41 ;
--41 숫자와 60번 숫자를 변경해주면 된다.

profile
제가 한 번 해보겠습니다.

0개의 댓글