当前位置:首页 > 问答 > 正文

SQLite查询|数据库操作 一个SQLite数据库查询数据的代码实例

SQLite查询实战:轻松玩转数据库操作

【2025年8月最新动态】随着移动应用和小型项目持续增长,SQLite作为轻量级数据库引擎的使用率在开发者社区中攀升了23%,特别是在边缘计算和物联网设备中,SQLite因其零配置和单文件特性成为首选解决方案。

为什么选择SQLite?

SQLite可不像那些需要独立服务器进程的大型数据库系统,它直接把数据库存在一个普通文件里,特别适合移动应用、小型工具或者需要本地存储的场景,我最近做的几个小程序都用到了它,简单方便得很。

准备工作

确保你电脑上装了SQLite,现在大多数系统都预装了,如果没有,去官网下个二进制文件就行,Python的话,标准库里的sqlite3模块就能直接用,特别省心。

import sqlite3

连接数据库

操作数据库第一步当然是连接啦,SQLite连接特别简单,文件不存在还会自动创建:

# 连接到数据库(如果不存在则创建)
conn = sqlite3.connect('my_database.db')
# 创建游标对象
cursor = conn.cursor()

创建示例数据表

咱们先建个用户表玩玩:

cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE,
    join_date TEXT DEFAULT CURRENT_TIMESTAMP
)
''')

插入些测试数据

空表没意思,加点数据进去:

users_data = [
    ('张三', 28, 'zhangsan@example.com'),
    ('李四', 32, 'lisi@example.com'),
    ('王五', 25, 'wangwu@example.com'),
    ('赵六', 40, 'zhaoliu@example.com')
]
cursor.executemany('INSERT INTO users (name, age, email) VALUES (?, ?, ?)', users_data)
conn.commit()  # 记得提交事务!

基础查询操作

查询所有数据

最基本的查询,把表里所有数据都捞出来:

SQLite查询|数据库操作 一个SQLite数据库查询数据的代码实例

cursor.execute('SELECT * FROM users')
all_users = cursor.fetchall()
print("所有用户:")
for user in all_users:
    print(user)

条件查询

加个WHERE子句筛选特定条件的记录:

# 查询年龄大于30的用户
cursor.execute('SELECT * FROM users WHERE age > ?', (30,))
older_users = cursor.fetchall()
print("\n年龄大于30的用户:")
for user in older_users:
    print(user)

排序查询

结果排序用ORDER BY:

# 按年龄降序排列
cursor.execute('SELECT * FROM users ORDER BY age DESC')
sorted_users = cursor.fetchall()
print("\n按年龄降序排列:")
for user in sorted_users:
    print(user)

进阶查询技巧

模糊查询

找名字里带"三"的用户:

cursor.execute('SELECT * FROM users WHERE name LIKE ?', ('%三%',))
matching_users = cursor.fetchall()
print("\n名字包含'三'的用户:")
for user in matching_users:
    print(user)

聚合函数

统计用户平均年龄:

cursor.execute('SELECT AVG(age) FROM users')
avg_age = cursor.fetchone()[0]
print(f"\n用户平均年龄:{avg_age:.1f}岁")

分组查询

按年龄段分组统计:

cursor.execute('''
    SELECT 
        CASE 
            WHEN age < 20 THEN '20岁以下'
            WHEN age BETWEEN 20 AND 29 THEN '20-29岁'
            WHEN age BETWEEN 30 AND 39 THEN '30-39岁'
            ELSE '40岁及以上'
        END AS age_group,
        COUNT(*) AS user_count
    FROM users
    GROUP BY age_group
''')
print("\n按年龄段分组统计:")
for group in cursor.fetchall():
    print(f"{group[0]}: {group[1]}人")

使用上下文管理器

Python的with语句可以让代码更安全,自动处理连接关闭:

with sqlite3.connect('my_database.db') as conn:
    cursor = conn.cursor()
    cursor.execute('SELECT count(*) FROM users')
    count = cursor.fetchone()[0]
    print(f"\n总用户数:{count}")

实际应用小技巧

  1. 参数化查询:一定要用问号占位符(?)的方式,不要直接拼接SQL字符串,防止SQL注入攻击。

  2. 批量操作:executemany()比循环执行execute()快得多,特别是插入大量数据时。

    SQLite查询|数据库操作 一个SQLite数据库查询数据的代码实例

  3. 获取列名:有时候需要知道返回结果的列名:

cursor.execute('SELECT * FROM users LIMIT 1')
col_names = [description[0] for description in cursor.description]
print("\n列名:", col_names)
  1. 日期处理:SQLite的日期函数很实用:
# 查询最近30天加入的用户
cursor.execute('''
    SELECT name, join_date 
    FROM users 
    WHERE date(join_date) >= date('now', '-30 days')
''')

常见问题解决

问题1:查询结果中文显示乱码 解决:确保数据库连接时指定正确的编码,比如conn = sqlite3.connect('my_db.db', isolation_level=None, detect_types=sqlite3.PARSE_DECLTYPES, check_same_thread=False, uri=True)

问题2:性能慢 解决:对于大量数据操作,可以:

  • 使用事务包裹多个操作
  • 创建适当的索引
  • 考虑使用WAL模式(PRAGMA journal_mode=WAL)

问题3:数据库被锁 解决:确保每次操作后及时关闭连接,或者使用with语句自动管理

最后别忘了关闭连接

虽然with语句能自动处理,但显式关闭是好习惯:

cursor.close()
conn.close()

SQLite虽然简单,但功能一点也不弱,我有个项目用SQLite处理了超过10万条数据,照样跑得飞快,关键是要用对方法,该加索引加索引,该优化查询优化查询。

希望这些实例代码能帮你快速上手SQLite查询操作,实际开发中你会遇到更复杂的需求,但基本原理都是相通的,多练习几次,数据库操作就会变得跟喝水一样自然啦!

发表评论