了解如何使用 SQL UPDATE 命令更新数据库表中的记录。
作为开发人员,您应该能够轻松地使用关系数据库。 SQL(或结构化查询语言)是一种适合初学者的语言,学习起来很直观,语法也很简单。 SQL 允许您创建数据库对象和查询关系数据库表。
您可以运行 SQL 查询来创建、读取、更新和删除数据库表中的记录。 您可能熟悉这些操作统称为 CRUD 操作。
要更新存储在数据库表中的记录,可以在 SQL 中运行 UPDATE 命令。
在本教程中,您将学习:
- UPDATE 命令的语法
- 如何根据特定条件或使用逻辑运算符链接在一起的多个条件更新记录
- 运行 SQL UPDATE 命令时要注意的常见警告
目录
SQL UPDATE 命令的语法
SQL UPDATE 命令的语法为:
UPDATE table_name SET column = new_value WHERE condition;
上述查询更新条件为 true 的所有记录的列。
要更新多个列(或字段),请使用 SQL UPDATE 命令,如下所示:
UPDATE table_name SET column_1 = new_value_1, column_2 = new_value_2, ..., column_k = new_value_k WHERE condition;
回想一下在关系数据库中:
- 表代表一个实体。
- 表的行是记录,代表实体的实例。
- 列也称为字段或属性。 在本教程中,我们将互换使用列和字段。
SQL UPDATE 命令用法示例
现在让我们举一些例子。
先决条件
在开始编码之前:
- 本教程使用 SQLite。 所以你需要有 SQLite 和 SQLite 数据库浏览器 (推荐)一起编码。 请注意,您还可以使用 MySQL 或 PostgreSQL。
- 如果您想复制该示例,您需要 Python 和 Faker Python 包 以及。
创建包含记录的数据库表
如果您想按照本教程进行编码,则可以运行以下代码片段来创建并连接到客户数据库 customer_db.db。 请注意,我们使用 Faker Python 库生成合成数据以插入到顾客表中:
# main.py import sqlite3 from faker import Faker import random # connect to the db conn = sqlite3.connect('customer_db.db') cur = conn.cur() # create a database table cur.execute('''CREATE TABLE customers ( customerID INTEGER PRIMARY KEY, name TEXT, city TEXT, email TEXT, num_orders INTEGER, discount INTEGER DEFAULT 2)''') # create a Faker object fake = Faker() Faker.seed(42) for _ in range(15): name = fake.name() city = fake.city() d = fake.domain_name() email = f"{name[:2]}.{city[:2]}@{d}" num_orders = random.choice(range(200)) db_cursor.execute('INSERT INTO customers (name, city, email, num_orders) VALUES (?,?,?,?)', (name,city,email,num_orders)) # commit the transaction conn.commit() cur.close() conn.close()
📑 为了使此代码正常运行,请确保您有 Python 3.7(或更高版本)并且 骗子 安装在您的开发环境中。 您可以使用 pip 安装 Faker Python 包:
pip install faker
如果您已经有一个可以连接的数据库和一个可以查询的数据库表,您也可以根据需要使用它。
运行我们的第一个 SQL 查询
客户表有以下字段:
- customerID:customerID 是帮助我们唯一标识数据库表中的记录的主键。
- name:客户的姓名
- city:他们所属的城市。
- 电子邮件:他们的电子邮件地址。
- num_orders:他们下的订单数。
- discount:折扣百分比,一个整数,默认值为2。因为discount字段有默认值,所以我们在填充数据库表时不需要为其插入值。
📝 您可以使用 SQLite 命令行客户端运行查询并查看结果。 或者您可以使用 SQLite 数据库浏览器。
我将展示 SQLite DB 浏览器的输出,因为它们很容易解释。
运行以下查询以获取customers表中的所有记录:
SELECT * FROM customers;
在实践中,除非必要,否则应避免使用 SELECT *。 但对于本示例,我们将使用它,因为我们只有 15 条记录且字段不多。
根据单一条件更新记录
现在我们知道表是什么样子了,让我们运行一些 UPDATE 查询来根据所需条件更新记录。
📋 注意:运行 UPDATE 语句后,我们将运行 SELECT * FROM customer 以查看更新的记录。
更新单个字段
首先,我们更新 customerID=7 的记录的 city 字段:
UPDATE customers SET city='Codeshire' WHERE customerID=7;
让我们从客户表中选择所有列和记录:
SELECT * FROM customers;
我们看到 Danielle Ford (customerID=7) 的城市字段已更新。
更新多个字段
在前面的示例中,我们只更新了一个字段,即 customerID 7 对应的记录的城市。但我们也可以使用我们学到的语法来更新多个字段。
这里我们更新了 customerID 1 对应的城市和电子邮件字段:
UPDATE customers SET city='East Carlisle',email="[email protected]" WHERE customerID=1;
接下来,我们运行:
SELECT * FROM customers;
这是输出:
更新多条记录
由于我们使用了 customerID(唯一标识客户记录的主键),因此我们迄今为止运行的查询仅更新了其中一条记录。
但是,如果表中的多条记录的条件为 true,则运行 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%’:此条件检查并包含城市字段以 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。 在 ypur 更新查询中,您忘记包含带有要过滤的 customerID 的 WHERE 子句:
UPDATE customers SET DISCOUNT=25;
现在运行:
SELECT * FROM customers;
您将看到表中的所有记录都已更新。 这可能不是您想要的行为。
⚠ 因此,当您想要根据条件更新记录子集时,请记住包含 WHERE 子句。 如果要更新所有记录的特定字段,可以省略 WHERE 子句。
在此示例中,假设您即将迎来黑色星期五促销活动,并且您希望为所有客户提供 25% 的折扣。 然后运行上面的查询就有意义了。
结论
以下是您所学内容的摘要:
- 当您想要更新数据库表中的记录时,可以使用 SQL UPDATE 命令。
- SQL UPDATE 语句通常包含 WHERE 子句,其条件确定要更新的记录子集(表的行)。
- 在 UPDATE 语句中省略 WHERE 子句会更新所有记录。 因此,如果更新表的所有行不是所需的行为,则必须小心不要省略 WHERE 子句。
接下来,查看此 SQL 备忘单以供快速参考。