오라클 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 |