SQL 数据更新

发布于 2020-07-21 21:49:53   阅读量 38  点赞 0  

一、INSERT 数据插入

INSERT语句用于向数据库中插入记录。基本语法为:

INSERT INTO <表名> (列1,列2,列3,...) VALUES (值1,值2,值3,...);

 其中将列名与值用逗号隔开,分别写在()内,这种形式称为清单。其中表名后面的清单称为列清单,VALUES关键字后面的清单称为值清单。

 列清单无需按照字段顺序书写,但是值清单必须与列清单对应。

 列清单中也无需包含所有的字段,对于未在列清单中列出的字段,会设置为默认值。


1. 多行 INSERT

 很多DBMS都支持在一句INSERT语句中插入多行记录。

// MySQL
INSERT INTO <表名> (列1,列2,列3,...) VALUES (值1,值2,值3,...),
                                    VALUES (值1,值2,值3,...),
                                            ...
                                    VALUES (值1,值2,值3,...);


2. 列清单的省略

 对于表进行全列INSERT时,可以省略表名后面的列清单。这时VALUES子句的值会按照表结构中字段从左到右的顺序赋值给每一列。


3. 插入 NULL

INSERT子句中若想给某一列赋值为NULL时,可以直接在VALUES子句的值清单中写入关键字NULL。但是,前提是列的约束不能为NOT NULL


4. 插入默认值

 默认值是通过在CREATE TABLE建表时设置DEFAULT约束来设定的:

CREATE TABLE <表名>
(列名,类型,DEFAULT <默认值>,
    ...
);

 也可以在ALTER TABLE添加列时:

ALTER TABLE <表名> ADD COLUMN (列名,类型,DEFAULT <默认值>);

总而言之,在进行列定义时,都可以使用DEFAULT关键字指定字段的默认值。


① 显示插入默认值

 在VALUES子句中指定值清单时,能够在对应位置使用DEFAULT关键字将默认值赋值给对应的列。


② 隐式插入默认值

 插入默认值时也可以不使用DEFAULT该男子,只要在列清单与值清单中省略设定了默认值的字段即可。

 而省略了没有设定默认值的列,该列会被赋值为NULL。故前提是列的约束中没有NOT NULL



5. 从其他表中复制数据

 要插入数据,除了使用VALUES语句指定的数据外,还可以从其他表中复制数据:

INSERT INTO <目标表> (列清单) SELECT 列清单 FROM <源表>;

SELECT语句也可以使用WHERE子句或GROUP BY子句。



二、DELETE 数据删除

 使用DROP TABLE语句可以删除整个表,而使用DELETE语句会留下表,而删除表中的记录。

  1. 删除表中全部记录:
    DELETE FROM <表名>;
    

  2. 删除表中指定记录:
    DELETE FROM <表名>
    WHERE <条件>;
    


DELETE语句中不能使用GROUP BYHAVINGORDER BY等子句,只能使用WHERE子句。


舍弃

 标准 SQL 的删除语句只有DELETE语句,但很多数据库产品还提供了另一种删除语句——TRUNCATE(舍弃)。TRUNCATE只能用于删除表中所有记录。

TRUNCATE <表名>;

TRUNCATE相对于DELETE的优点在于执行时间短,故对于删除全部数据行的情况,可以使用TRUNCATE语句。



三、UPDATE 数据更新

 使用UPDATE语句能够更改表中原有的数据。

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

 该语句表示:将该列的值都设为指定的值。

SET子句中赋值表达式的右边不仅可以是单纯的值,还可以是包含列的表达式。(如在列中原值上+100)


1. 指定条件的更新

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

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


2. 更新为 NULL

 使用UPDATE也可以将字段更新为NULL,只需将赋值表达式右边的值直接写为NULL关键字即可。

 同样的,这样做要求列的定义没有NOT NULL约束。


3. 多列更新

UPDATE语句的SET子句支持同时将多个列作为更新对象。

  1. 分隔排列

    UPDATE <表名>
    SET <列名1> = <表达式1>,
     <列名2> = <表达式2>
         ...
    WHERE <条件表达式>;
    
  2. 清单化

    UPDATE <表名>
    SET (列名1,列名2,...) = (表达式1,表达式2,...)
    WHERE <条件表达式>;
    


需要注意的是,以上第一种方法在所有DBMS中都适用,而第二种方法在某些DBMS中是无法使用的。



四、事务

 在DBMS中,事务是对表中数据进行更新的单位,事务就是需要在同一个处理单元中执行的一系列更新处理的集合。

1.创建事务

 在BDMS中创建事务的语法如下:

事务开始语句;
    DML 语句1;
    DML 语句2;
    ...
事务结束语句(COMMIT或ROLLBACK);

 在事务开始语句与结束语句之间,写入一系列DML语句(INSERT/UPDATE/DELETE),就形成了一个事务处理。

 事务的开始语句,是由每个DBMS自己定义的:

  • SQL Server、PostgreSQL:BEGIN TRANSACTION

  • MySQL:START TRANSACTION

而结束事务的指令一般有两种:

① COMMIT 提交

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


② ROLLBACK 回滚

ROLLBACK是取消事务的全部更新操作的结束指令,相当于文件处理的退出且不保存。一旦回滚,数据库就会恢复到事务开始之前的状态。



2. ACID 特性

DBMS的事务需要遵守四种特性:

  • 原子性(Atomicity):在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行。

  • 一致性(Consistency):事务中包含的处理要满足数据库提前设置的约束,以保持存入的数据在这些约束上是一致的(如主键约束或NOT NULL)。对于事务来说,不合法的 SQL 将会被回滚。

  • 隔离性(Isolation):不同事务之间互不干扰。

  • 持久性(Durability):在事务结束(提交或回滚)后,DBMS能够保证该时间点的数据状态会被保持(持久化)。即使由于系统故障导致数据丢失,数据库也能通过某种手段进行恢复。


Last Modified : 2020-07-23 15:03:54