오라클(DBMS)

오라클 11 버전이하, 페이징(paging) 방법

낙산암 2021. 12. 23. 16:55

mysql 에서는  limit 키워드가 존재하여, 간단히 페이징 처리가 가능함

 

• SELECT * FROM USER orders LIMIT 10;

• SELECT * FROM USER orders LIMIT 20;

• SELECT * FROM USER ORDERS LIMIT 10 OFFSET 0;

• SELECT * FROM USER ORDERS LIMIT 10 OFFSET 10;

 

오라클에서는 limit 가 지원되지 않아. rownum 으로 처리 가능

 

rownum : 조회후 순번을 매길때 사용

 

SELECT ROWNUM , a.*

FROM emp a

 

/*

ROWNUM은 의사 컬럼으로 참조만 될 뿐 데이터베이스에 저장되지 않는다.
(DESC 명령으로 보이지 않는다.)

SELECT절에 의해 추출되는 데이터(ROW)에 붙는 순번이다.
다시 말해 WHERE절까지 만족 시킨 자료에 1부터 붙는 순번이다.

WHERE절에 ROWNUM을 이용하여 조건을 주면 다른 조건을
만족시킨 결과에 대해 조건이 반영된다.

*/

 

아래와 같이 실행을 하면, 해당 데이터가 몇번째로 나오는줄 알수 있다.

SELECT rownum rn, bid, bname, btitle FROM mvc_board

 

/* ROWUNM 접근법

ROWUNM : SQL이 실행된 결과에 넘버링을 해줌..
Select 구문에서 ROWUNM이라는 변수를 사용해 해당 데이터가 몇번째로 나오는지 알수 있음.
ROWUNM은 테이블에는 존재하지 않고, 테이블에서 가져온 데이터를 이용해서 번호를 매김(순번) 

 

아래에서 10개만 빼와야 한다.
SELECT rownum rn, bid, bname, btitle FROM mvc_board where rownum <=10; 

아래는 나오지 않는다.
그 반드시 이유를 알아야 한다. 이것이 핵심이다.
SELECT rownum rn, bid, bname, btitle FROM mvc_board 
where rownum > 10 and rownum <=20 ;

먼저 오라클 쿼리의 순서를 읽혀야 한다
1. FROM/WHERE 절이 먼저 처리됩니다.
2. ROWNUM이 할당되고 FROM/WHERE 절에서 전달되는 각각의 출력 로우에 대해 증가(increment) 됩니다.
3. SELECT가 적용됩니다.
4. GROUP BY 조건이 적용됩니다.
5. HAVING이 적용됩니다.
6. ORDER BY 조건이 적용됩니다.

이유는 뭐다?
rownum은 당연히 1이 할당 될 것이다. 
select 하기전 아래가 먼저 실행한다.
rownum = 1  > 10 -> 여기서 부터 조건에 맞지 않으므로 아무것도 뿌리지 못한다.
한마디로 where 절부터 실행 되므로 여기에서 무효화가 되는 것이다.
이러한 이유로 SQL 작성시 ROWNUM 조건은 반드시 1이 포함되어야 한다.

SELECT rownum rn, bid, bname, btitle 
FROM mvc_board 
where rownum <=20 ;
20 개를 가져온다 실행이 된다.

20개를 가져오는 데는 성공했다.
이제 우리의 목표인 10번 부터 20번 까지 가져와야 한다.

아래는 공식이다.원리를 이해 하면 된다.
SELECT * FROM (
     SELECT ROWNUM AS RNUM, A.* FROM (
          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
    ) A WHERE ROWNUM <= {범위까지}
) WHERE RNUM > {범위부터};


         SELECT * FROM (
              SELECT ROWNUM AS RNUM, A.* FROM (
                       SELECT
                             *
                         FROM
                             mvc_board 
                         order by bGroup desc, bStep asc   
             ) A WHERE ROWNUM <= #{pageNum} * #{amount}
         ) WHERE RNUM > (#{pageNum}-1) * #{amount}


begin
  for i in 1..1000 loop
   insert into mvc_board (bId, bName, bTitle, bContent, bHit, bGroup, bStep, bIndent) values (mvc_board_seq.nextval, 'test' , '테스트', '테스트', 0, mvc_board_seq.currval, 0, 0);
  end loop;
end;

commit;

'오라클(DBMS)' 카테고리의 다른 글

SQL - JOIN 면접용  (0) 2022.03.14
DBMS 네이밍 관련 규칙  (0) 2022.01.13
오라클 쿼리(SQL) 예제 50문  (0) 2021.11.26
오라클 SQL-연습문제 - 고난도  (0) 2021.11.26
Oracle 11g 에서의 SCOTT 계정 생성  (0) 2021.11.19