您的数据库可能是您组织最伟大的商业资产。它拥有您的所有客户数据和其他关键信息,用于与其他实体一起使用,例如承包商和供应商。但没有适当的管理,您的数据库可能很容易受到错误的错误和数据丢失。

SQL(结构化查询语言)是一种行业标准的编程语言,提供搜索组织数据库所需的基本工具并返回必要的结果。SQL在基本命令(通常称为语句或查询)的直接语法上运行,与各种附加的子句和运算符相结合。SQL使得可以对公司数据库进行任何急需的修改,并将其与Update语句保持电流。

完整的SQL Bootcamp 2021:从零到英雄

最后更新2020年10月

畅销书
  • 83讲座
  • 各级
4.7 (97,704)

成为SQL的专家!|何塞波罗拉

探索课程

SQL UPDATE语句将修改数据库表中的现有记录,以反映数据的最新版本。Update语句更改了数据库中已所需的记录,但如果未正确使用,则可以意外地覆盖记录并失去现有数据。如果没有备份,您的数据可能已损坏或完全丢失,因此始终明智地维护当前数据库的备份。

编写基本SQL UPDATE语句

与SQL中的其他语句一样,UPDATE语句并不复杂,但是在将UPDATE语句应用于多个记录之前,理解基本格式很重要。

至少,SQL Update语句看起来像这样:

更新客户设置名字='jack'

在这里,更新语句将所有所选记录设置为名字“jack”。该声明首先识别您要更改的表:“客户”。然后它指定要更新的列:“名字”。最后,该语句定义了新的值“插孔”,它将替换列中的任何当前值。

但是,尽管这是一条有效的SQL语句,但它不是典型的UPDATE查询,而且在更改基本数据库值时很可能不希望这样做。正如这里所示,该语句将指定列“customer set”中的所有记录更改为“Jack”。这种全局更改可能是灾难性的,迫使您使用备份恢复以前的版本。

SQL WHERE子句可以阻止这一点。通过指定要定位的记录并排除您不想更改的记录,帮助优化搜索结果。通过组合在update的位置,您可以从只需一到一百万或更多 - 使用单个更新语句来更新您喜欢的任何记录。

将Where子句添加到更新语句

如我们所见,可以使用UPDATE更新表中的所有记录。但是大多数UPDATE语句都会添加WHERE子句来过滤结果,如下所示:

更新客户设置first_name ='jack',其中customersid = 5

现在,该声明只会更改一个记录。“CustomerID”列仅指定一个值“5”,指的是唯一的客户ID条目,因此更新仅适用于该客户。无论先前的名字值是什么,它会将此客户的名字更改为“杰克”。此声明中最重要的是客户ID,因为它仅限于匹配结果的更新。

Update语句还允许您进行更正,例如修复拼写错误或更改大写字母和标点符号。以下是更新语句将拼写错误“JCK”更改为“杰克”的示例。

更新客户set first_name ='jack',其中first_name ='jck'

此语句仅更改名字(“名称”列中的记录)等于“JCK”。在这里,大写无关紧要,因此更改将适用于“JCK”或“JCK”。但是,当它实现更改时,“名字”列中的名称将更改为大写版本“杰克”,我们在语句中键入。

在以下声明中,资本不当的值也将更新到名称“杰克”的正确大写版本。

更新客户set first_name ='jack',其中first_name ='jack'

此语句将使小写版本的“插孔”更改为正确大写的一个“杰克”。更新将所有相关值更改为语句中键入的版本,无论最初包含的错误如何。

一次更新多个列

上面的示例显示了更新语句如何只与一列合作。但正如我们所指出的那样,您还可以使用单个Update语句同时更新多个列,与相应的子句和运算符相结合以精炼查询。

在此示例中,SQL Update语句更新单个客户的第一个和姓氏列:

更新客户set first_name ='jack',last_name ='smith',其中customerId = 5

就像以前的更新语句一样,除了带有“5.”的“CustomerID”的那个之外,Where子句筛选了表中的所有其他客户然后,正如语句指定的那样,第一个和姓氏列可以分别更新到jack和史密斯。

使用多个where子句筛选器

