73·模块十四:数据库操作进阶

SQL 基础查询(SELECT, INSERT, UPDATE, DELETE)

databasessqlcrud

第 73 课 - SQL 基础查询(SELECT, INSERT, UPDATE, DELETE)

学习目标

通过本课的学习,你将能够:

  1. 掌握使用 SELECT 语句从数据库中查询和检索数据。
  2. 学会使用 INSERT INTO 语句向数据库中添加新的数据记录。
  3. 理解并使用 UPDATE 语句修改数据库中的现有数据。
  4. 掌握使用 DELETE 语句安全地从数据库中删除数据。
  5. 理解 WHERE 子句在 SELECTUPDATEDELETE 操作中的核心作用。

核心概念

在上一课中,我们学习了如何用 Python 创建并连接 SQLite 数据库和表。但空表没有意义,我们需要学会如何"操作"里面的数据。这些操作通常被简称为 CRUD(Create, Read, Update, Delete),对应的 SQL 语句正是本课要学习的:

  • INSERT (Create):添加数据。
  • SELECT (Read):读取数据。
  • UPDATE (Update):更新数据。
  • DELETE (Delete):删除数据。

SELECT 查询是最常用的 SQL 命令,用于从数据库中"选取"我们需要的数据。你可以把它想象成一个功能强大的"搜索"或"筛选"工具。

INSERT INTO 用于向表中添加一行(记录)新数据。

UPDATE 用于修改表中已经存在的数据。使用时必须非常小心,通常需要配合 WHERE 子句来指定要更新哪一行,否则可能会意外修改整张表的数据!

DELETE 用于从表中删除一行或多行数据。与 UPDATE 一样,使用 WHERE 子句来精确指定要删除的目标至关重要,否则可能导致整个表的数据被清空。

WHERE 子句是这四个操作中的"条件过滤器"。它允许你指定一个条件,SQL 语句只会对满足该条件的行生效。

代码示例

下面是一个完整的 Python 脚本,演示了如何使用 sqlite3 模块执行基础的 SQL CRUD 操作。

import sqlite3

# 1. 连接到数据库(如果不存在则创建)
conn = sqlite3.connect('school.db')
cursor = conn.cursor()

# 2. 创建一个'学生'表(如果不存在)
cursor.execute('''
    CREATE TABLE IF NOT EXISTS students (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER,
        grade TEXT
    )
''')
print("表创建成功(或已存在)。")

# 3. INSERT INTO - 添加数据
print("\n--- 插入数据 ---")
# 插入一条记录
cursor.execute("INSERT INTO students (name, age, grade) VALUES (?, ?, ?)", ('张三', 18, '高三'))
# 使用 executemany 插入多条记录(推荐用于插入多条数据)
students_to_add = [
    ('李四', 19, '高三'),
    ('王五', 17, '高二'),
    ('赵六', 18, '高三')
]
cursor.executemany("INSERT INTO students (name, age, grade) VALUES (?, ?, ?)", students_to_add)
print("成功插入4条学生记录。")

# 4. SELECT - 查询数据
print("\n--- 查询所有数据 ---")
cursor.execute("SELECT * FROM students")
all_students = cursor.fetchall() # 获取所有结果
for student in all_students:
    print(student)

print("\n--- 带条件的查询(WHERE)---")
cursor.execute("SELECT name, grade FROM students WHERE grade = ?", ('高三',))
high_school_seniors = cursor.fetchall()
print("高三学生姓名和班级:")
for s in high_school_seniors:
    print(s)

print("\n--- 排序查询(ORDER BY)---")
cursor.execute("SELECT * FROM students ORDER BY age DESC") # 按年龄降序
sorted_students = cursor.fetchall()
print("按年龄降序排列的学生:")
for s in sorted_students:
    print(s)

# 5. UPDATE - 更新数据
print("\n--- 更新数据(UPDATE)---")
# 将学生'张三'的年龄更新为19岁
cursor.execute("UPDATE students SET age = ? WHERE name = ?", (19, '张三'))
print(f"已更新'张三'的年龄。受影响的行数:{cursor.rowcount}")

