您的数据库可能是您的组织最大的商业资产。它保存与其他实体(如承包商和供应商)协作所需的所有客户数据和其他关键信息。但是如果没有适当的管理,您的数据库可能容易出现错误和数据丢失。

SQL(结构化查询语言)是一种行业标准编程语言,它提供了搜索组织数据库并返回必要结果所需的基本工具。SQL操作基本命令(通常称为语句或查询)的简单语法,并结合各种附加子句和操作符。SQL可以对您的公司数据库进行任何必要的修改,并通过UPDATE语句保持它的最新状态。

完整的SQL训练营2021:从零到英雄

上次更新10月2020年

畅销书
  • 83课
  • 各级
4.7 (98252)

成为SQL的专家!|由穆Portilla

探索课程

SQL UPDATE语句将修改数据库表中的现有记录,以反映数据的最新可用版本。UPDATE语句更改数据库中已经存在的所需记录,但如果使用不当,可能会意外覆盖记录并丢失现有数据。如果没有备份,您的数据可能会损坏或完全丢失,因此始终保持当前数据库的备份是明智的。

编写基本的SQL UPDATE语句

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

至少,SQL UPDATE语句看起来是这样的:

更新客户集的名字= ' Jack '

在这里,UPDATE语句将所有选中的记录设置为名字“Jack”。该语句首先标识要更改的表:“customer”。然后它指定要更新的列:“first name”。最后,该语句定义了新值' Jack ',它将替换列中的任何当前值。

但是,虽然这是一个有效的SQL语句,但它不是一个典型的更新查询,并且在您对基本数据库值进行更改时,最可能您想要执行此操作。在这里出现,此语句将指定列“客户集”中的所有记录更改为“jack”。这种全局变革可能是灾难性的,强迫您使用备份恢复以前的版本。

SQL WHERE子句可以防止这种情况。WHERE通过指定要针对哪些记录并排除不希望更改的记录来帮助细化搜索结果。通过结合WHERE和UPDATE,您可以使用一条UPDATE语句对任意数量的记录进行更新——从1条到100万条或更多。

将Where子句添加到更新语句

正如我们所见,可以使用更新更新表中的所有记录。但大多数更新语句添加了筛选结果的Where子句,如下所示:

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

现在,语句只更改一条记录。“customerId”列只指定一个值“5”,它引用一个惟一的客户ID条目,因此更新将只应用于该客户。而且不管之前的名字值是什么,它都将把这个客户的名字更改为“Jack”。该语句中最重要的内容是客户ID,因为它将更新限制在匹配的结果上。

UPDATE语句还允许进行纠正,例如修复拼写错误或更改大写和标点符号。下面是UPDATE语句将拼写错误的“jck”更改为“Jack”的示例。

update customer set first_name= ' Jack ' where first_name= ' jck '

该语句只更改第一个名字(在“first name”列中)等于“jck”的记录。在这里,大写并不重要,因此更改将适用于“jck”或“jck”。但是,当它实现更改时,“first name”列中的名称将更改为大写版本“Jack”,正如我们在语句中输入的那样。

在下面的语句中,不正确大写的值也将更新为正确大写的名称“Jack”。

update customer set first_name= ' Jack ' where first_name= ' Jack '

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

一次更新多个列

上面的示例显示了UPDATE语句如何仅对一列进行工作。但是,正如我们已经注意到的,您还可以使用一个update语句,并结合用于细化查询的适当子句和操作符,一次更新多个列。

在这个例子中,SQL UPDATE语句更新了单个客户的第一列和最后一列:

update customer set first_name= ' Jack ', last_name = ' Smith ' where customerId = 5

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

使用多个WHERE子句筛选器

在上面的语句中,WHERE子句只允许您用“customerID”为5更新一条客户记录。但是您可能不知道客户的ID,并且您可能只有一些基本的业务逻辑规则来帮助您。例如,假设您只知道您有一个上周注册了某个服务的新客户列表,但是您需要更新来自另一个表的国家ID以使记录保持一致。在这种情况下,可以使用多个WHERE子句筛选器来指定要更新的记录。

首先,您需要选择查询,从第一表中检索您需要编辑的客户列表。然后,您需要从其他国家表中检索正确的国家/地区ID。这是一个选择子查询的一个例子,其中where子句检索邮政编码“33071”的国家代码。

从Zipcode ='33071'的国家/地区选择CountryId

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

select * from users where signup_date >= getDate() - 7 and zip_code = ' 33071 '

该语句允许您使用关键WHERE子句对相关数据进行抽样。然后,该查询返回一个用户列表,这些用户是在前7天内注册的,并且具有与上面的SELECT子查询匹配的邮政编码。但是这个子句只是确保您已经返回了要更新的正确记录。你仍然需要将这个SELECT语句转换为UPDATE语句,如下所示:

