사용자 도구

사이트 도구


사이드바

기술문서:레퍼런스:쿼리:응용:paging_query

문서의 이전 판입니다!


Paging Query

물리명 논리명 타입 KEY
일련번호 sn 숫자 PK
제목 title 문자
내용 content 문자

-- MySQL/MariaDB & MSSQL & PostgreSQL
CREATE TABLE ex_paging (
	sn BIGINT NOT NULL PRIMARY KEY,
	title VARCHAR(100) NOT NULL,
	content TEXT NOT NULL
);

-- Oracle/Tibero
CREATE TABLE ex_paging (
	sn NUMBER NOT NULL PRIMARY KEY,
	title VARCHAR(100) NOT NULL,
	content CLOB NOT NULL
);

INSERT INTO ex_paging (sn, title, content) VALUES (1, '제목 1', '내용 1');
INSERT INTO ex_paging (sn, title, content) VALUES (2, '제목 2', '내용 2');
INSERT INTO ex_paging (sn, title, content) VALUES (3, '제목 3', '내용 3');
INSERT INTO ex_paging (sn, title, content) VALUES (4, '제목 4', '내용 4');
INSERT INTO ex_paging (sn, title, content) VALUES (5, '제목 5', '내용 5');
INSERT INTO ex_paging (sn, title, content) VALUES (6, '제목 6', '내용 6');
INSERT INTO ex_paging (sn, title, content) VALUES (7, '제목 7', '내용 7');
INSERT INTO ex_paging (sn, title, content) VALUES (8, '제목 8', '내용 8');
INSERT INTO ex_paging (sn, title, content) VALUES (9, '제목 9', '내용 9');
INSERT INTO ex_paging (sn, title, content) VALUES (10, '제목 10', '내용 10');
INSERT INTO ex_paging (sn, title, content) VALUES (11, '제목 11', '내용 11');
INSERT INTO ex_paging (sn, title, content) VALUES (12, '제목 12', '내용 12');
INSERT INTO ex_paging (sn, title, content) VALUES (13, '제목 13', '내용 13');
INSERT INTO ex_paging (sn, title, content) VALUES (14, '제목 14', '내용 14');
INSERT INTO ex_paging (sn, title, content) VALUES (15, '제목 15', '내용 15');
INSERT INTO ex_paging (sn, title, content) VALUES (16, '제목 16', '내용 16');
INSERT INTO ex_paging (sn, title, content) VALUES (17, '제목 17', '내용 17');
INSERT INTO ex_paging (sn, title, content) VALUES (18, '제목 18', '내용 18');
INSERT INTO ex_paging (sn, title, content) VALUES (19, '제목 19', '내용 19');
INSERT INTO ex_paging (sn, title, content) VALUES (20, '제목 20', '내용 20');

MySQL/MariaDB

-- MySQL 5.0.12 이상/MariaDB 5.1 이상
SELECT
	t.*, @ROWNUM AS "_total_count_", (@ROWNUM - t._rownum_ + 1) AS "_no_"
FROM
	(SELECT
		p.*, @ROWNUM := @ROWNUM + 1 AS "_rownum_"
	FROM
		(
		-- ↑↑↑ 페이징 쿼리 ↑↑↑
		SELECT
			*
		FROM
			ex_paging
		ORDER BY
			sn DESC
		-- ↓↓↓ 페이징 쿼리 ↓↓
		LIMIT 18446744073709551615) p
		, (SELECT @ROWNUM := 0) r
	) t
ORDER BY
	t._rownum_ ASC
-- 1 페이지
LIMIT 10 OFFSET 0
-- 2 페이지
-- LIMIT 10 OFFSET 10
;

MSSQL

-- MSSQL 2005 이상
SELECT
	t.*, (t._total_count_ - t._rownum_ + 1) AS "_no_"
FROM
	(SELECT
		p.*, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS "_rownum_", COUNT(*) OVER() AS "_total_count_"
	FROM
		(
		-- ↑↑↑ 페이징 쿼리 ↑↑↑
		SELECT TOP (99.999) PERCENT
		-- SELECT TOP (9223372036854775807)
			*
		FROM
			ex_paging
		ORDER BY
			sn DESC
		-- ↓↓↓ 페이징 쿼리 ↓↓↓
		) p
	) t
WHERE
	-- 1 페이지
	t._rownum_ BETWEEN 1 AND 10
	-- 2 페이지
	-- t._rownum_ BETWEEN 11 AND 20
;

Oracle/Tibero

-- Oracle 9i 이상/Tibero 4 이상
SELECT
	t.*, ("_total_count_" - "_rownum_" + 1) AS "_no_"
FROM
	(SELECT
		p.*, ROWNUM AS "_rownum_", COUNT(*) OVER() AS "_total_count_"
	FROM
		(
		-- ↑↑↑ 페이징 쿼리 ↑↑↑
		SELECT
			*
		FROM
			ex_paging
		ORDER BY
			sn DESC
		-- ↓↓↓ 페이징 쿼리 ↓↓↓
		) p
	) t
WHERE
	-- 1 페이지
	"_rownum_" BETWEEN 1 AND 10
	-- 2 페이지
	-- "_rownum_" BETWEEN 11 AND 20
;

PostgreSQL

-- PostgreSQL 8.4 이상
SELECT
	t.*, (t._total_count_ - t._rownum_ + 1) AS "_no_"
FROM
	(SELECT
		p.*, ROW_NUMBER() OVER() AS "_rownum_", COUNT(*) OVER() AS "_total_count_"
	FROM
		(
		-- ↑↑↑ 페이징 쿼리 ↑↑↑
		SELECT
			*
		FROM
			ex_paging
		ORDER BY
			sn DESC
		-- ↓↓↓ 페이징 쿼리 ↓↓
		) p
	) t
-- 1 페이지
LIMIT 10 OFFSET 0
-- 2 페이지
-- LIMIT 10 OFFSET 10
;