3.5 数据更新
数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。在SQL中有相应的三类语句。
3.5.1 插入数据
SQL的数据插入语句insert通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。
01 插入元组
插入元组的insert语句的格式为
insert into <表名> [(<属性列1> [,<属性列2>]···)]
values (<常量1> [,<常量2>]···);
其功能是将新元组插入指定表中。其中新元组的属性列1的值为常量1,属性列2的值为常量2,···。into子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意的是,在表定义时说明了not null的属性列不能取空值,否则会出错。
如果into子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。
例3.69 将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中。
insert into Student(Sno,Sname,Ssex,Sdept,Sage) values(‘201215128’,’陈冬’,’男’,’IS’,18);
例3.70 将学生张成民的信息插入到Student表中。
insert into Student values(‘201215126’,’张成民’,’男’ ,18,’CS’);
例3.71 插入一条选课记录(‘201215128’,‘1’)。
insert into SC(Sno,Cno) values(‘201215128’,’1’);
关系数据库管理系统将在新插入记录的Grade列上自动地赋空值。
或者:insert into SC values(‘201215128’,’1’,null);
因为没有指明SC的属性名,在Grade列上要明确给出空值。
02 插入子查询结果
子查询不仅可以嵌套在select语句中用以构造父查询的条件(如3.4.3小节所述),也可以嵌套在insert语句中用以生成要插入的批量数据。
插入子查询结果的insert语句格式为
insert
into <表名> [(<属性列1> [,<属性列2>···])]
子查询;
例3.72 对每一个系,求学生的平均年龄,并把结果存入数据库。
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。
create table Dept_age (Sdept char(15) Avg_age smallint);
然后对Student表按系分组求平均年龄,在把系名和平均年龄存入新表中。
insert into Dept_age(Sdept,Avg_age) select Sdept,avg(Sage) from Student group by Sdept;
3.5.2 修改数据
修改操作又称为更新操作,其语句的一般格式为
update <表名>
set <列名> = <表达式> [,<列名> = <表达式>]···
[where <条件>];
其功能是修改指定表中满足where子句条件的元组。其中set子句给出<表达式>的值用于取代相应的属性列值。如果省略where子句,则表示要修改表中的所有元组。
01 修改某一个元组的值
例3.73 将学生201215121的年龄改为22岁。
update Student set Sage = 22 where Sno = ‘201215121’;
02 修改多个元组的值
例3.74 将所有学生的年龄增加1岁。
update Student set Sage = Sage + 1;
03 带子查询的修改语句
子查询也可以嵌套在update语句中,用以构造修改的条件。
例3.75 将计算机科学系全体学生的成绩置零。
update SC set Grade = 0 where Sno in (select Sno from Student where Sdept = ‘CS’);
3.5.3 删除数据
删除语句的一般格式为
delete
from <表名>
[where <条件>];
delete语句的功能是从指定表中删除满足where子句条件的所有元组。如果省略where子句则表示删除表中全部元组,但表的定义仍在字典中。也就是说,delete语句删除的是表中的数据,而不是关于表的定义。
01 删除某一个元组的值
例3.76 删除学号201215128的学生记录。
delete from Student where Sno = ‘201215128’;
02 删除多个元组的值
例3.77 删除所有的学生选课记录。
delete from SC;
这条delete语句将使SC成为空表,它删除了SC的所有元组。
03 带子查询的删除语句
子查询同样也可以嵌套在delete语句中,用以构造执行删除操作的条件。
例3.78 删除计算机科学系所有学生的选课记录。
delete from SC where Sno in (select Sno from Student where Sdept = ‘CS’);
对某个基本表中数据的增、删、改操作有可能会破坏参照完整性,第5章5.2节 参照完整性将详细讲解如何进行参照完整性检查和控制。