解码 SQL UPDATE 命令

理解 SQL UPDATE 命令:数据库记录更新指南

作为一名开发者,掌握关系型数据库的操作至关重要。SQL(结构化查询语言)因其易学性和直观的语法而成为初学者的理想选择。SQL允许你创建数据库对象并查询关系型数据库表。

你可以通过执行SQL查询来实现数据库表中记录的创建、读取、更新和删除,这些操作通常被统称为CRUD操作。

为了更新存储在数据库表中的记录,可以使用SQL中的UPDATE命令。

本教程将涵盖以下内容:

  • UPDATE 命令的语法结构
  • 如何基于特定条件或多个逻辑组合的条件来更新记录
  • 执行SQL UPDATE命令时需要注意的常见事项

SQL UPDATE 命令的语法

SQL UPDATE命令的基本语法如下:

UPDATE 表名
SET 列名 = 新值
WHERE 条件;

上述查询将更新所有满足指定条件的记录中的指定列。

要同时更新多个列,可以使用如下格式的SQL UPDATE命令:

UPDATE 表名
SET 列1 = 新值1, 列2 = 新值2, ..., 列k = 新值k
WHERE 条件;

在关系型数据库中:

  • 表代表一个实体。
  • 表的每一行代表一个记录,也就是实体的具体实例。
  • 列也称为字段或属性。在本教程中,”列”和”字段”这两个术语可以互换使用。

SQL UPDATE 命令使用示例

接下来,我们通过一些实例来演示UPDATE命令的用法。

准备工作

在开始实践之前,请确保你已完成以下准备:

  • 本教程使用SQLite数据库。你需要安装SQLite和SQLite数据库浏览器 (推荐)。当然,你也可以使用MySQL或PostgreSQL。
  • 如果你想复现示例,你需要安装Python和Faker Python包

创建包含数据的数据库表

如果你想跟着本教程进行练习,可以运行以下代码片段来创建并连接到名为 customer_db.db 的客户数据库。这里,我们使用Faker Python库生成虚拟数据插入到客户表中:

# main.py
import sqlite3
from faker import Faker
import random

# 连接数据库
conn = sqlite3.connect('customer_db.db')
cur = conn.cursor()

# 创建数据表
cur.execute('''CREATE TABLE customers (
                  customerID INTEGER PRIMARY KEY,
                  name TEXT,
                  city TEXT,
                  email TEXT,
                  num_orders INTEGER,
                  discount INTEGER DEFAULT 2)''')

# 创建Faker对象
fake = Faker()
Faker.seed(42)

for _ in range(15):
    name = fake.name()
    city = fake.city()
    domain = fake.domain_name()
    email = f"{name[:2]}.{city[:2]}@{domain}"
    num_orders = random.choice(range(200))
    cur.execute('INSERT INTO customers (name, city, email, num_orders) 
    VALUES (?,?,?,?)', (name,city,email,num_orders))

# 提交事务
conn.commit()
cur.close()
conn.close()

为了使以上代码顺利运行,请确保你的Python版本为3.7或更高,并已安装Faker库。可以使用pip命令安装:

pip install faker

如果已经存在一个可以连接和查询的数据库表,你也可以直接使用它。

执行第一个SQL查询

客户表包含以下字段:

  • customerID:主键,用于唯一标识每条客户记录。
  • name:客户的姓名。
  • city:客户所在的城市。
  • email:客户的电子邮件地址。
  • num_orders:客户的订单数量。
  • discount:折扣百分比,默认为2。由于discount字段有默认值,在插入数据时不需要显式赋值。

你可以使用SQLite命令行客户端或SQLite数据库浏览器来执行查询和查看结果。

我将展示SQLite数据库浏览器的输出,因为它更易于理解。

运行以下查询获取customers表中的所有记录:

SELECT * FROM customers;

在实际应用中,应尽量避免使用SELECT *,但由于本例中只有15条记录和有限的字段,所以可以使用。

根据单一条件更新记录

现在我们已经了解了表的结构,接下来通过一些UPDATE查询来更新特定条件的记录。

注意:在执行UPDATE语句后,我们将运行SELECT * FROM customers来查看更新后的记录。

更新单个字段

首先,更新customerID为7的记录的city字段:

UPDATE customers
SET city='Codeshire'
WHERE customerID=7;

然后从客户表中选取所有列和记录:

SELECT * FROM customers;

可以看到,customerID为7的Danielle Ford的city字段已更新。

更新多个字段

在之前的例子中,我们仅更新了customerID为7的记录的city字段。我们也可以使用学习到的语法来更新多个字段。

这里,我们将更新customerID为1的记录的cityemail字段:

UPDATE customers
SET city='East Carlisle',email="[email protected]"
WHERE customerID=1;

接着运行:

SELECT * FROM customers;

输出如下:

更新多条记录

由于我们使用了customerID(唯一标识客户记录的主键),所以到目前为止执行的查询都只更新了一条记录。

然而,如果表中的多条记录都满足给定条件,SQL UPDATE命令将会更新所有匹配的记录。

例如,考虑以下查询:

UPDATE customers
SET discount=10
WHERE num_orders > 170;

现在运行这个查询:

SELECT * FROM customers;

输出如下:

上面的SQL UPDATE命令修改了3条记录,它们的num_orders都大于170,折扣值现在变为10。

根据多个条件更新记录

到目前为止,WHERE子句只包含一个简单的条件。但实际应用中,过滤条件常常通过逻辑运算符连接多个条件。

为了演示这一点,我们设置一个规则:将满足以下两个条件的记录的折扣设置为5:

  • city LIKE 'New%':此条件检查city字段以”New”开头的记录,并且
  • num_orders > 100:此条件基于订单数进行过滤,仅包含订单数大于100的记录。

UPDATE语句如下:

UPDATE customers
SET DISCOUNT=5
WHERE city LIKE 'New%' AND num_orders>100;

注意,现在WHERE子句包含两个条件,并通过逻辑AND运算符连接。只有同时满足这两个条件的记录才会被更新。

接下来,运行此查询并观察输出:

SELECT * FROM customers;

输出显示,满足上述两个条件的记录的折扣字段已被更新:

使用SQL UPDATE命令的常见注意事项

到目前为止,我们执行的所有UPDATE语句都包含了WHERE子句。

举个例子,如果你想将特定客户的折扣更新为25,但在更新查询中忘记包含WHERE子句:

UPDATE customers
SET DISCOUNT=25;

现在运行:

SELECT * FROM customers;

你会看到表中的所有记录都被更新了,这可能不是你想要的结果。

因此,当你想要基于条件更新记录子集时,请务必包含WHERE子句。如果想要更新所有记录的某个特定字段,则可以省略WHERE子句。

例如,假设你即将进行黑色星期五促销活动,并希望为所有客户提供25%的折扣,那么运行上面的查询是有意义的。

总结

以下是对本教程内容的总结:

  • 当想要更新数据库表中的记录时,可以使用SQL UPDATE命令。
  • SQL UPDATE语句通常包含WHERE子句,该子句的条件确定要更新的记录子集(即表的行)。
  • UPDATE语句中省略WHERE子句将导致更新所有记录。因此,如果更新表中的所有行不是预期行为,则必须谨慎,不要遗漏WHERE子句。

接下来,你可以查看这份SQL备忘单以供快速参考。