SQL 基础知识梳理(四) - 数据更新
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5929786.html
序
这是《SQL 基础知识梳理(三) - 聚合和排序》的下篇。
目录
一、插入数据
1.INSERT 语句的基本语法
--语法:
--INSERT INTO <表名>(列1, 列2, ...) VALUES (值1, 值2, ...)
--示例
INSERT INTO dbo.Shohin
( shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
)
VALUES ( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
500 , -- shiire_tanka - int
GETDATE() -- torokubi - date
);
(1)列名和值用逗号隔开,分别放在括号里,这种形式称为清单。
( shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
)
--列清单 ( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
500 , -- shiire_tanka - int
GETDATE() -- torokubi - date
)
--值清单
INSERT INTO dbo.Shohin
( shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
)
VALUES ( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
500 , -- shiire_tanka - int
GETDATE() -- torokubi - date
),
( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
500 , -- shiire_tanka - int
GETDATE() -- torokubi - date
);
一次性多行 INSERT
2.省略列清单
INSERT INTO dbo.Shohin
VALUES ( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
500 , -- shiire_tanka - int
GETDATE() -- torokubi - date
);
3.插入 NULL 值
INSERT INTO dbo.Shohin
VALUES ( '' , -- shohin_id - char(4)
'T 恤衫' , -- shohin_mei - varchar(100)
'衣服' , -- shohin_bunrui - varchar(32)
1000 , -- hanbai_tanka - int
NULL , -- shiire_tanka - int
GETDATE() -- torokubi - date
);
【备注】插入 NULL 值的列不能设置为 NOT NULL 约束。
4.插入默认值
--示例:创建表时设置默认值
CREATE TABLE ShohinIns
(
id CHAR(4) NOT NULL,
num INT DEFAULT 0 --DEFAULT 默认约束
)
--示例:INSERT 时显示插入默认值
INSERT INTO dbo.ShohinIns
( id, num )
VALUES ( '', -- id - char(4)
DEFAULT -- num - int
)
--示例:INSERT 隐式插入默认值
INSERT INTO dbo.ShohinIns( id )
VALUES ('')
【备注】建议使用显示的方式插入值。如果插入的时候隐式省略了列名,并且该列没有指定默认值的时候,该列的值会被设定为 NULL(如果省略的列设置了 NOT NULL 约束的话,执行会报错)。
【总结】省略 INSERT 语句的列名,就会自动设定该列的默认值(没有默认值时会设定为 NULL)。
5.从其它表复制数据
--语法
INSERT ...
SELECT ...
--示例
INSERT dbo.ShohinIns
( id, num )
SELECT shohin_id, shiire_tanka
FROM dbo.Shohin
--示例
INSERT INTO dbo.ShohinIns
( id, num )
SELECT id=1, num =2;
--示例
INSERT INTO dbo.ShohinIns
( id, num )
SELECT 1, 2;
【备注】INSERT 语句中的 SELECT 语句中,可以使用 WHERE 子句或者 GROUP BY 子句等任何 SQL 语法。(但使用 ORDER BY 子句并不会产生任何效果。)
二、删除数据
1.2 种 删除数据的方法:
(1)DROP TABLE 语句:删除表
(2)DELETE 语句:删除表的数据
--语法
--DELETE FROM <表名>;
--示例
DELETE FROM dbo.ShohinIns;
【备注】DELETE 语句删除的对象是记录(行),不是表和列。
2.指定删除对象的 DELETE 语句
--语法
--DELETE FROM <表名>
--WHERE <条件>;
--示例
DELETE FROM dbo.Shohin
WHERE hanbai_tanka >= 4000;
【备注】可以通过 WHERE 子句指定对象条件来删除部分数据。
【备注】DELETE 语句中不能使用 GROUP BY、HAVING 和 ORDER BY 三类子句。
【备注】如果要删除表全部数据时请使用 TRUNCATE <表名>,它比 DELETE 子句更高效。
三、更新数据
1.UPDATE 子句的基本语法
--语法
--UPDATE <表名>
-- SET <列名> = <表达式>
2.指定条件的 UPDATE 语句
--语法
--UPDATE <表名>
-- SET <列名> = <表达式>
--WHERE <条件>;
--示例
UPDATE dbo.Shohin
SET hanbai_tanka = hanbai_tanka * 10
WHERE shohin_bunrui = '厨房用具';
3、使用 NULL 进行更新
--示例
UPDATE dbo.Shohin
SET torokubi = NULL
WHERE shohin_id = '';
【备注】只有未设置 NOT NULL 约束和主键约束的列才可以清空为 NULL。
4.多列更新
--示例
UPDATE dbo.Shohin
SET hanbai_tanka = hanbai_tanka * 10, --逗号分割
shiire_tanka = shiire_tanka / 2
WHERE shohin_bunrui = '厨房用具'
四、事务
1.事务:需要在同一个处理单元中执行的一系列更新处理的集合。
2.创建事务:
--语法
--事务开始语句
-- DML 语句①;
-- DML 语句②;
-- ...
--事务结束语句(COMMIT 或 ROLLBACK);
(1)COMMIT - 提交处理:提交事务包含的全部更新处理的结束指令。一旦提交,无法恢复到事务开始前的状态。
(2)ROLLBACK - 取消处理:取消事务包含的全部更新处理的结束指令。一旦回滚,数据库就会回复到事务开始之前的状态。
--示例
BEGIN TRANSACTION;
UPDATE dbo.Shohin
SET hanbai_tanka = hanbai_tanka - 1000
WHERE shohin_mei = '运动 T 恤'; UPDATE dbo.Shohin
SET hanbai_tanka = hanbai_tanka + 1000
WHERE shohin_mei = 'T 恤衫'; DELETE FROM dbo.Shohin WHERE shohin_id = ''; ROLLBACK; -- COMMIT
3.ACID 特性
(1)原子性(Atomicity):在事务结束时,其中包含的更新处理要么全部执行,要么完全不执行。
(2)一致性(Consistency):事务中包含的处理,要满足数据库提前设置的约束,也称完整性。
(3)隔离性(lsolation):保证不同事务之前互不干扰的特性。
(4)持久性(Durability):事务一旦结束,DBMS 会保证该时点的数据状态得以保存的特性,也称耐久性。
备注
这里采用 MS SQL Server 进行验证,不保证所有的 DBMS 执行结果正确。
传送门
【参考】《SQL ゼロからはじめるデータベース操作》