SQL Server 2016 数据库教程(第4版)
上QQ阅读APP看书,第一时间看更新

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