在上面的声明中,WHERE子句允许您只需使用“CustomerID”的一个客户录制。但您可能不知道客户的ID,您可能只有几个业务逻辑规则才能帮助您解决。例如,假设您只知道您有一个在上周内注册服务的新客户列表,但您需要更新来自另一个表的国家/地区ID以使记录一致。在这样的情况下,您可以使用多个Where子句筛选器来指定要更新的记录。

首先,您将需要SELECT查询,它将从第一个表检索您需要编辑的客户列表。然后,您需要从另一个国家表检索正确的国家ID。下面是一个带有WHERE子句的SELECT子查询示例,该子查询检索邮政编码为“33071”的国家代码。

从zipcode = ' 33071 '的国家中选择国家

接下来,您将创建一个选择要更新的记录列表的SELECT查询。此SELECT语句可确保更新语句仅影响所需的记录。继续使用此方案,下面的SELECT语句返回所有包含在上周内注册的用户的所有记录的列表。

选择*来自signup_date> = getDate() -  7和zip_code ='33071'的用户

此语句允许您使用key子句来对相关数据进行采样。然后,查询返回在前七天内注册的用户列表,也有一个锁代码与上面的选择子查询匹配。但此子句仅确保您已返回正确的记录以更新。您仍然需要将此SELECT语句转换为更新语句,这些语句如下所示:

update users set countryid =  where signup_date >= getDate() - 7 and zip_code = ' 33071 '

现在,Update语句几乎完成。请注意,此语句包含“”占位符。这是SQL语法不正确,所以此时,查询将返回错误。以下是所有元素的组合如何将完整的更新查询放在一起:

