SQL 標準無陣列式索引 student[10],但各資料庫提供分頁/行號查詢機制。
| 資料庫 | 語法範例 (取第 10 筆) | 說明 |
|---|---|---|
| MySQL / PostgreSQL / SQLite | SELECT * FROM students LIMIT 1 OFFSET 9; | LIMIT 1 取 1 筆,OFFSET 9 跳過前 9 筆 |
| SQL Server 2012+ | SELECT * FROM students ORDER BY id OFFSET 9 ROWS FETCH NEXT 1 ROWS ONLY; | 標準 SQL:2008 語法 |
| Oracle 12c+ | SELECT * FROM students ORDER BY id OFFSET 9 ROWS FETCH NEXT 1 ROWS ONLY; | 同 SQL Server |
| Oracle 11g 及之前 | SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT * FROM students ORDER BY id) a WHERE ROWNUM <= 10) WHERE rn = 10; | 子查詢 + ROWNUM |
| 通用窗口函數 | SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM students) WHERE rn = 10; | 支援 PostgreSQL, SQL Server, Oracle, DB2, MySQL 8.0+ |
-- T-SQL 範例
DECLARE cur CURSOR FOR SELECT * FROM students ORDER BY id;
OPEN cur;
FETCH NEXT FROM cur; -- 第 1 筆
-- 重複 FETCH 9 次得到第 10 筆
CLOSE cur; DEALLOCATE cur;
OFFSET 深分頁,改用 鍵值分頁:WHERE id > last_seen_id ORDER BY id LIMIT 10。ORDER BY 欄位有索引,否則全表掃描排序極慢。public Student getStudentByRowNum(int rowNum) { // 1-based
String sql = "SELECT * FROM students ORDER BY id LIMIT 1 OFFSET ?";
try (Connection c = ds.getConnection();
PreparedStatement ps = c.prepareStatement(sql)) {
ps.setInt(1, rowNum - 1);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) return mapRow(rs);
}
}
return null;
}
根據資料庫版本選擇適當語法,並注意分頁效能陷阱。