数据库实验报告2 数据更新实验

一、 实验目的:

(1)理解和掌握数据库更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作。
(2)掌握SQL语句常见语法错误的调试方法。

二、 实验内容:

按照下列要求操作,并截取相应的结果图

1、教材79-80页三张表student、course、sc中数据输入

由于学生的学号收到完整性约束,Sno为主码,所以Sno的值唯一,不可重复。在实际操作时学号为201215120重复,出现了以下错误提示:数据库实验报告2 数据更新实验_第1张图片
在这里插入图片描述
改正后输出的表为:数据库实验报告2 数据更新实验_第2张图片
Course表为:数据库实验报告2 数据更新实验_第3张图片
SC表为:数据库实验报告2 数据更新实验_第4张图片
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表插入前:数据库实验报告2 数据更新实验_第5张图片
插入语句:在这里插入图片描述
插入后:数据库实验报告2 数据更新实验_第6张图片
【例3.70】将学生史湘云的信息插入到student表中
插入语句: 在这里插入图片描述
into子句中只指出了表名,没有指出属性名,这表示新元组要在表的所有属性列上都指定值,且属性列的次序与表定义中的次序相同。 插入前: 数据库实验报告2 数据更新实验_第7张图片
插入后:数据库实验报告2 数据更新实验_第8张图片
【例3.71】插入一条选课记录(‘201215128’,’1’)。
插入语句为:在这里插入图片描述
关系数据库管理系统将在新插入记录的Grade列上自动的赋空值。 插入前:数据库实验报告2 数据更新实验_第9张图片
插入后,学号为201215128的成绩为null:数据库实验报告2 数据更新实验_第10张图片
也可以用下面的插入语句:在这里插入图片描述
因为没有指出SC的属性名,在Grade列上要明确给出空值。 插入后,学号为201215126的元组与学号为201215128的元组类似。数据库实验报告2 数据更新实验_第11张图片

2.插入子查询结果
【例3.72】对每一个系,求学生的平均年龄,并把结果存入数据库
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生的平均年龄。代码如下:在这里插入图片描述
执行结果为:在这里插入图片描述
然后对student表按系分组求平均年龄,再把系名和平均年龄存入新表中。代码如下:数据库实验报告2 数据更新实验_第12张图片
执行结果为: 数据库实验报告2 数据更新实验_第13张图片
关系数据库管理系统在执行插入语句时,会检查所插元组是否破坏表上已定义的完整性规则。

3.5.2 修改数据
1.修改某一个元组的值
【例3.73】将学生201215121的年龄改为22岁。
代码为:在这里插入图片描述
修改的元组需满足WHERE子句的条件,即学生的学号为201215121。 SET子句给出的表达式的值用于取代相应的属性列值,即年龄22岁取代17岁。 修改前:在这里插入图片描述
修改后:在这里插入图片描述
2.修改多个元组的值
【例3.74】将所有学生的年龄增加1岁。
代码为:在这里插入图片描述
此代码省略了where子句,表示要修改表中的所有元组。 修改前:数据库实验报告2 数据更新实验_第14张图片
修改后:数据库实验报告2 数据更新实验_第15张图片
3.带子查询的修改语句
【例3.75】将计算机科学系全体学生的成绩置零。
代码为:数据库实验报告2 数据更新实验_第16张图片
子查询语句也可嵌套在UPDATE语句中,用以构造修改的条件。 从学生表中找出系为CS的学生的学号,在到SC表中找到满足学号的元组,将元组中的Grade置为0。 数据库实验报告2 数据更新实验_第17张图片
系为CS的学生的学号为201215120、201215121、201215126 修改前SC表:数据库实验报告2 数据更新实验_第18张图片
修改后SC表: 数据库实验报告2 数据更新实验_第19张图片
3.5.3删除数据
【例3.76】删除学号为201215128的学生记录。
删除语句为:在这里插入图片描述
delete语句的功能是从指定表中删除满足where子句条件的所有元组。 但直接删除会出现如下错误提示: 在这里插入图片描述
是因为删除操作破坏了参照完整性,所以要先把其他信息删除。 删除前:数据库实验报告2 数据更新实验_第20张图片
删除后: 数据库实验报告2 数据更新实验_第21张图片
2.删除多个元组的值
【例3.77】删除所有的学生选课记录
删除语句为: 在这里插入图片描述
此语句省略where子句则表示删除表中全部元组,但表的定义仍在字典中。也就是说,delete语句删除的是表中的数据,而不是关于表的定义。 删除前: 数据库实验报告2 数据更新实验_第22张图片
删除后:在这里插入图片描述

