首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 按行號存取資料:LIMIT/OFFSET、ROW_NUMBER() 與游標方案

     編輯:程式設計疑難解答

SQL 標準無陣列式索引 student[10],但各資料庫提供分頁/行號查詢機制。

主流資料庫語法對照

資料庫語法範例 (取第 10 筆)說明
MySQL / PostgreSQL / SQLiteSELECT * 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 欄位有索引,否則全表掃描排序極慢。
  • 若頻繁需隨機存取第 N 筆,考慮在應用層快取或建立物化視圖/摘要表。

應用層封裝範例 (Java JDBC)

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;
}

根據資料庫版本選擇適當語法,並注意分頁效能陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved