SQL基础——数据更新(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: SQL基础——数据更新(下)

代码示例4.10 删除销售单价(sale_price)大于等于4000日元的数据

DELETE FROM Product
where sale_price >=4000;

注意:可以通过WHERE子句指定对象条件来删除部分数据。

删除和舍弃

标准SQL中用来从表中删除数据的只有DELETE语句。但是,很多数据库产品中还存在另外一种被称为TRUNCATE的语句。这些产品主要包括Oracle、SQL Server、PostgreSQL、MySQL和DB2
TRUNCATE

是舍弃的意思,具体的使用方法如下所示。

语法4.A 只能删除表中全部数据的TRUNCATE语句

TRUNCATE<表名>;

与DELETE之间的区别是,TRUNCATE智能删除表中的全部数据,如果通过使用WHERE子句来指定条件进行删除部分数据。正是由于它不能具体的控制删除对象,所以他的处理速度比DELETE要快的多,因此要删除全部数据行时,使用TRUNCATE可以缩短执行时间。


但是,产品不同需要注意的地方也不尽相同。例如在Oracle中,把TRUNCATE定义为DDL,而不是DML。使用TRUNCATE时,请大家仔细阅读使用手册,多加注意。便利的工具往往还是会存在一些不足之处的。

数据的更新(UPDATE语句的使用方法)

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

UPDATE语句的基本语法

和INSERT语句、DELETE语句一样,UPDATE语句也属于DML语句。通过执行该语句,可以改变表中的数据。

语法4.4 改变表中的数据的UPDATE语句

UPDATE <表名> 
SET <列名> = <表达式>;

代码示例 4.11 将登记日期全部更新为"2022-12-17"

UPDATE Product
SET regist_date ='2022-12-17';

查看更新结果

select * FROM Product;

执行结果



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

更新数据时也可以像DELETE语句那样使用WHERE语句子句,这种指定更新对象的UPDATE语句成为搜索型UPDATE语句。

语法4.5 更新部分数据行的搜索型UPDATE

UPDATE <表名> 
SET <列名> = <表达式> 
WHERE
    <条件>;

代码示例 4.12 将商品种类为厨房用具的记录的销售单价更新为原来的10倍

UPDATE Product 
SET sale_price = sale_price * 10 
WHERE
    product_type = '厨房用具';

更新之后的结果



使用NULL进行更新

使用UPDATE也可以将列更新为NULL(俗称为NULL清空),只需要将赋值表达式右边的值直接写成NULL即可。

多列更新

UPDATE语句的SET子句支持同时将多个列作为更新对象。例如我们刚刚将销售单价(sale_price)更新为原来的10倍,如果想同时将进货单价(purchase_price)更新为原来的一半。

将看似需要两条UPDATE语句合并为一条UPDATE语句

方式①代码示例4.13

-- 使用逗号对列进行分隔排列
UPDATE Product 
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2 
WHERE
    product_type = '厨房用具';

事务

事务是需要在同一个处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理。

事务就是需要在用一个处理单元中执行一系列更新处理的集合。

创建事务

如果想在DBMS中创建事务,课按照如下语法结构编写SQL语句。

语法4.6 事务的语法

事务开始语句;
DML语句①;
DML语句②;
DML语句③;
...
事务结束语句( COMMIT或者ROLLBACK);

使用事务开始语句和事务结束语句,将一系列DML语句(INSERT/UPDATE/DELETE语句)括起来,就实现一个事务处理。

代码示例4.15 更新商品信息的事物

 SQL Server  PostgreSQL
BEGIN TRANSACTION;    -- 将运动T恤的销售单价降低1000日元    
UPDATE Product       
SET sale_price = sale_price - 1000    
WHERE product_name = '运动T恤';    
-- 将T恤衫的销售单价上浮1000日元    
UPDATE Product       
SET sale_price = sale_price + 1000     
WHERE product_name = 'T恤衫';COMMIT;
MySQL
START TRANSACTION;    -- 将运动T恤的销售单价降低1000日元    
UPDATE Product       
SET sale_price = sale_price - 1000    
 WHERE product_name = '运动T恤'; 
 -- 将T恤衫的销售单价上浮1000日元    
 UPDATE Product       
 SET sale_price = sale_price + 1000     
 WHERE product_name = 'T恤衫';
 COMMIT;
 Oracle  DB2
-
- 将运动T恤的销售单价降低1000日元
UPDATE Product 
  SET sale_price = sal
e_price - 1000 
WHERE product_name = '
运动T恤';-
- 将T恤衫的销售单价上浮1000日元
UPDATE Product 
  SET sale_price = sal
e_price + 1000 
WHERE product_name = 'T恤衫';
COMMIT;

注意:各个DBMS事务的开始语句都不尽相同,其中Oracle和DB2并没有定义特定的开始语句。

COMMIT——提交处理

COMMIT是提交事物包含的全部更新处理的借宿指令,相当于文件处理中的覆盖保存。一旦提交,就无法恢复到事务开始前的状态了。

注意:虽然我们可以不清楚事务开始的时间点,但是在事务结束时一定要仔细进行确认。

代码示例4.16 事务回滚的例子(MYSQl)

--mysql
START TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product       SET sale_price = sale_price - 1000
WHERE
    product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元    
UPDATE Product       SET sale_price = sale_price + 1000
WHERE
    product_name = 'T恤衫';
ROLLBACK;

上述事务处理执行之后,表中的数据不会发生任何改变。这是因为执行最后一行的ROLLBACK

之后,所有的处理都被取消了.



事务何时开始

事务并没有标准的开始指令存在,而是根据DBMS不同而不同。

实际上,几乎所有的数据库产品的事务都无需事务开启的指令。这是因为绝大多数情况下,事务在数据库建立连接的时候已经悄悄开始了,并不需要用户再明确发出开始指令。例如:使用Oracle时,数据库连接建立之后,第一条SQL语句执行的同时,事务已经悄悄开始了。

像这样不使用指令而悄悄开始事务的情况下,如果区分各个事物呢?通常由两种情况。

每条SQL语句就是一个事务(自动提交模式)

直到用户执行COMMIT或者ROLLBACK为止算作一个事务。

自动提交模式

通常的DBMS都可以选择其中任意一种模式。默认使用自动提交模式的DBMS有SQL Server、PostgreSQL和MySQL等 DML语句如下所示,每一条语句都括在事务的开始语句和结束语句之中。

---mysql
 START TRANSACTION;    
 -- 将运动T恤的销售单价降低1000日元    
 UPDATE Product       
 SET sale_price = sale_price - 1000     
 WHERE product_name = '运动T恤';
 COMMIT;
 START TRANSACTION;    
 -- 将T恤衫的销售单价上浮1000日元    
 UPDATE Product       
 SET sale_price = sale_price + 1000     
 WHERE product_name = 'T恤衫';
 COMMIT;

ACID特性

DBMS的事务都遵循四种特性,将这四种特性的首字母结合起来统称为ACID特性。这是所有DBMS都必须遵守的规则。

原子性(Atomicity)

原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有。

一致性(Consistency)

一致性指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者NOT NULL约束等。例如,设置了NOT NULL约束的列是不能更新为NULL的,试图插入违反主键约束的记录就会出错,无法执行。对事务来说,这些不合法的SQL会被回滚。也就是说,这些SQL处理会被取消,不会执行。

隔离性(Isolation)

隔离性指的是保证不同事务之间互不干扰的特性。该特性保证了事务之间不会互相嵌套。此外,在某个事务中进行的更改,在该事务结束之前,对其他事务而言是不可见的。因此,即使某个事务向表中添加了记录,在没有提交之前,其他事务也是看不到新添加的记录的。

持久性(Durability)

持久性也可以称为耐久性,指的是在事务(不论是提交还是回滚)结束后,DBMS能够保证该时间点的数据状态会被保存的特性。即使由于系统故障导致数据丢失,数据库也一定能通过某种手段进行恢复。

如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 数据处理 数据库
SQL进阶之路:深入解析数据更新与删除技巧——掌握批量操作、条件筛选、子查询和事务处理,提升数据库维护效率与准确性
【8月更文挑战第31天】在数据库管理和应用开发中,数据的更新和删除至关重要,直接影响数据准确性、一致性和性能。本文通过具体案例,深入解析SQL中的高级更新(UPDATE)和删除(DELETE)技巧,包括批量更新、基于条件的删除以及使用子查询和事务处理复杂场景等,帮助读者提升数据处理能力。掌握这些技巧能够有效提高数据库性能并确保数据一致性。
76 0
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之当 SQL Server 源数据库中的数据更新后,CDC 吐出的操作(op)是怎样的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据更新
【数据库SQL server】关系数据库标准语言SQL之数据更新
61 0
|
SQL 数据库 数据库管理
第3章 关系数据库标准语言SQL——3.5 数据更新
第3章 关系数据库标准语言SQL——3.5 数据更新
|
SQL Oracle 关系型数据库
SQL基础——数据更新(上)
SQL基础——数据更新(上)
145 0
|
SQL 数据库管理
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
本篇文章讲解的主要内容是:***你有没有经历过一个update把其他列数据清空了、使用merge更新合并记录、删除违反参照完整性的记录、给你五种删除重复数据的写法*** 【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
|
SQL 数据格式
SQL之数据更新(操纵)
SQL之数据更新(操纵)
149 0
|
SQL 数据库管理
SQL的数据更新
SQL的数据更新
82 0
|
SQL Oracle 关系型数据库
一次难忘的Oracle数据更新经历,用游标?还是用动态SQL?
最近工作中遇到一个比较棘手的问题,拿出来和大家分享一下。
一次难忘的Oracle数据更新经历,用游标?还是用动态SQL?