第5章操作表中的数据 操作表中的数据 通过前面几章的学习,读者已经清楚如何创建数据库和数据表了。但是,数据表中还没有任何数据,本章将介绍如何向表中添加数据以及管理表中的数据。 本章主要知识点如下: 向数据表中添加数据; 修改数据表中的数据; 删除数据表中的数据。 视频讲解 5.1添加数据 向数据表中添加数据可以通过SQL语句,也可以通过使用SSMS完成。 5.1.1INSERT语句 使用SQL语句向数据表中添加数据前,要先弄清楚添加语句的语法规则。添加语句的关键字是INSERT。在实际应用中添加语句的语法形式有很多,在本节中介绍一个比较常用的INSERT语句的语法形式,具体的语法如下: INSERT INTO table_name(column_name1, column_name2,...) VALUES(value1,value2,...); table_name: 表名。 column_name: 列名。需要添加值的列名,如果没有指定任何列名,意味着是向表中所有列添加值。 value: 值。向数据表中指定列添加的值,值与表中的列是一一对应的。不仅个数要一致,数据类型也要一致。此外,如果没有指定列名,插入值对应列的顺序就是创建表时列的存放顺序,可以直接在SSMS中查看。 5.1.2向表中的全部列添加值 向表中所有的列同时插入值是一个比较常见的应用。下面就用例51演示如何应用INSERT语句向表中全部列添加值。在演示之前,先了解在本章中要操作的数据表,如表5.1所示。 表5.1银行账号信息表(bankaccount) 编号列名数 据 类 型中 文 释 义 1idint账号 2namevarchar(20)姓名 3passwordvarchar(20)密码 4levelint等级 5balancenumeric(9,2)余额 6bankcodeint银行代码 7idcardchar(18)身份证号 8telchar(11)手机号 9addrvarchar(30)家庭住址 10remarkvarchar(200)备注 根据表5.1的表结构,创建银行账号信息表(bankaccount)的语句如下所示。另外,本章的数据表全部创建在数据库chapter5中,读者需要自行创建该数据库。 USE chapter5; CREATE TABLE bankaccount ( idintPRIMARY KEY, name varchar(20), password varchar(20), level int, balance numeric(9,2), bankcode int, idcard char(18), tel char(11), addr varchar(30), remark varchar(200) ); 51向银行账号信息表(bankaccount)中添加数据。如表5.2所示。 表5.2银行账号信息表添加的数据 账号姓名密码等级余额银行代码身份证号手机号家庭住址备注 1张三三1122331100010011101019900101123413112345678海淀区无 向银行账号信息表(bankaccount)中添加表5.2的数据,具体的语法如下: USE chapter5; INSERT INTO bankaccount VALUES(1,'张三三','112233',1,1000,1001,'11010199001011234', 13112345678,'海淀区','无'); 执行上面的语法,向银行账号信息表中添加一条数据了,执行效果如图5.1所示。 图5.1向银行账号信息表(bankaccount)中全部列插入数据 从图5.1中可以看到,执行上面的语法后给出的消息是“1行受影响”,这就意味着有一条记录插入到数据表中了。读者如果想查看数据表中是否有这条数据,用下面的语法就可以了。 SELECT * FROM table_name; table_name是表的名字。将table_name换成具体的表名如bankaccount就可以查询了,查询效果如图5.2所示。 图5.2银行账号信息表(bankaccount)中的数据 根据图5.2的查询结果可以知道,数据已存放在数据表中了。 5.1.3给指定列添加值 在实际工作中,添加数据时并不是每次都需要向表中的所有列添加值。这个用INSERT语句在插入数据时指定列名就可以。 52向银行账号信息表(bankaccount)中插入表5.3所示的数据。 表5.3银行账号信息表添加的数据 账号姓名密码等级余额银行代码身份证号手机号家庭住址备注 2李小明12345615000100221010119920211122318812345678 从表5.3中可以看出,家庭住址和备注两个列是不需要添加值的,因此添加的SQL语句写法如下: USE chapter5; INSERT INTO bankaccount (id,name,password,level,balance,bankcode,idcard,tel) VALUES(2,'李小明','123456',1,5000,1002, '210101199202111223', 18812345678); 执行上面的语法,向银行账号信息表(bankaccount)中添加一条记录了,执行效果如图5.3所示。 图5.3向银行账号信息表指定列插入值 下面利用SELECT语句查看插入数据后的效果,如图5.4所示。可以看出在例52中没有添加值的addr和remark列的值都是NULL而不是“”。 图5.4银行账号信息表(bankaccount)中的数据 5.1.4为标识列添加值 什么是标识列呢?就是在第3章中给读者介绍的允许值自动变化的列。标识列只能在整型的列上设置,并且在设置时可以为其指定该列开始的值以及每次的增量。由于标识列的值只能按顺序增加或减少,如果将其中的某一个序号所对应的数据删除掉,系统是不会为其补充该值的。有时有不连续的值输入,需要先将标识列的自动插入属性(IDENTITY_INSERT)设为ON,允许对标识列中显示值手动插入,具体的设置语法如下: SET IDENTITY_INSERT table_name ON; 这里,IDENTITY_INSERT就是标识列自动插入值的属性,table_name是表名。如果要将该属性恢复就将上面的语句中ON改成OFF就可以了。 53创建仅包含编号、姓名的用户表,并向标识列中手动添加值。 为了配合标识列的使用,将用户编号列设置为标识列,创建userinfo表的语法如下: USE chapter5; CREATE TABLE userinfo ( idintPRIMARY KEY IDENTITY(1,1), name varchar(20), ); 通过上面的语法在数据库chapter5中创建数据表userinfo。 有了用户信息表(userinfo)就可以向该表插入数据了,要添加的数据如表5.4所示。 表5.4需要添加的数据 账号姓名 小明 5小晴 从表5.4中的数据可以看出,需要向数据表中添加两条记录,第1条记录中的用户编号不需要输入,使用标识列自动添加; 第2条记录的用户编号列手动添加。具体添加语法如下: USE chapter5; INSERT INTO userinfo VALUES('小明'); SET IDENTITY_INSERT userinfo ON; INSERT INTO userinfo (id,name)--必须使用列列表的方式 VALUES(5,'小晴'); SET IDENTITY_INSERT userinfo OFF; 执行上面的语法,向用户信息表(userinfo)中添加两条数据,执行效果如图5.5所示。 图5.5向标识列插入值 向用户信息表(userinfo)中插入两条记录后,查询用户信息表(userinfo),效果如图5.6所示。 图5.6插入2条记录后的 用户信息表 从图5.6的添加结果可以看出,第1条记录中id列使用了自增长序列的第1个值; 第2条记录中id列使用的是手动添加的值“5”。如果再向用户信息表(userinfo)中插入值时,id列中的值是“2”还是“6”呢?此时id列中的值一定是“6”,因为自增长序列是在该列的最大值基础上增加的。 如果向标识列中添加值,而不将该表的IDENTITY_INSERT属性值设为ON会出现什么错误呢?下面仍以向用户信息表(userinfo)插入值为列测试如下的语法: USE chapter5; INSERT INTO userinfo VALUES(2,'小宁'); 执行上面的语法会发生什么情况呢?执行效果如图5.7所示。 图5.7向标识列插入值时出现的错误 请看图5.7的错误提示信息,IDENTITY_INSERT属性值为ON时才可以向自增长字段中手动插入值。除了这个提示外,读者还会发现一个信息“仅当使用了列列表”,这个信息的意思是使用INSERT语句时,要加上插入列的列名,否则也无法向标识列中插入值。 5.1.5使用默认值添加数据 在第4章中介绍约束时提到过默认值约束的概念,它的作用是当设置默认值约束的列没有插入值时,会自动采用已经设置好的默认值。例如,银行账号信息表(bankaccount)中的备注列,在没有添加具体的备注信息时,默认为“无”。这种情况可以在创建银行账号信息表(bankaccount)时,为其备注字段设置默认值约束,默认值是“无”。在本章已经创建过银行账号信息表(bankaccount)了,请读者使用下面语法给该表的备注列加上默认值“无”。 USE chapter5 ALTER TABLE bankaccount ADD CONSTRAINT df_bankaccount DEFAULT '无' FOR remark; 执行上面的语法,为银行账号信息表(bankaccount)的备注字段添加默认值约束了。 54向银行账号信息表(bankaccount)中添加如表5.5所示的数据。 表5.5银行账号信息表添加的数据 账号姓名密码等级余额银行代码身份证号手机号家庭住址备注 3王胜利12345615000100321010519920218122318812345679沈阳市铁西区无 4蒋丽65432121500100113001019960218122318612345678未知新开户 根据表5.5所示的数据,第1条数据中的备注字段是“无”,可以在插入的时候利用默认值,具体的语法如下: USE chapter5; INSERT INTO bankaccount (id,name,password,level,balance,bankcode,idcard,tel,addr) VALUES(3,'王胜利','123456',1,5000,1003, 210105199202181223, 18812345679,'沈阳市铁西区'); INSERT INTO bankaccount VALUES(4,'蒋丽',654321,2,1500,1001, 130010199602181223, 18612345678,'未知','新开户'); 执行上面的语法,为银行账户信息表(bankaccount)添加两条记录,执行效果如图5.8所示。 图5.8向银行账户信息表(bankaccount)中的默认值列插入值 从图5.8的效果可以看出,数据已经加入账户信息表中了,那么第1条数据中备注字段的值究竟是不是“无”呢?下面查询银行账户信息表看效果,如图5.9所示。 图5.9银行账户信息表(bankaccount)中的数据 在图5.9的id列是3的这条记录中,remark列的值是“无”,这就是默认值约束的应用。 5.1.6复制表中的数据 表和表之间的数据复制要遵守列的个数和数据类型一致性的原则。此外,可以有选择地复制表中一部分列中的数据。将table_name2中的数据加入table_name1中具体的语法如下: INSERT INTO table_name1(column_name1, column_name2,...) SELECT column_name_1, column_name_2,... FROM table_name2 table_name1: 插入数据的表。 column_name1: 表中要插入值的列名。 table_name2: 源数据的表。 column_name_1: table_name2中的列名。 需要注意的是,在INSERT INTO后的列名个数与SELECT后的列名个数要一致,数据类型也要兼容。 55将表bankaccount中的姓名和密码复制到表bankaccount1中。 由于表bankaccount1不存在,需要先创建bankaccount1表,该表仅含有姓名和密码列,创建bankaccount1的语法如下: USE chapter5; CREATE TABLE bankaccount1 ( name varchar(20), password varchar(20) ); 执行上面的语法,完成bankaccount1表的创建。将银行账号表(bankaccount)中的姓名和密码复制到表bankaccount1中,具体的语句如下: USE chapter5 INSERT INTO bankaccount1 (name,password) SELECT name,password FROM bankaccount; 执行上面的语法,将bankaccount表中的数据复制到bankaccount1表,执行效果如图5.10所示。可以看出已经给bankaccount1中添加了4条记录,查询bankaccount1表效果如图5.11所示。 图5.10复制bankaccount表中的数据 图5.11bankaccount1表中的数据 5.1.7批量添加 在前面的几个小节中同时向表中添加多条记录,但实际上只是批量地执行INSERT INTO语句。同样的操作却要重复地写语句既浪费时间又影响了数据库执行的性能。那么有没有办法只用一条语句就能批量增加数据呢?下面的语法规则就可以完成一次添加多条数据了。 INSERT INTO table_name(column_name1, column_name2,...) VALUES(value1,value2,value3,...), (value1,value2,value3,...), ... 在VALUES后面列出要添加的数据,每条记录之间用“,”隔开。 56向bankaccount1表中添加如表5.6中的记录。 表5.6bankaccount1信息表添加的记录 姓名密码 Anny112233 Sophia213456 Billy876986 添加记录的语法如下: USE chapter5 INSERT INTO bankaccount1 VALUES('Anny','112233'), ('Sophia','213456'), ('Billy','876986'); 执行上面的语法,一次向bankaccount1表添加了3条数据,执行效果如图5.12所示。 查询bankaccount1表数据,效果如图5.13所示。 图5.12向表bankaccount1中添加多条记录 图5.13批量添加记录后bankaccount1表的数据 视频讲解 5.2修改表中的数据 如果发现数据出现了问题或不符合要求时,不必删除数据,直接修改即可。例如,在注册个人信息后,如果个人邮箱发生变更,只需要更改邮箱而不需要把所有的注册信息全部重新添加。 5.2.1UPDATE语句 修改数据表中的数据使用的是UPDATE语句,但修改数据表的语句也有很多种形式。这里给出一个通用的形式以便读者学习。其余的形式将在下面的小节中详细讲解,修改数据表的一般语法如下: UPDATE table_name SETcolumn_name1=value1, column_name2=value2,... WHERE conditions table_name: 表名。要修改的数据表表名,通常要先打开该数据表所在的数据库。请读者注意,一次只能修改一张表中的数据。 column_name: 列名。需要修改列的名字,value是给列设置的新值。 conditions: 条件。按条件有选择地更新数据表中的数据。如果省略了该条件,也就是省略了WHERE语句,代表修改数据表中的全部记录。 5.2.2不指定条件修改数据 在上面修改数据表的语法中,省略WHERE语句就是不指定条件修改数据,不指定条件即为修改表中的全部数据。 57修改银行账号信息表(bankaccount)中的备注信息列(remark),将其全部修改成“无”。 根据题目要求只是修改银行账号信息表的一列,也就是在UPDATE中的SET语句后只有一个列,具体语法如下: USE chapter5 UPDATE bankaccount SET remark='无'; 执行上面的语法,将银行账号信息表中remark列的值修改成了“无”,具体执行效果如图5.14所示。 从图5.14中可以看出,通过上面的语句,修改了表中的全部4条记录。修改后如何查看结果呢?使用SELECT语句,银行账号信息表修改后的效果如图5.15所示。 图5.14修改银行账号信息表remark列 图5.15修改银行账号信息表remark列后的查询效果 通过图5.15可以一目了然,上面的修改语句确实是将银行账号信息表中remark列全部修改成了“无”。请读者自己尝试一下,将银行账号信息表的所有的银行编号(bankcode)和等级(level)列分别修改成1001和1。 5.2.3按指定条件修改数据 所谓按指定条件修改数据,就是在UPDATE语句中使用WHERE子句指定条件,按条件有选择地修改数据表中的数据。例如,将银行账号信息中银行代码是1001的都修改成1011,将等级是1级的都修改成2级等。 58将银行账号信息表(bankaccount)中银行代码是1001的更改为1011。 根据题目要求,修改银行账号信息表的条件只有一个,并且要修改的列只有账户的银行代码列,具体的修改语法如下: USE chapter5; UPDATE bankaccount SET bankcode=1011 WHERE bankcode=1001; 通过上面的语法将银行账号信息表中银行代码是1001的全部修改成1011了,执行效果如图5.16所示。可以看出,执行上面的修改语句后,修改了账号信息表中的4条记录。查询银行账号信息表,效果如图5.17所示。 图5.16修改银行账号信息表中 银行代码是1001的记录 图5.17修改银行账号信息表的银行代码是1001后的效果 在银行账号信息表中现在一共有2条记录的银行代码都是1011,如何知道修改语句执行成功了呢?可以换个角度看,如果银行账号信息表中没有银行代码是1001的记录就说明修改成功了。 5.2.4修改前N条数据 如果在修改数据时,想完成把账号等级是2的记录只修改1条,应该怎么办呢?仔细想一下,用前面给出的UPDATE语句形式是无法完成的。修改的方法是用TOP关键字,具体的语法如下: UPDATE TOP (n) table_name SET column_name1=value1, column_name2=value2,... WHERE condition; TOP (n)中的n是指前几条记录,是一个整数,其余的语法都可参考前面的UPDATE语句。 59修改银行账号信息表(bankaccount)中等级是1的前两条记录,将其备注信息修改成“这是刚修改过的”。 根据题目要求,该语句应该用WHERE子句限制条件,并用TOP(2)确定修改两条记录,修改语法如下: USE chapter5; UPDATE TOP(2) bankaccount SET remark='这是刚修改过的' WHERE level=1; 执行上面的语法,将level为1的前两条记录修改了,效果如图5.18所示。 为了让读者直观地看到修改的效果,特地将remark字段修改成了“这是刚修改过的”。查询修改后银行账号信息表,效果如图5.19所示。 图5.18修改银行账号信息表中等级 为1的前两条记录 图5.19修改银行账号信息表后的效果 5.2.5根据其他表的数据更新表 上面几个修改数据表的例子都是通过自己指定数据修改的,如果要修改的数据在数据库中的另一张表中已经存在了,可不可以直接复制过来使用呢?当然是可以的,但是不像在Excel表格中复制数据那么简单,完成从另一个表复制数据的语法如下: UPDATE table_name SETcolumn_name1=table1_name.column_name1, column_name2=table1_name.column_name2,... FROM table1_name WHERE conditions table_name: 表名。要更新的数据表名称。 column_name1: 列名。要修改数据表中的列名。 table1_name: 表名。要复制数据的数据表名称。 table1_name.column_name1: 列名。要复制数据的列,记住,一定要在列名前面加上表名。 conditions: 条件。它是指按什么条件复制表中的数据。 按照上面的语法规则可以在修改数据表时使用其他表中的数据了。下面通过例59进行练习。在练习之前先创建一张数据表并存入一些数据,以便复制数据使用。创建一张银行卡等级信息表,表结构如表5.7所示。 表5.7银行卡等级信息表(cardlevel) 序号字段名数 据 类 型描述 1idint等级编号 2levelint等级 3minlimitnumeric(10,2)存款额最小值 4maxlimitnumeric(10,2)存款额最大值 上面的银行卡等级信息表主要描述了每种等级对应的存款额要求,根据表结构创建数据表的语法如下: USE chapter5; CREATE TABLE cardlevel ( idintPRIMARY KEY IDENTITY(1,1), level int, minlimit numeric(10, 2), maxlimit numeric(10, 2) ); 执行创建数据表的语法后,再为其添加如表5.8中的数据,要复制的数据来源创建好了。 表5.8银行卡等级信息表添加的数据 等级编号(id)等级(level)存款额最小值(minlimit)存款额最大值(maxlimit) 1105000 22500120000 3320001100000 批量向数据表中添加数据的具体语法如下: INSERT INTO cardlevel VALUES(1,0,5000),(2,5001,20000),(3,200001,100000); 执行上面的语法后,银行账号等级信息表中就有了3条数据了。 510将银行账号信息表中的等级信息按照银行卡等级信息表中每个等级对应的存款额度进行更新。 根据题目要求,要更新银行卡账号信息表中的等级,更新语法如下: USE chapter5; UPDATE bankaccount SET bankaccount.level= cardlevel.level FROM cardlevel WHERE bankaccount.balance>=cardlevel.minlimit AND bankaccount. balance<cardlevel.maxlimit; 执行上面的语法,将银行账号信息表中的银行卡等级根据卡中存款额进行更新,执行效果如图5.20所示。 图5.20更新银行账号信息表中的等级 从图5.20所示的执行效果中可以看出,银行账号信息表中的4行数据已经被更新了。更新后的银行账号信息表中的数据如图5.21所示,可以看出银行账号信息表中的等级已经按照银行卡等级中的额度范围进行了更新。 图5.21银行账号信息表更新后的效果 视频讲解 5.3使用DELETE语句删除表中的数据 如果某些数据已经没有作用就可以将其删除了。但是,删除的数据不容易恢复,注意备份。 5.3.1DELETE语句 在删除数据表中的数据前,如果不能确定这个数据以后是否还会有用,一定要对其数据先进行备份,删除数据表中的数据使用的语法很简单,一般的语法形式如下: DELETE FROM table_name WHERE conditions; table_name: 表名。要删除数据的数据表名称。 conditions: 条件。按照指定条件删除数据表中的数据,如果没有指定删除条件删除表中的全部数据。 此外,在上面的语法中也可以将DELETE后面的FROM关键字省略。 5.3.2删除表中的全部记录 删除表中的全部数据,就是在使用删除语句时不加WHERE子句,下面就用例511演示如何删除表中的全部数据。 511将银行卡等级信息表中的数据全部删除。 根据题目要求,删除语法如下: USE chapter5; DELETE FROM cardlevel; 执行上面的语法,银行卡等级信息表中的记录消失了,效果如图5.22所示。可以看到已经有3行记录被删除了,删除后剩下一张空表,效果如图5.23所示。 从图5.23中可以看出,虽然将银行卡等级信息表中的数据删掉了,但是表的结构还是保留的。 图5.22删除银行卡等级信息表中的所有数据 图5.23清空后的银行卡等级信息表 5.3.3按条件删除记录 在实际应用中,删除表中全部记录的操作是不太常用的,经常使用的是按条件删除数据,在删除表中数据的语法中加WHERE子句。 512将银行账号信息表中等级是1的记录删除。 根据题目要求,只删除等级是1的记录,删除语法如下: USE chapter5; DELETE FROM bankaccount WHERE level=1; 执行上面的语法,将银行账号信息表中等级是1的记录删掉了,效果如图5.24所示。 从图5.24中可以看出,影响了表中的4条记录,也就是原来表中有4条记录等级是1。删除后查看银行账号信息表,效果如图5.25所示。 图5.24删除等级是1的记录 图5.25删除等级是1的记录后的效果 读者在图5.25中发现所有的记录都被删除了。 5.3.4删除前N条数据 先请读者思考一个问题,如果想删除两条等级是2的银行账户信息,怎么办呢?之前学习的DELETE语句的语法形式不能够满足要求,除非在银行账号信息表中只有两条等级是2的记录,才可以通过在DELETE语句的WHERE子句里设置条件删除。其他情况请看如下的语法学习如何删除数据。 DELETE TOP(N) table_name WHERE conditions; TOP(N)就是用来指定删除前N条记录的。TOP(2)就是指前2条记录。 下面通过例513练习如何删除前N条数据。 513从银行账户信息表中删除1条等级是1的银行账户信息。 根据题目要求,删除1条记录使用TOP(1)就可以了,删除语法如下: USE chapter5; DELETE TOP(1) bankaccount WHERE level=1; 执行上面的语法,即仅删除1条等级是1的记录。 5.3.5使用TRUNCATE TABLE语句清空表中的数据 前面已经讲到在清空表中的数据时,可以使用DELETE语句完成。实际上,除了使用DELETE语句外,还可以使用TRUNCATE TABLE语句清空表中的数据。TRUNACTE TABLE语句的语法很简单,只需要在其后面加上表名就可以了。具体的语法形式如下所示: TRUNCATE TABLE table_name; table_name就是表名,同样在删除之前还要打开该表所在的数据库。 514使用TRUNCATE TABLE语句删除银行账号信息表(bankaccount)中的数据。 根据题目的要求,删除银行账号信息表中的数据,语法如下: USE chapter5; TRUNCATE TABLE bankaccount; 执行上面的语法,将银行账号信息表中的数据全部删除,效果如图5.26所示。 图5.26删除银行账号信息表 中的全部数据 从图5.26的执行效果可以看出,在执行了TRUNCATE TABLE语句后并没有像执行DELETE语句时出现“影响几行”的消息提示,而是出现“命令已成功完成”的消息提示了。很显然,TRUNCATE TABLE语句和DELETE语句不是一种类型的语句。实际上,TRUNCATE TABLE属于数据定义语言,与CREATE、DROP、ALTER是一类的。 通过上面的示例,相信读者已经了解了TRUNCATE TABLE的基本用法。那么,TRUNCATE TABLE与DELETE删除表中的数据有什么区别呢?主要区别有两个,具体说明如下: (1) 使用TRUNCATE TABLE删除数据速度较快。使用DELETE语句删除数据时,需要把删除的信息写入到事务日志文件中,这样能够编译恢复删除的数据。而使用TRUNCATE TABLE语句删除数据,是不会将删除的信息写入事务日志文件的。因此,使用TRUNCATE TABLE删除数据的速度较快。当表中的数据不再需要恢复时,可以使用TRUNCATE TABLE语句完成删除操作。 (2) 使用TRUNCATE TABLE删除数据后标识列重新编号。使用TRUNCATE TABLE语句清空表中的所有记录后,表中的标识列会重新编号; 而使用DELELE删除表中的全部记录后,表中的标识列会继续变化。为了验证TRUNCATE TABLE与DELETE删除数据后对标识列的影响,新创建一张数据表test,表结构如表5.9所示。 创建好test表后,向表中添加如表5.10的数据。 表5.9test 序号字 段 名数 据 类 型描述 1idint编号 2namevarchar名称 表5.10test表添加的数据 编号(id)名称(name) 1桌子 2椅子 3书 创建test表并添加数据的语法如下: USE chapter5; CREATE TABLE test ( id intIDENTITY(1,1), name varchar(20) ); INSERT INTO test VALUES('桌子'),('椅子'),('书'); 图5.27test表中的数据 执行上面的语法,查询test表中的数据,如图5.27所示。 下面分别使用TRUNCATE TABLE语句和DELETE语句删除test中的数据。 (1) 使用TRUNCATE TABLE语句删除test中的数据。删除之前在图5.27中,id是自增长列并且序号已经变成3了。删除语法如下: USE chapter5; TRUNCATE TABLE test; 执行上面的语法,test表中没有数据了。下面向test表中再插入一条数据,语法如下: USE chapter5; INSERT INTO test VALUES('本'); 查询test表中的数据,看看id究竟是几,如图5.28所示。 从图5.28中可以看到,id值是1,也就是说使用TRUNCATE语句删除数据后,自增长列是重新计数的。 (2) 使用DELETE语句删除test表中的数据。当前test表中只有一条数据,id为1。下面使用DELETE语句将其删除,语法如下: USE chapter5; DELETE test; 执行上面的语法,test表中的数据也被删除了。下面同样再向test表中添加1条记录,看看id的变化,添加数据的语法如下: USE chapter5; INSERT INTO test VALUES('书包'); 再查看test表,看看id是多少了,如图5.29所示。 图5.28使用TRUNCATE删除 数据后标识列的变化 图5.29使用DELETE删除数据后 标识列的变化 这回看到id的值是2,也就是说,通过DELETE删除数据后,标识列的序号是在原来的基础上继续增加的。 5.4使用SSMS操作数据表 前面学习了使用SQL语句对数据表中数据进行添加、修改以及删除的操作,这些语句需要记住他们才能使用。现在学习一个简单的方法,使用SSMS操作数据表。 SSMS是一个用鼠标操作的友好界面,使用SSMS操作表中的数据最能够体现它的便利了。下面通过例515演示如何在SSMS中添加、修改以及删除数据。 515在SSMS中对银行账号信息表做如下操作。 (1) 向数据表中添加如表5.2的数据。 (2) 修改编号是1的记录,将其余额修改成2000。 (3) 删除编号是1的记录。 无论对银行账号信息表做添加、修改还是删除操作,都需要在银行账号信息表的表编辑界面中完成。在SSMS的“对象资源管理器”中,展开chapter5数据库,右击该数据库中的表bankaccount,在弹出的快捷菜单中选择“编辑前200行”选项,即可见到银行账号信息表的编辑界面,如图5.30所示。 图5.30银行账号信息表的编辑界面 本题的3个小问,都可以在图5.30所示的界面中完成。下面分别讲解如下。 (1) 添加表5.2的数据,就像在Excel表中输入信息一样。录入表5.2的信息后,效果如图5.31所示。 图5.31向bankaccount表中添加数据 添加数据后如何保存呢?在SSMS中,为表添加数据不用刻意地去保存数据,只需要把光标移动到下一行,就保存了上一行的数据。 (2) 将id是1的记录余额改成2000。在图5.31所示的界面中,直接将id为1的列所对应的balance列改成2000就可以了,效果如图5.32所示。 图5.32修改id为1的列 从图5.32中可以看出,当前银行账号信息表的状态是“单元格已修改”,修改数据后,仍然将光标移动到其他单元格中,就可以保存该数据了。 (3) 删除数据会稍微复杂一些。删除编号是1的记录,需要先单击要删除的记录使其处于选中状态,然后右击该记录,在弹出的快捷菜单中选择“删除”选项,弹出如图5.33所示的对话框。 图5.33删除提示 在图5.33所示的界面中单击“是”按钮,即可将所选的记录删除了。 说明: 如果要删除多条记录,不用一条一条地选择,只需要使用Shift或Ctrl键选中要删除的记录,然后一起删除就可以了。 5.5本章小结 本章主要讲解了如何使用SQL和SSMS向数据表中添加、修改以及删除数据。在添加数据部分,着重讲解了如何给标识列添加值、复制表中的数据以及批量添加数据; 在修改数据部分,着重讲解了如何修改前N条记录以及如何在修改时使用其他表中的数据; 在删除数据部分,着重讲解了如何删除N条记录,同时也讲解了TRUNCATE TABLE语句与DELETE语句的区别。希望读者通过本章的学习,能够随意地使用SQL语句操作数据表中的数据,而且,SSMS也得会用。 5.6本章习题 一、 填空题 1. 删除表中全部数据,可以使用语句。 2. 修改表中前N项数据需要使用的关键字是。 3. 未插入值的列,列中的值为。 二、 选择题 1. 下面对向数据表中插入数据的描述正确的是()。 A. 可以一次向表中的所有字段插入数据 B. 可以根据条件向表中的字段插入数据 C. 可以一次向表中插入多条数据 D. 以上都对 2. 下面对修改数据表中的数据描述正确的是()。 A. 一次只能修改表中的一条数据 B. 可以指定修改前N条数据 C. 不能修改主键字段 D. 以上都不对 3. 下面对删除数据表中的数据描述正确的是()。 A. 使用DELETE只能删除表中的全部数据 B. 使用DELETE可以删除1条或多条数据 C. 使用TRUNCATE语句也能删除1条或多条数据 D. 以上都不对 三、 问答题 1. INSERT语句的基本语法形式是什么? 2. UPDATE语句的基本语法形式是什么? 3. DELETE与TRUNCATE的区别是什么? 四、 操作题 使用表5.1的银行账号信息表,完成如下SQL语句的编写。 (1) 向银行账号信息表中任意添加5条数据。 (2) 将银行账号信息表中前三条记录中账号等级加1。 (3) 删除所有账号等级为1的账号信息。