数据的更新
生命不可能有两次,但许多人连一次也不善于度过。——吕凯特
数据的插入(INSERT 语句的使用方法)
学习重点
使用 INSERT 语句可以向表中插入数据(行)原则上,INSERT 语句每次执行一行数据的插入
将列名和值用逗号隔开,分别括在()内,这种形式称为清单
对表中所有列进行 INSERT 操作时可以省略表名后的列清单
插入 NULL 时 需要在 VALUES 子句的值清单中写入 NULL
可以为表中的列设定默认值(初始值),默认值可以通过在 CREATE TABLE 语句中为列设置 DEFAULT 约束来设定
插入默认值可以通过两种形式实现,即在 INSERT 语句的 VALUES 子句中指定 DEFAULT 关键字(显示方法)或者省略列清单(隐式方法)
使用 INSERT…SELECT 可以从其他表中复制数据
什么是 INSERT
INSERT 语句的基本语法
INSERT INTO <表名> (列1,列2, 列3,....) VALUES (值1,值2,值3,....);
- 实践操作
INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
由于 product_id(商品编号)和 product_name 列(商品名称)是字符型,所以插入数据需要像 ‘0001’ 是字符型所以需要单引号括起来
多行插入 INSERT
- 多行 VALUES 需要用()和逗号间隔
INSERT INTO ProductIns VALUES ('0002', '打孔器','办公用品', 500, 320, '2009-09-11'),('0003', '运动T恤','衣服', 4000, 2800, NULL),('0004', '菜刀','厨房用具', 3000, 2800, '2009-09-20');
对全表的数据插入的时候可以省略表名后的列清单。这时 VALUES 子句的值会默认从左到右的顺序赋给每一列。
插入 NULL
INSERT 语句中想给某一列赋予 NULL 值,可以直接在 VALUES 子句的值清单中写入 NULL,比如
INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0006', '叉子','厨房用具', 500, NULL, '2009-09-20');
但是想要插入 NULL 的列一定不能设置 NOT NULL 约束,向设置了 NOT NULL 约束的列中插入 NULL 时,INSERT 语句会报错,导致数据插入失败
插入失败指的是希望通过 INSERT 语句插入的数据无法正常插入到表中,但是之前插入的数据并不会遭到破坏
插入默认值
- 我们还可以向表中插入默认值(初始值).可以通过在创建表的 CREATE TABLE 语句中设置 DEFAULT 约束来设定默认值
CREATE TABLE ProductIns
(product_id CHAR(4) NOT NULL,
(略)
sale_price INTEGER DEFAULT 0, -- 销售单价的默认值设定为0;
(略)
PRIMARY KEY (product_id));
- 通过显式方法插入默认值
INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0007','擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28');
- 通过隐式方法插入默认值
插入默认值也可以不使用 DEFAULT 关键字,只要在列清单和 VALUES 中省略设定了默认值的列就可以了
INSERT INTO ProductIns (product_id, product_name, product_type,purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具',790, '2009-04-28');
上面那个例子就没有了默认值那个列 插入的值也没有默认值
从其他表中复制数据
INSERT INTO ProductCopy (product_id, product_name, product_type,sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price,purchase_price, regist_date FROM Product;
INSERT 语句的 SELECT 语句中可以使用 WHERE 子句或者 GROUP BY 子句等语法
数据的删除(DELETE 语句的使用方法)
学习重点
如果想整个表全部删除,可以使用 DROP TABLE 语句 如果只想删除表中全部数据,需要使用 DELETE 语句
如果想删除部分数据行,只需要 WHERE 子句中书写对象数据的条件即可
通过 WHERE 子句指定删除对象的 DELETE 语句称为搜索型 DELETE 语句
DROP TABLE 和 DELETE 语句
DROP TABLE 可以将表完全删除
DELETE 语句会留下表(容器) 而删除表中的全部数据
DELETE 基本语法
DELETE FROM Product
如果忘写了 FROM 或者写了多余的列名 都会出错
指定删除对象的 DELETE 语句(搜索型 DELETE)
- 基本语法
DELETE FROM 表名 WHERE <条件>;
- 实例化
DELETE FROM Product WHERE sale_price >=400;
- 在比如删除价格大于等于 4000 日元的数据
DELETE FROM Product WHERE sale_price >= 4000;
DELETE 语句中不能使用 GROUP BY ,ORDER BY ,HAVING 语句,而且只能使用 WHERE 子句
舍弃和删除 TRUNCATE
TRUNCATE <表名>
TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 来删除
TRUNCATE 删除的速度比 DELETE FROM 快了很多
数据的更新(UPDATE 语句的使用方法)
UPDATE 语句的基本用法
- 基本语法 UPDATE SET
UPDATE <表名> SET <列名> = <表达式>;
- 实例化
UPDATE Product SET regist_date = '2009-10-10';
指定条件的 UPDATE 语句
UPDATE <表名> SET <列名> = <表达式> WHERE <条件>;
- 实例化
UPDATE Product SET sale_price = sale_price * 10 WHERE product_type = '厨房用具';
使用 NULL 进行更新
- 使用 UPDATE 将列更新为 NULL
UPDATE Product SET regist_date = NULL WHERE product_id = '0008';
多列更新
- UPDATE 语句的 SET 子句支持同时将多个列作为更新对象.
UPDATE Product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '厨房用具';
- 第二种方法
UPDATE Product
SET (sale_price, purchase_price) = (sale_price * 10,
purchase_price / 2)
WHERE product_type = '厨房用具';
一般都会选择第一种方法
事务
事务是需要在同一个处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理
事务处理的终止指令包括 COMMIT(提交处理)和 ROLLBACK(取消处理) 两种
DBMS 的事务具有 原子性,一致性,隔离性,持久性(四种特性) 将四种首字母结合起来,统称为 ACID 特性
有的时候又需要对一列进行增加 又得对另外的列进行减少 把一次需要进行 2 条以上的语句,我们称为事务。事务就需要在同一个处理单元执行的一系列更新处理的集合
事务简单来说一句话
没有执行到 COMMIT,所有的操作都能还原.回滚
创建事务
- 基础语法
事务开始语句;
DML语句1;
DML语句2;
DML语句3;
......
事务结束语句(COMMIT或者ROLLBACK);
- 事务开始的语句
START TRANSACTION
- 事务结束的语句
COMMIT 提交
COMMIT;
或
ROLLBACK;
- 实例化
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;
ROLLBACK – 取消处理
- ROLLBACK 是取消事务包含的全部更新处理的结束指令,相当于文件处理中的放弃保存,一旦回滚.数据库就会恢复到事务开始之前的状态.通常回滚并不会像提交那样造成大规模的数据损失
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;
ACID 特性
- 原子性(Atomicity)
原子性 指在事务结束时,其中所包含的更新处理要么全部执行,要么全部不执行.
- 一致性(Consistency)
一致性 指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者 NOT NULL 等。
比如对于事务来说,这些不合法的 SQL 会被回滚.也就是说这些 SQL 处理会被取消,不会被执行.
一致性也叫完整性
比如 事务里面有 4 条操作语句 1,2 能执行但是 3 报错了,3 就不执行了,4 会继续执行
- 隔离性(Isolation)
隔离性指的是不同事务之间互不干扰的特性。事务之间不会互相嵌套.
比如即使某个事务向表中添加了记录,在没有提交之前,其他事务是看到不到新添加的
- 持久性(Durability)
持久性也可以成为耐久性,也指的是在事务结束后,DBMS 能够保证该时间点的数据状态会保存的特性。即使由于系统故障导致数据丢失,数据库也能通过一些手段恢复。
通常就是把事务的执行记录保存在硬盘等存储介质中(一般叫做日志),当故障发生后,可以通过日志恢复到故障发生前的状态