(1)理解和掌握数据库更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作。
(2)掌握SQL语句常见语法错误的调试方法。
按照下列要求操作,并截取相应的结果图
1、教材79-80页三张表student、course、sc中数据输入
由于学生的学号收到完整性约束,Sno为主码,所以Sno的值唯一,不可重复。在实际操作时学号为201215120重复,出现了以下错误提示:
改正后输出的表为:
Course表为:
SC表为:
2、按照教材3.5数据更新中例3.69至例3.78的要求操作3.5.1 插入数据
1.插入元组
【例3.69】 将一个新学生元组(学号:201215128,姓名:秦可卿,性别:女,所在系:IS,年龄18岁)插入到student表中。
在student表的定义中,属性列的顺序是Sno,Sname,Ssex,Sdept,Sage。新增的属性列的顺序可以与表定义中的顺序不一样,如Sno,Sname,Ssex,Sage,Sdept。但值应该要与新增属性列相对应。 student表插入前:
插入语句:
插入后:
【例3.70】将学生史湘云的信息插入到student表中
插入语句:
into子句中只指出了表名,没有指出属性名,这表示新元组要在表的所有属性列上都指定值,且属性列的次序与表定义中的次序相同。 插入前:
插入后:
【例3.71】插入一条选课记录(‘201215128’,’1’)。
插入语句为:
关系数据库管理系统将在新插入记录的Grade列上自动的赋空值。 插入前:
插入后,学号为201215128的成绩为null:
也可以用下面的插入语句:
因为没有指出SC的属性名,在Grade列上要明确给出空值。 插入后,学号为201215126的元组与学号为201215128的元组类似。
2.插入子查询结果
【例3.72】对每一个系,求学生的平均年龄,并把结果存入数据库
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生的平均年龄。代码如下:
执行结果为:
然后对student表按系分组求平均年龄,再把系名和平均年龄存入新表中。代码如下:
执行结果为:
关系数据库管理系统在执行插入语句时,会检查所插元组是否破坏表上已定义的完整性规则。
3.5.2 修改数据
1.修改某一个元组的值
【例3.73】将学生201215121的年龄改为22岁。
代码为:
修改的元组需满足WHERE子句的条件,即学生的学号为201215121。 SET子句给出的表达式的值用于取代相应的属性列值,即年龄22岁取代17岁。 修改前:
修改后:
2.修改多个元组的值
【例3.74】将所有学生的年龄增加1岁。
代码为:
此代码省略了where子句,表示要修改表中的所有元组。 修改前:
修改后:
3.带子查询的修改语句
【例3.75】将计算机科学系全体学生的成绩置零。
代码为:
子查询语句也可嵌套在UPDATE语句中,用以构造修改的条件。 从学生表中找出系为CS的学生的学号,在到SC表中找到满足学号的元组,将元组中的Grade置为0。
系为CS的学生的学号为201215120、201215121、201215126 修改前SC表:
修改后SC表:
3.5.3删除数据
【例3.76】删除学号为201215128的学生记录。
删除语句为:
delete语句的功能是从指定表中删除满足where子句条件的所有元组。 但直接删除会出现如下错误提示:
是因为删除操作破坏了参照完整性,所以要先把其他信息删除。 删除前:
删除后:
2.删除多个元组的值
【例3.77】删除所有的学生选课记录。
删除语句为:
此语句省略where子句则表示删除表中全部元组,但表的定义仍在字典中。也就是说,delete语句删除的是表中的数据,而不是关于表的定义。 删除前:
删除后:
3.带子查询的删除语句
【例3.78】删除计算机科学系所有学生的选课记录。
删除语句为:
子查询同样也可以嵌套在delete语句中,用以构造执行删除操作的条件。 在student表中,计算机科学系的学生的学号分别为201215120、201215121和201215126。
删除前:
删除后:
3.教材70页习题6中SPJ数据库的创建,并在该数据库中创建S、P、J、SPJ四个表,再参照71页各表的数据输入记录
供应商表S代码:
供应商表S执行结果:
零件表P代码:
零件表P执行结果:
工程项目表J代码:
工程项目表J执行结果: 供应情况表SPJ代码:
供应情况表SPJ执行结果:
4、分别建三个带各种约束(PRIMARY KEY、FOREIGN KEY 、NOT NULL、UNIQUE、CHECK)的表student1、course1、sc1,和不带以上任何约束的表student2、course2、sc2,输入测试数据,验证数据的完整性约束,并截取结果图进行分析。
PRIMARY KEY: 在student1表中,使Sno受到PRIMARY KEY的约束,代码如下:
在student1中插入两条元组,当两条元组的Sno同为201215120时,执行会出现错误警告:
而改为两个不同的学号后,插入成功:
在student2表中,Sno不受任何约束,代码如下:
同样插入两条学号相同的数据时,可以成功插入:
UNIQUE:
在student1表中,使Sname受到UNIQUE约束,即Sname必须取唯一值,插入以下语句:
两条元组的Sname同为花袭人,执行时出现错误提示:
在student2表中,Sname不受到任何约束,插入相同的语句,可以成功插入:
CHECK:
在student1表中,Sage受到Sage>15并且Sage<20的约束。学号为201215126的同学的年龄为14岁,不在约束的范围内,所以执行时会出现错误提示:
同理,学号为201215128的同学的年龄为21岁,也不在约束范围内,也会出现错误提示:
在student2中,Sage不受CHECK的约束,所以在插入年龄为14岁和21岁同学的信息时,不会出现错误提示,可以插入成功:
NULL:
在course1表中,Cname不能取空值,
在插入的元组Cname中值为null,执行时会出现错误提示:
在course2表中,Cname不受任何约束,插入的元组Cname的值为null时,可成功插入:
FOREIGN KEY:
表sc1的Sno和Cno是外码:
删除student1中学号为201215120的学生的信息时,会出现错误:
同样,在删除course1中课程号为1的信息时,也会出现错误:
在sc2表中,Sno和Cno不是外码,在删除student2中学号为201215120的学生的信息时,可成功删除:
但sc2表中学号为201215120的信息不因student2中信息的删除而缺少信息。
同样在course2中删除课程号为1的信息时,可成功删除:
而sc2表不受影响:
SQL代码:
create table student
( Sno char(9) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/
Sname char(20) UNIQUE, /*Sname取唯一值*/
Ssex char(2),
Sage SMALLINT,
Sdept char(20)
);
insert into student (Sno,Sname,Ssex,Sage,Sdept)
values ('201215120','贾宝玉','男',18,'CS'),
('201215121','林黛玉','女',17,'CS'),
('201215122','花袭人','女',18,'IS'),
('201215123','贾探春','女',19,'MA')
select * from student
create table Course
( Cno char(4) PRIMARY KEY, /*列级完整性约束条件,Cno是主码*/
Cname char(40) NOT NULL, /*列级完整性约束条件,Cname不能取空值*/
Cpno char(4), /*Cpno的含义是先修课*/
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
/*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/
);
insert into Course
values (1,'数据库',5,4),
(2,'数学',null,2),
(3,'信息系统',1,4),
(4,'操作系统',6,3),
(5,'数据结构',7,4),
(6,'数据处理',null,2),
(7,'PASCAL语言',6,4)
select * from Course
create table SC
(Sno char(9),
Cno char(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES student(Sno),
/*表级完整性约束条件,Sno是外码,被参照表是student*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*表级完整性约束条件,Cno是外码,被参照表是Course*/
);
insert into SC
values ('201215120',2,98),
('201215121',1,92),
('201215121',2,85),
('201215121',3,88),
('201215122',2,90),
('201215122',3,80)
select * from SC
insert
into student (Sno,Sname,Ssex,Sdept,Sage)
values('201215128','秦可卿','女','IS',18);
insert
into student
values ('201215126','史湘云','女',18,'CS');
insert
into SC(Sno,Cno)
values('201215128','1');
insert
into SC
values('201215126','1',null);
create table Dept_age
( Sdept char(15),
Avg_age SMALLINT);
select * from Dept_age
insert
into Dept_age(Sdept,Avg_age)
select Sdept,AVG(Sage)
from student group by Sdept;
update student
set Sage=22
where Sno='201215121';
select *from student;
update Student
set Sage=Sage+1;
update SC
set Grade = 0
where Sno IN
(Select Sno from student where Sdept='CS');
SELECT *FROM SC
SELECT *FROM Course
SELECT *FROM student
delete from student where Sno='201215128';
delete from SC;
select *from SC;
delete from SC
where Sno IN
(select Sno FROM student
where Sdept ='CS');
create table student1
( Sno char(9) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/
Sname char(20) UNIQUE, /*Sname取唯一值*/
Ssex char(2),
Sage int check(sage>15 and sage <20),
Sdept char(20)
);
insert into student1 (Sno,Sname,Ssex,Sage,Sdept)
values ('201215120','贾宝玉','男',18,'CS'),
('201215121','林黛玉','女',17,'CS')
insert into student1 (Sno,Sname,Ssex,Sage,Sdept)
values ('201215122','花袭人','女',18,'IS'),
('201215123','贾探春','女',19,'MA')
insert
into student1
values ('201215126','史湘云','女',14,'CS'),
('201215128','秦可卿','女',21,'IS')
select * from student1
create table course1
( Cno char(4) PRIMARY KEY, /*列级完整性约束条件,Cno是主码*/
Cname char(40) NOT NULL, /*列级完整性约束条件,Cname不能取空值*/
Cpno char(4), /*Cpno的含义是先修课*/
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES course1(Cno)
/*表级完整性约束条件,Cpno是外码,被参照表是course1,被参照列是Cno*/
);
select * from course1
insert into course1
values (1,null,5,4)
insert into course1
values (1,'数据库',5,4),
(2,'数学',null,2),
(3,'信息系统',1,4),
(4,'操作系统',6,3),
(5,'数据结构',7,4),
(6,'数据处理',null,2),
(7,'PASCAL语言',6,4)
create table sc1
(Sno char(9),
Cno char(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES student1(Sno),
/*表级完整性约束条件,Sno是外码,被参照表是student*/
FOREIGN KEY (Cno) REFERENCES course1(Cno)
/*表级完整性约束条件,Cno是外码,被参照表是Course*/
);
insert into sc1
values ('201215120',2,98),
('201215121',1,92),
('201215121',2,85),
('201215121',3,88),
('201215122',2,90),
('201215122',3,80)
select * from sc1
delete from student1 where Sno='201215120';
delete from course1 where Cno='1';
create table student2
( Sno char(9),
Sname char(20),
Ssex char(2),
Sage int,
Sdept char(20)
);
select * from student2
insert into student2 (Sno,Sname,Ssex,Sage,Sdept)
values ('201215120','贾宝玉','男',18,'CS'),
('201215120','林黛玉','女',17,'CS')
insert into student2 (Sno,Sname,Ssex,Sage,Sdept)
values ('201215122','花袭人','女',18,'IS'),
('201215123','花袭人','女',19,'MA')
insert
into student2
values ('201215126','史湘云','女',14,'CS'),
('201215128','秦可卿','女',21,'IS')
create table course2
( Cno char(4) PRIMARY KEY, /*列级完整性约束条件,Cno是主码*/
Cname char(40) ,
Cpno char(4), /*Cpno的含义是先修课*/
Ccredit SMALLINT
);
select * from course2
insert into course2
values (1,null,5,4)
insert into course2
values (2,'数学',null,2),
(3,'信息系统',1,4),
(4,'操作系统',6,3),
(5,'数据结构',7,4),
(6,'数据处理',null,2),
(7,'PASCAL语言',6,4)
create table sc2
(Sno char(9),
Cno char(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*主码由两个属性构成,必须作为表级完整性进行定义*/
);
insert into sc2
values ('201215120',2,98),
('201215121',1,92),
('201215121',2,85),
('201215121',3,88),
('201215122',2,90),
('201215122',3,80)
select * from sc2
delete from student2 where Sno='201215120';
delete from course2 where Cno='1';