3.带子查询的删除语句
【例3.78】删除计算机科学系所有学生的选课记录。
删除语句为:在这里插入图片描述
子查询同样也可以嵌套在delete语句中,用以构造执行删除操作的条件。 在student表中,计算机科学系的学生的学号分别为201215120、201215121和201215126。 数据库实验报告2 数据更新实验_第23张图片
删除前:数据库实验报告2 数据更新实验_第24张图片
删除后:数据库实验报告2 数据更新实验_第25张图片
3.教材70页习题6中SPJ数据库的创建,并在该数据库中创建S、P、J、SPJ四个表,再参照71页各表的数据输入记录
供应商表S代码: 数据库实验报告2 数据更新实验_第26张图片
供应商表S执行结果: 数据库实验报告2 数据更新实验_第27张图片
零件表P代码:数据库实验报告2 数据更新实验_第28张图片
零件表P执行结果: 数据库实验报告2 数据更新实验_第29张图片
工程项目表J代码:数据库实验报告2 数据更新实验_第30张图片
工程项目表J执行结果: 数据库实验报告2 数据更新实验_第31张图片 供应情况表SPJ代码:数据库实验报告2 数据更新实验_第32张图片
供应情况表SPJ执行结果:数据库实验报告2 数据更新实验_第33张图片
4、分别建三个带各种约束(PRIMARY KEY、FOREIGN KEY 、NOT NULL、UNIQUE、CHECK)的表student1、course1、sc1,和不带以上任何约束的表student2、course2、sc2,输入测试数据,验证数据的完整性约束,并截取结果图进行分析。

PRIMARY KEY: 在student1表中,使Sno受到PRIMARY KEY的约束,代码如下:数据库实验报告2 数据更新实验_第34张图片
在student1中插入两条元组,当两条元组的Sno同为201215120时,执行会出现错误警告:数据库实验报告2 数据更新实验_第35张图片
而改为两个不同的学号后,插入成功: 在这里插入图片描述
在这里插入图片描述
在student2表中,Sno不受任何约束,代码如下:数据库实验报告2 数据更新实验_第36张图片
同样插入两条学号相同的数据时,可以成功插入:在这里插入图片描述
数据库实验报告2 数据更新实验_第37张图片
UNIQUE:
在student1表中,使Sname受到UNIQUE约束,即Sname必须取唯一值,插入以下语句: 在这里插入图片描述
两条元组的Sname同为花袭人,执行时出现错误提示:在这里插入图片描述
在student2表中,Sname不受到任何约束,插入相同的语句,可以成功插入: 数据库实验报告2 数据更新实验_第38张图片
CHECK:
在student1表中,Sage受到Sage>15并且Sage<20的约束。学号为201215126的同学的年龄为14岁,不在约束的范围内,所以执行时会出现错误提示:数据库实验报告2 数据更新实验_第39张图片
在这里插入图片描述
同理,学号为201215128的同学的年龄为21岁,也不在约束范围内,也会出现错误提示:数据库实验报告2 数据更新实验_第40张图片
在这里插入图片描述
在student2中,Sage不受CHECK的约束,所以在插入年龄为14岁和21岁同学的信息时,不会出现错误提示,可以插入成功: 数据库实验报告2 数据更新实验_第41张图片
NULL:
在course1表中,Cname不能取空值, 数据库实验报告2 数据更新实验_第42张图片
在插入的元组Cname中值为null,执行时会出现错误提示: 数据库实验报告2 数据更新实验_第43张图片
在course2表中,Cname不受任何约束,插入的元组Cname的值为null时,可成功插入: 数据库实验报告2 数据更新实验_第44张图片
数据库实验报告2 数据更新实验_第45张图片
FOREIGN KEY:
表sc1的Sno和Cno是外码: 数据库实验报告2 数据更新实验_第46张图片
删除student1中学号为201215120的学生的信息时,会出现错误:
在这里插入图片描述
同样,在删除course1中课程号为1的信息时,也会出现错误: 在这里插入图片描述
在sc2表中,Sno和Cno不是外码,在删除student2中学号为201215120的学生的信息时,可成功删除:数据库实验报告2 数据更新实验_第47张图片
但sc2表中学号为201215120的信息不因student2中信息的删除而缺少信息。 数据库实验报告2 数据更新实验_第48张图片
同样在course2中删除课程号为1的信息时,可成功删除:数据库实验报告2 数据更新实验_第49张图片
而sc2表不受影响: 数据库实验报告2 数据更新实验_第50张图片
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';

你可能感兴趣的:(sql,数据库,mysql)