SQL Update更新数据的操作方法
<p>在实际工作中,我们经常需要更改数据库中的数据,更新数据用到的关键词是UPDATE,其基本语法是:</p><div class="jb51code"><pre class="brush:sql;">UPDATE 表名
SET 列名1 = 新值1, 列名2 = 新值2, ...
WHERE 条件;</pre></div>
<p>其中UPDATE 后面指定要更新数据的表,再用SET设置需要更新的列及其新值,可以同时更新多个列,用逗号分隔,where后面则加条件指定哪些行的数据需要被更新。例如,有如下一张Student表:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081510452886.png" /></p>
<p>现在需要将小明的班级更新为301,同时他的年龄应该是21岁,那么可以写成:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE dbo.Student
SET Class = '301',
Age = 21
WHERE Name = '小明';</pre></div>
<p>如果省略了WHERE 子句,即不加任何限定条件,那么表中所有行的数据都会被更新(即所有学生的class都成了301,age都是21了),这在大多数情况下不是我们想要的结果,因此使用时需格外注意。在实际工作中,强烈建议大家在执行update之前,先将指定的条件用select语句查一遍,确保要更新的数据是对的。记得我刚开始工作的时候,害怕更新错或者删错数据,每次update或者delete都在事务中进行,确保没问题后再提交(事务我后面会介绍)。</p>
<p>上面是update的基本用法,也还有其他的情况,比如where后面所接的指定条件,可以是大于某个数或者在某个范围内,或者跟一个子查询等等,即这里where后面能写的条件跟select中是类似的。因为更新前,先将需要更新的数据筛选出来,再执行更新操作。例如将所有不及格同学的成绩都改为60分,可以写成:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE dbo.Score
SET Score = 60
WHERE Score < 60;</pre></div>
<p>更新后的值也可以是一个表达式,而非某个具体的值,例如将学号001同学所有课程的分数都加上10分,可以写成:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE dbo.Score
SET Score = Score + 10
WHERE StudentNumber = '001';</pre></div>
<p>要提醒的一点是:更新某条数据时,各列是同一时间更新的,例如有下面一个SQL:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE dbo.T
SET colA= colA + 10 , colB =colA+10;</pre></div>
<p>执行完之后,colA和colB的结果是一样的,并不是说colB在A已经加了10的基础上再执行加10。</p>
<p><strong>联表更新:</strong></p>
<p>在查询数据的时候,如果要的数据是通过不同的条件指定的,这些条件并不在同一张表中,我们需要将多表关联进行查询。同理,如果在更新数据的时候,给我们的条件也不全在同一张表中,我们就需要联表来进行更新。例如,Score表数据结构如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081510452890.png" /></p>
<p>现要求将李华同学 操作系统这门课程 的成绩加一分,应该怎么写SQL呢?</p>
<p>我们肯定要找到他对应的学号和操作系统这门课程的编号是多少,因为Score表里有的只是编号而没有具体的值或课程名。(为什么不在Score表里存这些具体的值呢?这在后面表的设计原则中会介绍)。</p>
<p>所以我们可以分3步,查“李华”的StudentNumber--->查“操作系统”对应的CourseNumber--->再将这两次查到的结果放在update语句where后面的条件中。只是有点繁琐,可以用联表更新将这3步合为一步,即:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE A
SET A.Score = A.Score + 1
FROM dbo.Score AS A
INNER JOIN dbo.Student AS B
ON B.StudentNumber = A.StudentNumber
INNER JOIN dbo.Course AS C
ON C.CourseNumber = A.CourseNumber
WHERE B.Name = '李华'
AND C.Name = '操作系统';</pre></div>
<p>写上面这个SQL的逻辑也是建立在多表关联查询的基础上,即首先写的SQL是:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT A.Score
FROM dbo.Score AS A
INNER JOIN dbo.Student AS B
ON B.StudentNumber = A.StudentNumber
INNER JOIN dbo.Course AS C
ON C.CourseNumber = A.CourseNumber
WHERE B.Name = '李华'
AND C.Name = '操作系统';</pre></div>
<p>通过关联Student表和Course表查出我们要更新的数据,然后再将SELECT换成UPDATE,update之后是我们要更新的那个表名。通过上面使用表的别名大家应该也能看出,虽然update是写在一开始的,但是它执行的逻辑顺序却是最后。在这里补充一点关于SQL语句的执行顺序:</p>
<p>对于常见的查询(SELECT语句),其书写顺序如下:</p>
<ul><li><strong>SELECT</strong>:用于指定要查询的列。例如<code>SELECT column1, column2</code>,你可以选择一个或多个列,也可以使用<code>*</code>来表示查询所有列。</li><li><strong>FROM</strong>:指定要从哪个表中查询数据。例如<code>FROM table_name</code>,这是数据来源的表。</li><li><strong>WHERE</strong>:用于对数据进行筛选,添加条件来过滤数据。例如<code>WHERE column1 = value</code>,只有满足条件的行才会被返回。</li><li><strong>GROUP BY</strong>:用于对结果集进行分组。例如<code>GROUP BY column1</code>,通常和聚合函数(如<code>COUNT()</code>、<code>SUM()</code>等)一起使用,对每个分组进行操作。</li><li><strong>HAVING</strong>:在分组后对分组进行筛选,它和WHERE的区别在于HAVING是针对分组后的结果进行筛选,而WHERE是对原始数据进行筛选。例如<code>HAVING COUNT(column1) > 10</code>。</li><li><strong>ORDER BY</strong>:用于对结果集进行排序。例如<code>ORDER BY column1 ASC</code>(升序,默认)或<code>ORDER BY column1 DESC</code>(降序),可以指定一个或多个列进行排序。</li></ul>
<p>但<strong>SQL语句的执行顺序和书写顺序有所不同</strong>,主要的执行顺序是:</p>
<ul><li><strong>FROM</strong>:首先确定数据来源的表,这是整个查询的基础,即要查哪张表。数据库会加载指定的表,为后续的操作提供数据源。</li><li><strong>WHERE</strong>:在确定了表之后,再对表中的数据进行筛选,根据WHERE子句中的条件过滤出符合条件的行。这一步可以减少后续操作的数据量,提高查询效率。</li><li><strong>GROUP BY</strong>:对WHERE筛选后的结果集进行分组操作。按照指定的列将数据分成不同的组,为后续的聚合操作做准备。</li><li><strong>聚合函数(如在SELECT中使用的COUNT、SUM等)</strong>:在分组的基础上,对每个分组应用聚合函数进行计算。例如计算每个分组的行数、总和等。</li><li><strong>HAVING</strong>:对分组后的结果进行筛选。这是在聚合函数计算之后进行的,根据HAVING子句中的条件过滤分组。</li><li><strong>SELECT</strong>:最后确定要返回的列。此时已经完成了数据的筛选、分组和聚合等操作,根据SELECT子句指定的列从最终的结果集中提取数据。</li><li><strong>ORDER BY</strong>:对最终的结果集进行排序。这是最后一步,根据指定的列对结果进行升序或降序排列。</li></ul>
<p>执行顺序对理解SQL语句的运行非常有帮助!</p>
<p>说回更新语句,首先是要查询到需要更新的数据,即确定表--->筛选行--->计算新值(set语句)--->再更新数据。</p>
<p>关于update更新数据的知识,大概就这么多,大家需要掌握:</p>
<p>1.更新单列、更新多列</p>
<p>2.不同的限定条件来更新数据</p>
<p>3.基于表达式更新</p>
<p>4.表关联更新</p>
<p>最后还想重复一句,执行update的时候一定要慎重,不要忘记where限定条件,最好先将更新语句中指定的条件用select语句查一遍,确保要更新的数据是对的(后面说删除也是同理),在实际工作中如果弄错重要数据,后果很严重。</p>
頁:
[1]