3.5 命令方式操作表数据
对表数据的插入、修改和删除还可以通过T-SQL语句来进行,与界面操作表数据相比,通过T-SQL语句操作表数据更为灵活,功能更为强大。
3.5.1 插入记录:INSERT
插入记录使用INSERT语句,语法格式如下:
INSERT [ TOP ( 表达式 ) [ PERCENT ] ] [ INTO ] 表名 | 视图名 [ ( 列表 ) ] VALUES ( DEFAULT | NULL | 表达式 … ) / *指定列值* / | DEFAULT VALUES / *强制新行包含为每个列定义的默认值* /
说明
(1)表名:被操作的表的名称。前面可以指定数据库名和架构名。
(2)视图名:被操作的视图名称。有关视图的内容将在第4章中介绍。
(3)列表:需要插入数据的列的列表。包含了新插入行的各列的名称。如果只给表的部分列插入数据时,需要用“列列表”指出这些列。
例如,当加入表中的记录的某些列为空值或为默认值时,可以在INSERT语句中给出的“列表”中省略这些列。没有在“列表”中指出的列,它们的值根据默认值或列属性来确定,其原则如下。
① 具有IDENTITY属性的列,其值由系统根据初值和增量值自动计算得到;
② 具有默认值的列,其值为默认值;
③ 没有默认值的列,若允许为空值,则其值为空值;若不允许为空值,则出错;
④ 类型为timestamp的列,系统自动赋值;
⑤ 如果是计算列,则使用计算值。
(4)VALUES子句:包含各列需要插入的数据清单,数据的顺序要与列的顺序相对应。若省略“列列表”,则VALUES子句给出每一列(除IDENTITY属性和timestamp类型以外的列)的值。VALUES子句中的值可有以下3种。
① DEFAULT:指定为该列的默认值。这要求定义表时必须指定该列的默认值。
② NULL:指定该列为空值。
③ 表达式:可以是一个常量、变量或一个表达式,其值的数据类型要与列的数据类型一致。例如,列的数据类型为int,若插入的数据是'aaa'就会出错。当数据为字符型时,要用单引号括起来。
(5)DEFAULT VALUES:该关键字说明向当前表中所有列均插入其默认值。此时,要求所有列均定义了默认值。
【例3.6】向test1数据库的表xsb1中插入如下一行数据:
191301, 王林, 1, 1990-02-10, 计算机, 50 , NULL
在“SSMS”中单击“新建查询”,在“查询编辑器”中输入下列T-SQL命令:
USE test1 GO INSERT INTO xsb1 VALUES('191301', '王林', 1, '1990-02-10', '计算机',50, NULL) GO
语句的执行结果如图3.6所示。
图3.6 使用T-SQL语句向表中插入数据
注意
若插入数据行中含有与原有行中关键字相同的列值,则INSERT语句无法插入此行。
例如,如果重复执行上述命令,系统显示错误信息,如图3.7所示。
图3.7 显示错误信息
说明
插入上例数据也可以使用以下命令:
INSERT INTO xsb1 (学号, 姓名, 性别, 出生时间, 总学分) VALUES('191301', '王林', 1, '1990-02-10', 50)
或者:
INSERT INTO xsb1 VALUES('191301', '王林', 1, '1990-02-10', DEFAULT,50, NULL);
INSERT语句可以一次向表中插入多条记录,中间用逗号隔开。
【例3.7】一次向test1数据库xsb1表中插入两行数据:
'201301', '王海', 1, '1996-05-10', '软件工程', 50, NULL '201302', '李娜', 0, '1996-04-12', '软件工程', 52, NULL
命令如下:
INSERT INTO xsb1 VALUES('201301', '王海', 1, '1991-05-10', '软件工程', 50, NULL), ('201302', '李娜', 0, '1991-04-12', '软件工程', 52, NULL)
【例3.8】从test1数据库表xsb1中生成计算机专业的学生表(xsb2),包括学号、姓名、出生时间、总学分、备注。
(1)用界面方式或者CREATE TABLE语句建立表xsb2,表结构与xsb1相同。
(2)用INSERT语句向xsb2表中插入数据:
INSERT INTO xsb2 SELECT * FROM xsb1 WHERE专业= '计算机'
(3)使用SELECT语句从xsb2表中查询结果:
SELECT * FROM xsb2 / * xsb1表的内容* /
执行结果如图3.8所示。
图3.8 执行结果
在执行INSERT语句时,如果插入的数据与约束或规则的要求产生冲突,或值的数据类型与列的数据类型不匹配,那么INSERT执行失败。
3.5.2 修改记录:UPDATE
在T-SQL中,UPDATE语句可以用来修改表中的数据行。
语法格式:
UPDATE [ TOP ( 表达式 ) [ PERCENT ] ] { 表名 | 视图名 } SET { 列名=表达式, … } / *赋予新值* / [ FROM <表源> …] [ WHERE <查找条件> | … ] / *指定条件* / ……
说明
(1)SET子句:用于指定要修改的列或变量名及其新值。
(2)FROM子句:指定用表来为更新操作提供数据。
(3)WHERE子句:WHERE子句中的<查找条件>指明只对满足该条件的行进行修改,若省略该子句,则对表中的所有行进行修改。
【例3.9】将test1数据库的xsb1表中学号为“191301”的学生的备注值改为“外校互认学分课程”,同时将总学分+3。
USE test1 GO UPDATE xsb1 SET 备注 = '外校互认学分课程', 总学分 = 总学分+3 WHERE学号='191301' GO
执行完上述语句后,xsb1表学号为“191301”的学生的记录如图3.9所示。
图3.9 修改数据以后的表
说明
对于学生成绩管理数据库,一般来说,学生表(xsb)总学分字段数据增加是由于在成绩表(cjb)中增加了记录(学生上一门课成绩合格),这两个表的记录修改命令是一起完成的。
3.5.3 删除记录:DELETE/TRUNCATE TABLE
在T-SQL语言中,删除表数据可以使用DELETE语句或TRUNCATE TABLE语句来实现,分别用于删除表中符合条件的记录和所有记录。
1. 删除符合条件记录
语法格式:
DELETE [ TOP ( 表达式 ) [ PERCENT ] ] [ FROM 表名 | 视图名 | <表源> ] [ WHERE <查找条件> | … ] / *指定条件* /
说明
(1)[TOP(表达式)[PERCENT]]:指定将要删除的任意行数或任意行的百分比。
(2)FROM子句:说明从何处删除数据。可以从以下3种类型的对象中删除数据。
表:由“表名”指定要从其中删除数据的表,关键字WITH指定目标表所允许的一个或多个表提示,一般情况下不需要使用WITH关键字。
视图:由“视图名”指定要从其中删除数据的视图,注意该视图必须可以更新,并且正确引用了一个基本表。
表源:将在介绍SELECT语句时详细讨论。
(3)WHERE子句:为删除操作指定条件。若省略WHERE子句,则DELETE语句将删除所有数据。
【例3.10】将test1数据库的xsb1表中总学分为0的行删除,使用如下语句:
USE test1 GO DELETE FROM xsb1 WHERE总学分 = 0 GO
2. 删除表中所有记录
使用TRUNCATE TABLE语句将删除指定表中的所有数据,因此也称为清除表数据语句。
语法格式:
TRUNCATE TABLE 表名
说明
(1)使用TRUNCATE TABLE语句删除了指定表中的所有行,但表结构及其列、约束、索引等保持不变,而新行标识所用的计数值重置为该列的初始值。如果要保留标识计数值,则要使用DELETE语句。
(2)“TRUNCATE TABLE表名”与“DELETE表名”二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每一行记录一项。而TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
对于由外键(FOREIGN KEY)约束引用的表,不能使用TRUNCATE TABLE语句删除数据,而应使用不带WHERE子句的DELETE语句。另外,TRUNCATE TABLE语句也不能用于参与了索引视图的表。
(3)表记录删除后不能恢复。
(4)如果删除表记录的同时删除表结构,则使用“DROP TABLE表名”命令。
例如,删除test1数据库的xsb1和xsb2表中的所有行。
USE test1 GO DELETE xsb1 GO TRUNCATE TABLE xsb2 GO DROP TABLE xsb3 GO SELECT * FROM xsb1 / *显示没有记录* / GO SELECT * FROM xsb2 / *显示没有记录* / GO SELECT * FROM xsb3 / *显示错误信息,因为xsb3已经没有了* / GO