更新用户SET COLUSID = 其中signup_date> = getdate() -  7和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将返回一个错误。在这种情况下,“top 1”短语确保子查询只返回一条记录。与指定最近一周内注册日期(“getdate”和“-7”)的WHERE子句结合在一起,该查询应该正确地过滤结果以返回所需的结果。

但如果子查询返回多个记录,则可能存在数据完整性问题。例如,如果子查询两次返回国家代码,则数据库中可能会有重复记录。这可能会导致稍后使用其他SQL语句造成问题。

更高级的更新查询

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

在这种情况下,您需要运行相同的选择查询,以确保精确过滤更新的记录。但这一次,你将在where子句中取出邮政编码,以便更新所有记录。此字符串示例您需要的数据:

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

这是完整的UPDATE查询:

Update users set countryid = (select top 1 countryid from countries where countries.)7 . getDate() . getDate() . getDate() . getDate() . getDate()

此查询更新在过去七天内具有注册日期的所有记录。“GetDate() - 7”在WHERE子句中过滤出所有记录,除了过去七天内与注册有关的记录,国家邮政编码数据包括所有用户邮政编码。重要的是要了解在此语句中,子查询实际上执行更新。

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

此声明基本上说:“在用户表中查找用户的邮政编码,然后将该录制与Countury表中的相应邮政编码匹配。”正确执行时,结果应该只是一个记录,但再次添加“前1”以避免多个返回的错误。然后,匹配的国家代码进入“CountrID”列中的用户表。这允许您一次更新多个邮政编码并运行一个与用户地址与相应国家/地区相匹配的动态查询。

使用UPDATE查询的IN语句

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

在更新查询中使用IN子句有很多原因。例如,您可能只想更新已下了订单的客户列表,因此需要从订单表中获取订单列表。这个例子使用了上面的更新语句,但是它改变了业务逻辑——指导如何管理数据的“真实世界”业务规则——语句应该为哪些记录更新。在这种情况下,语句看起来是这样的:

更新用户SET COLUSID =(从Catends.zipcode = Users.zipcode的国家/地区选择TOP 1 COMPERID)(从订单中选择CustomerID)

这条语句更新与上面相同的列,但它只更改来自该列的在orders表中有订单的客户。它仍然使用相同的子查询,这将确保更新来自国家表的具有正确国家代码的记录。语句中唯一需要更改的部分是WHERE子句中的业务逻辑。

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

Update users set countryid = (select top 1 countryid from countries where countries.)where customerId in (select customerId from orders where order_date >= getdate() - 7)

在这个查询中,业务逻辑只发生了一点变化——当然,只需一个小的变化就会对更新的记录产生显著影响。这里,如果用户在过去7天内下了订单,SQL将从订单表中获取记录,而不是在“customers”表中检索注册日期。然后运行“外部”更新查询。

这个查询从IN子查询语句返回的用户列表中更新用户表。还可以添加用户的注册日期,以汇编最近7天内注册的用户列表。对于这些用户,您只能更新那些在该时间范围内下了订单的用户。这个查询看起来像这样:

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

现在,查询将两个注册日期和订单日期与包含在七天内下订单的客户中选择的返回集的子句。

更新是最常见的SQL命令之一,它是一个必不可少的工具,用于保持SQL供电的关系数据库电流并正常工作。学习其结构和基本命令是一个用于程序员,开发人员和对数据库管理感兴趣的人的必要条件。要了解有关SQL的更多信息,请参阅我们的概述最有用的SQL命令。或者深入了解另一个装订SQL语句 - SQL Delete。

SQL顶级课程

SQL编程基础知识
全球学院
4.4 (82)
SQL和PostgreSQL:完整的开发人员指南
Stephen主梁
4.7 (1,385)
评价最高
完整的SQL训练营2021:从零到英雄
何塞波罗拉
4.7 (98252)
畅销书
Ultimate MySQL BootCamp:从SQL初学者到专家
Colt Steele,Ian Schoonover
4.6 (53,869)
畅销书
SQL - MySQL的数据分析和商业智能
365职业
4.6 (27491)
畅销书
完整的SQL和数据库训练营:零到精通[2021]
Andrei Neagoie, Mo Binni
4.6 (1420)
SQL初学者:学习SQL使用MySQL和数据库设计
Tim Buchalka的学习编程学院,Jon Avis - SQL讲师
4.5 (10501)
SQL&PostgreSQL为初学者:成为一个SQL专家
Jon Avis - SQL讲师
4.5 (3,183)
畅销书
使用PostgreSQL学习SQL:从0到英雄
将地堡
4.4 (1,978)

多个SQL课程

SQL学生也学习

让你的团队。领导行业。

通过Udemy为Business获取组织的在线课程和数字学习工具库的订阅。

请求一个演示