# 更新后查询确认
cursor.execute("SELECT * FROM students WHERE name = ?", ('张三',))
updated_student = cursor.fetchone()
print("更新后的张三信息:", updated_student)

# 6. DELETE - 删除数据
print("\n--- 删除数据(DELETE)---")
# 删除年龄为17岁的学生(这里会删除王五)
cursor.execute("DELETE FROM students WHERE age = ?", (17,))
print(f"已删除年龄为17岁的学生。受影响的行数:{cursor.rowcount}")

# 删除后查询所有数据
print("\n删除后的所有学生数据:")
cursor.execute("SELECT * FROM students")
remaining_students = cursor.fetchall()
for s in remaining_students:
    print(s)

# 7. 提交事务并关闭连接
conn.commit() # 非常重要!将INSERT/UPDATE/DELETE操作永久保存到数据库
conn.close()
print("\n数据库连接已关闭。操作完成!")

实践练习

请在 school.db 数据库的 students 表中进行以下操作(可以直接修改或新建一个 .py 文件运行)。

  1. 基础查询

    • 写一条 SQL 语句,查询出所有年龄大于 18 岁的学生的姓名和班级。
    • 预期输出:一个包含符合条件学生姓名和班级的列表。
  2. 更新操作

    • 写一条 SQL 语句,将学生"赵六"的班级更新为"高三"。
    • 执行后,请再次查询"赵六"的信息以确认更改是否成功。
  3. 挑战题

    • 写一个程序,先删除所有班级为"高三"的学生。
    • 然后,向表中插入一条新的记录:姓名为"周七",年龄为20,班级为"大一"。
    • 最后,查询并打印出表中的所有数据,验证操作结果。

常见错误

  1. 忘记 WHERE 子句:这是最危险的错误!在 UPDATEDELETE 中省略 WHERE,会导致更新或删除整张表的所有数据。务必再三检查你的 WHERE 条件。

    # 危险!这将把所有学生的年龄都改成 20
    cursor.execute("UPDATE students SET age = 20")  # 缺少 WHERE
    
  2. SQL 语法错误:SQL 关键字拼写错误、表名或字段名写错、引号不匹配等。

    # 错误示例:INSERT INTO 写错了,字符串缺少闭合引号
    cursor.execute("INSTERT INTO students (name) VALUES ('张三") # 多处错误
    
  3. 忘记提交事务 (conn.commit())INSERTUPDATEDELETE 操作默认是在一个"事务"中进行的。只有执行 commit() 命令,这些更改才会真正被保存到数据库文件。如果在关闭连接前忘记 commit(),那么你所做的所有更改都会丢失!

  4. 数据类型不匹配:例如,尝试将一个字符串(如 'abc')插入到 INTEGER 类型的列中,可能会导致错误或意外的 0 值。

小结

本课我们学习了 SQL 的四大核心数据操作语句:

  • SELECT:使用 SELECT 列名 FROM 表名 WHERE 条件来查询数据。* 代表所有列。
  • INSERT:使用 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2) 来插入新数据。
  • UPDATE:使用 UPDATE 表名 SET 列名=新值 WHERE 条件来更新数据。务必谨慎使用 WHERE
  • DELETE:使用 DELETE FROM 表名 WHERE 条件来删除数据。务必谨慎使用 WHERE

WHERE 子句是进行精确数据操作(读、改、删)的生命线。在实际编程中,尤其是在处理用户提供的数据时,永远使用参数化查询(如 ? 占位符) 来防止 SQL 注入攻击,而不是使用字符串拼接来构建 SQL 语句。

掌握这些基础操作,意味着你已经拥有了与关系型数据库进行交互的最核心能力。下一课,我们将深入探讨 Python 的 DB-API 规范以及如何更安全、更高效地管理数据库连接。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「Python DB-API 与数据库连接」 以巩固所学知识。