ページング
★ページングの設計
1.クライアント側でのページング
メリット:通信回数を減らす
デメリット:初回のデータ表示が遅い、クライアント側のメモリが消費大
利用場面:通信遅延が深刻
2.サーバ側でのページング
メリット:データアクセス処理の回数を減らす
デメリット:データ量が多い場合に不適
利用場面:RDBMSがページングに支持しない、データ量が少ない
List list = (List) stmt.executeQuery("SELECT * FROM test ORDER BY id");
int count= list.size();
List subList= list.subList(10, 20);
3.DB側でのページング
メリット:性能が良い
デメリット:RDBMSごとに対応が必要、二回SQL発行(総件数の合計+ページング計算)
M番目からN行を取得
SQL Server
★IDが連続である
SELECT * FROM table WHERE ID BETWEEN M AND (M + N - 1)
★IDが連続ではない
--書き方1
SELETE TOP N *
FROM (SELECT TOP (M + N -1) * FROM table ORDER BY id) t
ORDER BY t.ID DESC
--書き方2 推薦
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY id) AS 'seq', table.* FROM table ) t
WHERE t.seq BETWEEN M AND (M + N - 1)
--書き方3 SQL Server 2012
SELECT *
FROM table ORDER BY id
OFFSET M ROWS FETCH NEXT N ROWS ONLY
SELECT DISTINCT TOP 10 *
FROM i
ORDER BY ..
-- 相当
SELECT *
FROM i
ORDER BY ..
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
Oracle
SELECT *
FROM (SELECT ROWNUM r, t1.* FROM table t1 WHERE ROWNUM <= M + N) t2
WHERE t2.r >= M
MySQL
SELECT * FROM table LIMIT M, N
★N行取得
SQL Server
SELECT TOP N id, first_name, last_name FROM person
Oracle
SELECT id, first_name, last_name FROM person WHERE ROWNUM <= N
※ROWNUM > N或いはROWNUM >= N(1除外)はNG
WHERE ROWNUM = 1 1行のみを取得
DB2
SELECT id, first_name, last_name FROM person FETCH FIRST N ROWS ONLY
MySql
SELECT id, first_name, last_name FROM person LIMIT N
PostgreSQL
SELECT id, first_name, last_name FROM person LIMIT N