更新用户SET COLUSID =(从Zipcode ='33071'的国家/地区选择TOP 1 COMPERID,其中signup_date> = getdate() -  7和zip_code ='33071'

如果不习惯SQL语法,则此查询可能会令人困惑。但这是它的工作原理。子查询获取与外部国家/地区表中匹配邮政编码“33071”的国家代码。在这里,这个国家是美国,所以查询检索向美国分配了什么ID。短语“Top 1”并不总是必要的,但如果相同的邮政编码的记录有多个记录,它将充当预防。

如果子查询检索多个记录,则SQL返回错误。在这种情况下,“前1”短语确保子查询只返回一个记录。结合指定上周内的注册日期的where子句(“getDate”和“-7”),此查询应正确过滤结果以返回所需的结果。

但如果子查询返回多个记录,则可能存在数据完整性问题。例如,如果子查询两次返回国家代码,那么数据库中很可能存在重复的记录。这可能导致其他SQL语句稍后出现问题。

更高级的更新查询

对于上面所述的查询示例,需要为数据库中的每个邮政编码运行单独的更新。如果您只需要更新几个邮政编码,那么该语句可能足以处理该任务。但如果有几十个或更多,单独更新每个条目不是很有效。要解决这个问题,可以进一步创建一个动态SQL语句,允许一次更新多条记录。

在这种情况下,您将需要运行相同的SELECT查询,以确保精确地筛选要更新的记录。但是这一次,您将在WHERE子句中取出邮政编码,以便更新所有记录。这个字符串采样你需要的数据:

选择*来自signup_date> = getDate() -  7的用户

这是完整的更新查询:

更新用户SET COLUSID =(从Catends.zipcode = Users.zipcode的国家/地区选择TOP 1 COMPER)其中Signup_date> = getDate() -  7

此查询更新最近7天内有注册日期的所有记录。WHERE子句中的“getDate() - 7”过滤掉除了过去7天内与注册相关的所有记录,国家邮政编码子句现在包括所有用户邮政编码。在这个语句中,子查询实际上执行更新,理解这一点很重要。

子查询中的Where子句包括用户和国家表,链接两个表将每个记录中的国家代码返回更新语句中的每个记录。

该语句的本质是:“在用户表中查找用户的邮政编码,然后将该记录与国家表中相应的邮政编码进行匹配。”当正确执行时,结果应该只有一条记录,但同样,添加了“top 1”以避免多次返回的错误。然后将匹配的国家代码放入用户表的“countryID”列中。这允许您一次更新多个邮政编码,并运行将用户地址与适当国家匹配的动态查询。

使用具有更新查询的IN语句

Update语句中最重要的部分是where子句,因为它确定要在表中更新的记录的位置。使用中的子句以及可以更精确地过滤掉记录的位置。

使用诸如Update查询的一部分的子句有许多原因。例如,您可能希望只更新已下订单的客户列表,因此您需要从Orders表中获取订单列表。此示例使用上面的更新语句,但它更改了业务逻辑 - 指导如何管理数据的“现实世界”业务规则 - 对于该语句应该更新的记录。在这种情况下,该声明看起来像这样:

Update users set countryid = (select top 1 countryid from countries where countries.)where customerId in (select customerId from orders)

此语句如上所述更新相同的列,但它只更改了在订单表中具有订单的该列的客户。它仍然使用相同的子查询,这确保了来自各国家/地区的正确国家代码的记录将更新。更改的声明中唯一的部分是Where子句中的业务逻辑。

此查询现在使用订单更新所有客户。但这可以包括多个记录,如果您在同一时间运行其他服务,则可能会损害性能。例如,您可以将搜索限制在前七天内下订单的客户数量。以下是查询的样子:

更新用户SET COLUSID =(从Countrends.zipcode = users.zipcode中选择found 1 countyId),其中customerId中(从订单中选择customerId,其中server_date> = getdate() -  7)

在此查询中,业务逻辑更改只有一点点授予,它只需要一个小型更改,对更新的记录产生显着影响。这里,如果用户在过去七天下订单下订单,则在这里,而不是检索“客户”表中的注册日期,而是从订单表中获取记录。然后“外部”更新查询运行。

此查询从子查询语句返回的用户列表中更新用户表。也可以添加用户的注册日期以编译在过去七天内注册的用户列表。来自这些用户,您只能更新在该时间框架内下订单的人。查询看起来像这样:

更新用户SET COLUSID =(从Catends.zipcode = Users.zipcode的国家/地区选择前1个CountinId)其中signup_date> = getdate() -  7和customerid中(从订单中选择customerId,其中来自Order_date> = getdate() -  7)

现在,该查询将注册日期和订单日期与一个包含SELECT和WHERE的IN子句结合起来,以将返回集限制为在过去7天内下过订单的客户。

UPDATE是最常见的SQL命令之一,它是保持基于SQL的关系数据库当前状态和正常工作的基本工具。对于程序员、开发人员和任何对数据库管理感兴趣的人来说,学习它的结构和基本命令是必须的。要了解关于SQL的更多信息,请参阅我们对最有用SQL命令的概述。或者深入了解另一条主要SQL语句——SQL DELETE。

SQL中的顶级课程

SQL和PostgreSQL:完整的开发人员指南
斯蒂芬格莱德里
4.7 (1,340)
收视率最高
完整的SQL Bootcamp 2021:从零到英雄
何塞波罗拉
4.7 (97,704)
畅销书
Ultimate MySQL BootCamp:从SQL初学者到专家
柯尔特·斯蒂尔,这是伊恩·斯库诺弗
4.6 (53,535)
畅销书
SQL - 用于数据分析和商业智能的MySQL
365年职业生涯
4.6 (27,320)
畅销书
高级SQL:SQL Expert认证准备课程
8万多名学员,Code Star学院
4.4 (2,089)
完整的SQL和数据库Bootcamp:零掌握[2021]
安德烈Neageie,Mo Binni
4.6 (1,391)
SQL for初学者:使用MySQL和数据库设计学习SQL
Tim Buchalka的学习编程学院,Jon Avis - SQL教练
4.5 (9,909)
SQL&PostgreSQL为初学者:成为一个SQL专家
Jon Avis - SQL教练
4.5 (3156)
畅销书
实用SQL训练营的数据分析师和数据科学家
艾娃中科院博士
4.4 (619)
SQL教程:学习SQL与MySQL数据库-Beginner2Expert
Pradnyankur Nikam.
4.2 (1,731)

更多SQL课程

SQL学生还学习

赋予你的团队。引领行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求演示