코드저장소/sql

MySQL,ORACLE(오라클),MSSQL 2005(+) 페이징쿼리 작성하여 동작시켜보기

개발로짜 2014. 10. 27. 06:00

이번에는 게시판에 주로 사용되는 페이징 쿼리에 대해서 DBMS별로 포스팅해보도록 하겠습니다.


DBMS 종류는 MySQL,ORACLE,MSSQL 2005(+) 을 작성해보도록 하겠습니다.


페이징쿼리를 돌리기위한 테이블 + 데이터가 필요하겠죠?


기존에 데이터가 많이 쌓여있는 테이블로 테스트 하셔도 무관하나

 저같은 경우에는 예를들기위해 임의로 테이블 생성을 해보도록 하겠습니다.



테스트테이블 생성 및 데이터추가

create table board(
  idx int,
  title varchar(100)
);
insert into board
values(1,'제목1');
insert into board
values(2,'제목2');
insert into board
values(3,'제목3');
insert into board
values(4,'제목4');
insert into board
values(5,'제목5');
insert into board
values(6,'제목6');
insert into board
values(7,'제목7');
insert into board
values(8,'제목8');
insert into board
values(9,'제목9');
insert into board
values(10,'제목10');
insert into board
values(11,'제목11');
insert into board
values(12,'제목12');
insert into board
values(13,'제목13');
insert into board
values(14,'제목14');
insert into board
values(15,'제목15');
insert into board
values(16,'제목16');
insert into board
values(17,'제목17');
insert into board
values(18,'제목18');
insert into board
values(19,'제목19');
insert into board
values(20,'제목20');


테이블 생성 후 임의로 20개정도의 데이터 등록을 하였습니다.

생성된 데이터를 이용하여 DBMS별로 페이징 쿼리를 작성해보도록 하겠습니다.



MySQL 페이징쿼리

MySQL은 LIMIT 문법을 사용하여 페이징 쿼리를 만들 수 있습니다.


MySQL LIMIT 쿼리

SELECT 컬럼1,컬럼2, ... 컬럼 n
FROM 테이블명
LIMIT 시작INDEX, 뽑을데이터수

위 쿼리를 이용하여 페이징 쿼리를 만들 수 있습니다.


※ limit 다음 2개의 값을 작성해주게 되어있는데 하나만 작성 할 경우 뽑힌 data의 정의된 수 만큼 출력이 됩니다.



기존의 뽑힌 데이터를 가지고 페이지당 5개씩 출력해보도록 하겠습니다.



-- 1페이지
SELECT *
FROM board
LIMIT 0,5;
-- 2페이지
SELECT *
FROM board
LIMIT 5,5;
-- 3페이지
SELECT *
FROM board
LIMIT 10,5;
-- 4페이지
SELECT *
FROM board
LIMIT 15,5;



각 페이지별 페이징 쿼리를 작성 후 실행해 보았습니다.



MySQL 페이징쿼리 실행결과






게시판의 페이지라고 생각하고 페이지별로 데이터를 출력해보았습니다.



오라클 페이징 쿼리

오라클 경우 ROWNUM을 이용하여 페이징쿼리를 만들 수 있습니다.



ORACLE ROWNUM 쿼리

-- 1 페이지
SELECT *
  FROM (
        SELECT rownum rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 1 AND  5;
-- 2 페이지
SELECT *
  FROM (
        SELECT rownum rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 6 AND  10;
-- 3 페이지
SELECT *
  FROM (
        SELECT rownum rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 11 AND  15;
-- 4 페이지
SELECT *
  FROM (
        SELECT rownum rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 16 AND  20;


작성한 쿼리를 실행해보도록 하겠습니다.



오라클 페이징쿼리 실행 결과




MSSQL 2005버전 이상 페이징 쿼리


마지막으로 MSSQL 페이징 쿼리에 대하여 작성해보도록 하겠습니다.

MSSQL 2005부터 지원이 되는 ROW_NUMBER() 함수를 이용하여 페이징 처리를 하도록 하겠습니다.


※ MSSQL 2000버전에는 ROW_NUMBER() 지원이 되지 않습니다. 2000버전은 TOP 절을 이용하여 페이징 처리를 해줍니다.


    MS-SQL 2000에 대한 페이징쿼리를 다음에 포스팅 하도록 하겠습니다.



MS-SQL 2005(+) ROW_NUMBER() OVER() 페이징 쿼리

-- 1 페이지
SELECT *
  FROM (
        SELECT row_number() over(order by idx) rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 1 AND  5;
-- 2 페이지
SELECT *
  FROM (
        SELECT row_number() over(order by idx) rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 6 AND  10;
-- 3 페이지
SELECT *
  FROM (
        SELECT row_number() over(order by idx) rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 11 AND  15;
-- 4 페이지
SELECT *
  FROM (
        SELECT row_number() over(order by idx) rnum,idx,title
          FROM board
        ) board
 WHERE rnum BETWEEN 16 AND  20;


MSSQL 2005 페이징쿼리 실행 결과는 ORACLE 페이징쿼리결과와 동일하므로 생략하였습니다.




by 개발로짜