数据库分页查询详解

各类资料学习下载合集

​https://pan.quark.cn/s/8c91ccb5a474​

在处理大型数据集时,分页查询是一种常用的技术,可以有效地提高数据检索的效率和用户体验。分页查询允许开发者将结果集分成多个部分,并只返回其中的一部分。在本篇博客中,我们将详细介绍数据库分页查询的原理,并通过Python和SQLite实现多个示例,帮助您理解如何使用分页查询。

1. 分页查询的基本概念

分页查询的目的是将庞大的数据库结果集分割成更小的块(页面),以便用户能够逐步浏览数据。这种方式不仅提高了响应速度,也减少了内存使用。

1.1 分页的基本参数

在进行分页查询时,通常需要两个参数:

  • 页码(page number):表示要返回的页数。
  • 每页记录数(page size):每一页中返回多少条记录。

2. 使用SQLite进行分页查询

我们将使用Python的​​sqlite3​​模块创建一个数据库,并实现分页查询。

2.1 创建数据库和表

首先,创建一个SQLite数据库及其表。我们以员工表为例。

import sqlite3

def create_database():
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS employees (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            position TEXT NOT NULL,
            salary REAL NOT NULL
        )
    ''')
    connection.commit()
    cursor.close()
    connection.close()

if __name__ == "__main__":
    create_database()

2.2 插入数据

接下来,我们将插入一些员工数据以便进行分页查询。

def insert_employee(name, position, salary):
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    cursor.execute('INSERT INTO employees (name, position, salary) VALUES (?, ?, ?)', (name, position, salary))
    connection.commit()
    cursor.close()
    connection.close()

if __name__ == "__main__":
    employees = [
        ('Alice', 'Manager', 90000),
        ('Bob', 'Developer', 70000),
        ('Charlie', 'Designer', 60000),
        ('David', 'Developer', 75000),
        ('Eve', 'Manager', 95000),
        ('Frank', 'Designer', 65000),
        ('Grace', 'Developer', 72000),
        ('Heidi', 'Manager', 80000),
        ('Ivan', 'Intern', 30000),
        ('Judy', 'Intern', 25000)
    ]
    
    for emp in employees:
        insert_employee(*emp)

2.3 实现分页查询

现在,我们将实现一个分页查询的函数,接受页码和每页记录数作为参数。

def fetch_employees_paginated(page, page_size):
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    
    offset = (page - 1) * page_size  # 计算偏移量
    cursor.execute('SELECT * FROM employees LIMIT ? OFFSET ?', (page_size, offset))
    rows = cursor.fetchall()
    
    cursor.close()
    connection.close()
    return rows

if __name__ == "__main__":
    page_number = 1  # 页码
    page_size = 3    # 每页记录数

    print(f"第 {page_number} 页的员工数据:", fetch_employees_paginated(page_number, page_size))

2.4 进行多页查询

我们可以通过改变页码来获取不同的页面数据。

if __name__ == "__main__":
    page_size = 3  # 每页记录数

    for page_number in range(1, 5):  # 查询前4页
        print(f"第 {page_number} 页的员工数据:", fetch_employees_paginated(page_number, page_size))

3. 运行结果

运行此完整的程序将产生类似以下的输出:

第 1 页的员工数据: [(1, 'Alice', 'Manager', 90000.0), (2, 'Bob', 'Developer', 70000.0), (3, 'Charlie', 'Designer', 60000.0)]
第 2 页的员工数据: [(4, 'David', 'Developer', 75000.0), (5, 'Eve', 'Manager', 95000.0), (6, 'Frank', 'Designer', 65000.0)]
第 3 页的员工数据: [(7, 'Grace', 'Developer', 72000.0), (8, 'Heidi', 'Manager', 80000.0), (9, 'Ivan', 'Intern', 30000.0)]
第 4 页的员工数据: [(10, 'Judy', 'Intern', 25000.0)]

4. 综合示例

将所有代码整合到一个完整的程序中,以便更好地理解和使用。

import sqlite3

def create_database():
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS employees (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            position TEXT NOT NULL,
            salary REAL NOT NULL
        )
    ''')
    connection.commit()
    cursor.close()
    connection.close()

def insert_employee(name, position, salary):
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    cursor.execute('INSERT INTO employees (name, position, salary) VALUES (?, ?, ?)', (name, position, salary))
    connection.commit()
    cursor.close()
    connection.close()

def fetch_employees_paginated(page, page_size):
    connection = sqlite3.connect('company.db')
    cursor = connection.cursor()
    offset = (page - 1) * page_size  # 计算偏移量
    cursor.execute('SELECT * FROM employees LIMIT ? OFFSET ?', (page_size, offset))
    rows = cursor.fetchall()
    cursor.close()
    connection.close()
    return rows

if __name__ == "__main__":
    create_database()
    employees = [
        ('Alice', 'Manager', 90000),
        ('Bob', 'Developer', 70000),
        ('Charlie', 'Designer', 60000),
        ('David', 'Developer', 75000),
        ('Eve', 'Manager', 95000),
        ('Frank', 'Designer', 65000),
        ('Grace', 'Developer', 72000),
        ('Heidi', 'Manager', 80000),
        ('Ivan', 'Intern', 30000),
        ('Judy', 'Intern', 25000)
    ]
    
    for emp in employees:
        insert_employee(*emp)

    page_size = 3  # 每页记录数

    for page_number in range(1, 5):  # 查询前4页
        print(f"第 {page_number} 页的员工数据:", fetch_employees_paginated(page_number, page_size))

猜你喜欢

转载自blog.csdn.net/weixin_41489908/article/details/146442533
今日推荐