오라클 11g 방식

 

-- 급여 내림차순 정렬하여 5개 건너 뛰고 3개 출력 ( 즉 6~8번 출력)

SELECT * FROM (
    SELECT ROWNUM rnum, tb.* FROM(
        SELECT empNo, name, sal
        FROM emp
        ORDER BY sal DESC
    ) tb WHERE ROWNUM <= 8
)WHERE rnum >= 6;

 

-- 20개 건너뛰고 10개 출력

SELECT * FROM (
    SELECT ROWNUM rnum, tb.* FROM(
        SELECT empNo, name, sal
        FROM emp
        ORDER BY sal DESC
    ) tb WHERE ROWNUM <= 30
)WHERE rnum >= 21;

오라클 12c 이상

-- 급여 상위 10%

SELECT empNo, name, sal
FROM emp
ORDER BY sal DESC
FETCH FIRST 10 PERCENT ROWS ONLY;

-- 남자 중 급여 내림차순 정렬하여 11번에서 16번까지 출력

SELECT empNo, name, sal
FROM emp
WHERE MOD(SUBSTR(rrn, 8, 1), 2) = 1
ORDER BY sal DESC
OFFSET 10 ROWS FETCH FIRST 6 ROWS ONLY;

-- 여자 중 급여 내림차순 정렬하여 상위 10% 출력

SELECT empNo, name, sal
FROM emp
WHERE MOD(SUBSTR(rrn, 8, 1), 2) = 0
ORDER BY sal DESC
FETCH FIRST 10 PERCENT ROWS ONLY;

 

MY-SQL 페이징 처리

-- 20개 건너뛰고 10개 출력

SELECT empNo, name, sal
FROM emp
ORDER BY sal DESC
LIMIT 20, 10;

 

 

좀 더 알아보기 >>

더보기
CREATE TABLE board (
    num  NUMBER,
    name VARCHAR2(30) NOT NULL,
    subject VARCHAR2(500) NOT NULL,
    content VARCHAR2(4000) NOT NULL,
    reg_date DATE DEFAULT SYSDATE,
    hitCount NUMBER DEFAULT 0,
    CONSTRAINT board_num_pk PRIMARY KEY(num)
);

CREATE SEQUENCE board_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
NOCACHE;

CREATE OR REPLACE PROCEDURE pInsertBoard
IS
    vName  VARCHAR2(30);
    vSubject  VARCHAR2(500);
    vContent VARCHAR2(4000);
BEGIN
    FOR  n  IN  1 .. 200000 LOOP
        vName := '자바' || (CHR(TRUNC(DBMS_RANDOM.VALUE * 26)+65)) || (CHR(TRUNC(DBMS_RANDOM.VALUE * 26)+65)) || (CHR(TRUNC(DBMS_RANDOM.VALUE * 26)+65)) || (CHR(TRUNC(DBMS_RANDOM.VALUE * 26)+65)) || (CHR(TRUNC(DBMS_RANDOM.VALUE * 26)+65));
        vSubject := '제목-' || (TRUNC(DBMS_RANDOM.VALUE * 1000000000)+1) || '-입니다.';
        vContent := '게시글 내용-' || (TRUNC(DBMS_RANDOM.VALUE * 100000000)+1) || '-입니다.';
        
        INSERT INTO board(num, name, subject, content, reg_date, hitCount) VALUES
            (board_seq.NEXTVAL, vName, vSubject, vContent, SYSDATE, 0);
    END LOOP;
    COMMIT;
END;
/

EXEC pInsertBoard;
EXEC pInsertBoard;
EXEC pInsertBoard;
EXEC pInsertBoard;
EXEC pInsertBoard;

테이블 생성 및 시퀀스 생성, 임의의 게시글 10만개를 넣음

 

-- 오라클 12c 방식으로 페이징 처리

SELECT num, name, subject, reg_date, hitCount
FROM board
ORDER BY num DESC
OFFSET 1000 ROWS FETCH FIRST 10 ROWS ONLY;

1000개 넘기고 10개 출력, 걸린시간 0.18

 

-- 오라클 11g 방식으로 페이징 처리

SELECT num, name, subject, reg_date, hitCount FROM (
    SELECT ROWNUM rnum, tb.* FROM (
        SELECT num, name, subject, reg_date, hitCount
        FROM board
        ORDER BY num DESC
    ) tb WHERE ROWNUM <= 1010
) WHERE rnum >= 1001;

위와 같이 1000개 넘기고 10개 출력, 걸린시간 0.002

 

∴ 페이징 처리의 효율을 위해서는 결국 11g 방식으로 해야된다.

 

'쌍용강북교육센터 > 8월' 카테고리의 다른 글

0818_Oracle : IDENTITY COLUMN  (2) 2021.08.19
0818_Oracle : INVISIBLE, VISIBLE COLUMN  (1) 2021.08.19
0818_Oracle : 정규식  (0) 2021.08.19
0817_Oracle : SYNONYM 시노님  (2) 2021.08.18
0817_Oracle : SEQUENCE 시퀀스  (1) 2021.08.18

+ Recent posts