暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DB基础第十七篇:数据的更新(UPDATE)

java大本营 2021-07-07
1847

UPDATE 语句的基本语法

     使用 INSERT 语句向表中插入数据之后,有时却想要再更改数据,例如“将商品销售单价登记错了”等的时候。这时并不需要把数据删除之后再重新插入,使用 UPDATE 语句就可以改变表中的数据了。

     和 INSERT 语句、 DELETE 语句一样, UPDATE 语句也属于 DML语句。通过执行该语句,可以改变表中的数据。其基本语法如下所示。

    语法4-4 改变表中数据的 UPDATE 语句
    UPDATE < 表名 >
    SET < 列名 > = < 表达式 >;

          将更新对象的列和更新后的值都记述在 SET 子句中。我们还是以Product (商品)表为例,由于之前我们删除了“销售单价大于等于4000 日元”的 2 行数据,现在该表中只剩下了 6 行数据了(表 4-2)。

         接下来,让我们尝试把 regist _ date 列(登记日期)的所有数据统一更新为“2009-10-10”。具体的 SQL 语句请参见代码清单 4-15。

      代码清单4-15 将登记日期全部更新为“2009-10-10”
      UPDATE Product
      SET regist_date = '2009-10-10';

          此时,连登记日期原本为 NULL 的数据行(运动 T 恤)的值也更新为 2009-10-10 了。

      指定条件的 UPDATE 语句(搜索型 UPDATE )

           接下来,让我们看一看指定更新对象的情况。更新数据时也可以像DELETE 语句那样使用 WHERE 子句,这种指定更新对象的 UPDATE 语句称为搜索型 UPDATE 语句。该语句的语法如下所示(与 DELETE 语句十分相似)。

        语法4-5 更新部分数据行的搜索型 UPDATE
        UPDATE < 表名 >
        SET < 列名 > = < 表达式 >
        WHERE < 条件 >;

             例如,将商品种类( product _ type )为厨房用具的记录的销售单价( sale _ price )更新为原来的 10 倍,请参见代码清单 4-16。

          代码清单4-16 将商品种类为厨房用具的记录的销售单价更新为原来的10倍
          UPDATE Product
          SET sale_price = sale_price * 10
          WHERE product_type = ' 厨房用具 ';

               该语句通过 WHERE 子句中的“ product _ type =  ' 厨房用具 ' ”条件,将更新对象限定为 3 行。然后通过 SET 子句中的表达式 sale _price * 10 ,将原来的单价扩大了 10 倍。SET 子句中赋值表达式的右边不仅可以是单纯的值,还可以是包含列的表达式。

          使用 NULL 进行更新

               使用 UPDATE 也可以将列更新为 NULL (该更新俗称为 NULL 清空)。此时只需要将赋值表达式右边的值直接写为 NULL 即可。例如,我们可以将商品编号( product _ id )为 0008 的数据(圆珠笔)的登记日期( regist _ date )更新为 NULL (代码清单 4-17)。

            代码清单4-17 将商品编号为 0008 的数据(圆珠笔)的登记日期更新为 NULL
            UPDATE Product
            SET regist_date = NULL
            WHERE product_id = '0008';

                和 INSERT 语句一样, UPDATE 语句也可以将 NULL 作为一个值来使用。

            但是,只有未设置 NOT NULL 约束和主键约束的列才可以清空为NULL 。如果将设置了上述约束的列更新为 NULL ,就会出错,这点与INSERT 语句相同。

            多列更新

                UPDATE 语句的 SET 子句支持同时将多个列作为更新对象。例如我们刚刚将销售单价( sale_price )更新为原来的10 倍,如果想同时将进货单价( purchase _ price )更新为原来的一半,该怎么做呢?最容易想到的解决办法可能就是像代码清单 4-18 那样,执行两条 UPDATE 语句。

              代码清单4-18 能够正确执行的繁琐的 UPDATE 语句
              -- 一条 UPDATE 语句只更新一列
              UPDATE Product
              SET sale_price = sale_price * 10
              WHERE product_type = ' 厨房用具 ';
              UPDATE Product
              SET purchase_price = purchase_price / 2
              WHERE product_type = ' 厨房用具 ';

                   虽然这样也能够正确地更新数据,但执行两次 UPDATE 语句不但有些浪费,而且增加了 SQL 语句的书写量。其实,我们可以将其合并为一条 UPDATE 语句来处理。合并的方法有两种,请参见代码清单 4-19 和代码清单 4-20。

                方法①:代码清单4-19 将代码清单4-18的处理合并为一条 UPDATE 语句
                -- 使用逗号对列进行分隔排列
                UPDATE Product
                SET sale_price = sale_price * 10,
                purchase_price = purchase_price / 2
                WHERE product_type = ' 厨房用具 ';
                  方法②:代码清单4-20 将代码清单4-18的处理合并为一条 UPDATE 语句
                  -- 将列用 () 括起来的清单形式
                  UPDATE Product
                  SET (sale_price, purchase_price) = (sale_price * 10, 
                  purchase_price / 2)
                  WHERE product_type = ' 厨房用具 ';

                       执行上述两种 UPDATE 语句,都可以得到相同的结果:只有厨房用具的销售单价( sale_price )和进货单价( purchase _ price )被更新了。

                      当然, SET 子句中的列不仅可以是两列,还可以是三列或者更多。需要注意的是第一种方法——使用逗号将列进行分隔排列(代码清单4-19),这一方法在所有的 DBMS 中都可以使用。但是第二种方法——将列清单化(代码清单 4-20),这一方法在某些 DBMS中是无法使用的 。因此,实际应用中通常都会使用第一种方法。

                  总结:   

                      ● 使用 UPDATE 语句可以更改(更新)表中的数据。

                      ● 更新部分数据行时可以使用 WHERE 来指定更新对象的条件。通过 WHERE

                      子句指定更新对象的 UPDATE 语句称为搜索型 UPDATE 语句。

                      ● UPDATE 语句可以将列的值更新为 NULL 。

                      ● 同时更新多列时,可以在 UPDATE 语句的 SET 子句中,使用逗号分隔更

                      新对象的多个列。

                  文章转载自java大本营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论