数据库视图、触发器、存储过程。

四、实验内容及程序代码

实验习题:

(结果请截图示意)

1.      创建三个数据表

S((Sno CHAR(9),Sname CHAR(20),      Ssex CHAR(2),Sage  SMALLINT,

Sdept CHAR(20));

C(Cno CHAR(4),Cname CHAR(40),Cpno CHAR(4),Ccredit SMALLINT);

SC((Sno CHAR(9), Cno CHAR(4),Grade SMALLINT )。

并插入数据:

S表:(‘200215121’,’李勇’,’男’,20,’CS’); (‘200215122’,’刘晨’,’女’,19,’CS’);

(‘200215123’,’王敏’,’女’,18,’MA’);(‘200215124’,’张立’,’男’,19,’IS’);

C表:(‘1’,’数据库’,’5’,4); (‘2’,’数学’,null,2); (‘3’,’信息系统’,’1’,4); (‘4’,’操作系统’,’6’,3);

      (‘5’,’数据结构’,’7’,4); (‘6’,’数据处理’,null,2); (‘7’,’PASCAL语言’,’6’,4);

 SC表:

(‘200215121’, ‘1’, 92);(‘200215121’, ‘2’, 85); (‘200215122’, ‘2’, 88);

        (‘200215122’, ‘3’, 90);(‘200215123’, ‘5’, 80); (‘200215123’, ‘6’, 80)

(‘200215124’, ‘1’, 75);(‘200215124’, ‘5’, 89)

2. 创建一个名为View_Male_Student的视图,从表S中查询出性别为男的所有学生的资料。

  

create view View_Male_Student

as

select * from S where Ssex='男';

3. 查看View_Male_Student视图的内容

select * from View_Male_Student;

 

4. 从视图View_Male_Student中查询名为“李勇”的同学的资料。

 

select * from View_Male_Student where sname='李勇';

5. 向视图View_Male_Student中插入一条记录(‘200215126’,’赵林’,’男’,18,’CS’);

 

insert into View_Male_Student values('200215126','赵林','男',18,'CS');

6. 重新查看View_Male_Student视图的内容。

 

7. 查看S表中的内容,看表的内容是否发生变化。

 

8. 向视图View_Male_Student中插入一条记录(‘200215127’,’李红’,’女’,18,’CS’);观察插入是否成功?S表中的数据数据是否发生变化?

 

插入成功,S表的信息发生变化。

9. 创建一个名为View_Male_Student1的视图,从表S中查询出性别为男的所有学生的资料,视图加上WITH CHECK OPTION选项。

 

create view View_Male_Student1

as

select * from S where Ssex='男'

with check OPTION;

 

10. 向视图View_Male_Student1中分别插入记录(‘200215128’,’关飞’,’男’,18,’CS’)和(‘200215129’,’孙婷’,’女’,18,’CS’),观察数据是否成功插入,student表中的数据是否发生变化?

关飞的能插入进去,孙婷的不能插入进去。

 

 

11. 创建一个视图view_age_student,要求学生年龄大于19岁

create view view_age_student

AS

select * from S where sage>19;

12. 在view_age_student的基础上再创建一个视图view_age_male_student,要求性别为男,并且可以对条件进行级联检查。

create view view_age_male_student

AS

select * from view_age_student where ssex='男'

with CASCADED check option;

13. 在view_age_student的基础上再创建一个视图view_age_male_student1,要求性别为男,并且为本地检查

create view view_age_male_student1

AS

select * from view_age_student where ssex='男'

with local check option;

14. 在view_age_male_student中插入数据('200215130','平','男',20,'CS'),('200215131','华','男',18,'CS'),('200215128','芳','女',18,'CS')。观察插入情况。

只有满足所有针对该视图的所有视图的检查条件的更新语句才能插入。

15. 在view_age_male_student1中插入数据('200215132','平','男',20,'CS'),('200215133','华','男',18,'CS'),('200215134','芳','女',19,'CS'),观察插入情况。

只会针对当前视图的条件进行检查,不符合条件的就不能插入。

 

16. 创建一个名为View_Course3的视图,从C表中查询学分大于3的所有课程的课程号、课程名、学分。

create view View_Course3

AS

select cno,cname,ccredit from C where Ccredit>3;

 

17. 查看View_Course3视图的内容。

18. 修改View_Course3视图,将“数学”改为“基础数学”。

 

 

update View_Course3 set cname = '基础数学' where cno = 2;

19. 查看View_Course3和C数据是否发生变化。

没有发生变化。

 

20.修改视图View_Course3的数据,把数据库的学分改为2,然后观察视图和基表数据是否发生改变.

 

update View_Course3 set ccredit = 2 where cname='数据库';

都发生变化了

21. 分步骤删除视图View_Course3中的PASCAL语言课程和数据库课程。查看视图和基表数据的变化

delete  from view_course3 where cname = 'PASCAL语言';

 

delete  from view_course3 where cname = '数据库';

 

删除PASCAL语言课程后,视图和基表的课程都删除了,但是删除数据库课程,基表的数据没有删除,说明删除视图只能删除视图中存在的数据,不能删除基表中存在而视图中不存在的数据。


四、实验内容及程序代码

1. 请创建一个触发器tri_update,每次向account (acct_num INT,amount DECIMAL(10,2))表中更新数据之后 都会向名称为 myevent(id int(11) ,evt_name  char(20) )的数据表中插入一条记录。

delimiter $$

create trigger tri_update before update on account for each ROW

BEGIN

insert into myevent values(1,'五');

end;

$$

delimiter;

2.假设系统中有两个表:班级表 class(班级号 classID, 班内学生数 stuCount),

学生表 student(学号 stuID, 所属班级号 classID)

要创建触发器来使班级表中的班内学生数随着学生的添加自动更新。

delimiter $$

create trigger class_insert_student before insert on student for each ROW

BEGIN

update class set stuCount=stuCount+1;

end;

$$

delimiter;

3.为choose表创建一个触发器,当录入成绩时,score要求在0到100之间。

delimiter $$

create trigger insert_before_trigger before insert on score for each row

begin

if(new.grade>=0 && new.grade<=100) then

set new.grade =new.grade;

else insert into score values(0);

end if;

end;

$$

delimiter ;

4.创建触发器,每周更新一次persons表的num(每人每天的销售量)字段后,都要更新sales表对应的sum(周销售总量)字段,其中persons表结构(name varchar(40),num int(11)),  sales 表结构(name varchar(40),sum int(11))

delimiter $$

create trigger update_sales AFTER update on persons for each ROW

begin

insert into sales values(new.name,7*new.num) ;

end;

$$

delimiter;

 

 

 



四、实验内容及程序代码

1.sch数据表的表结构如表7.1所示,sch表的数据如表7.2。

表7.1  sch 表结构

字段名

数据类型

主键

外键

非空

唯一

自增

id

INT(10)

name

VARCHAR(50)

class

VARCHAR(50)

 

表7.2  sch 表的内容

id

name

class

1

李明

C1

2

小梅

C2

 

1)建表sch并插入数据。

2)创建一个存储函数,用来统计表sch中的记录数。

delimiter $$

create PROCEDURE count_sch5(out size int)

BEGIN

select count(*) into size from sch;

END

$$

delimiter;

3)创建一个存储过程,通过调用存储函数的方法来获取表sch中的记录数和sch表中id的和。

delimiter $$

create PROCEDURE count_sch2(out s_a int,out s_id int)

BEGIN

select count(*) into s_a from sch;

select sum(id) as s_id from sch;

END

$$

delimiter;

2.创建一存储过程insert_student_condition_user,利用自定义错误触发条件定义,当插入学生的性别不是“男”或“女”时结束存储过程,并提示“学生性别不正确”。

表7.3  student表结构

字段名

数据类型

主键

外键

非空

唯一

自增

sno

Char(10)

sname

VARCHAR(20)

ssex

CHAR(2)

Sage

smallint

Sdept

VARCHAR(30)

enterdate

datetime

delimiter $$

create PROCEDURE insert_student_condition_user(in sno int,in sname VARCHAR(20),

in ssex varchar(2),in sage int,in sdept varchar(30))

BEGIN

DECLARE continue handler for sqlstate '42S02' select '学生性别不正确';

if ssex='男' or ssex='女' THEN

    insert into student values(sno,sname,ssex,sage,sdept);

end if;

end

$$ delimiter;

call insert_student_condition_user(1,'pqw','他',20,'C1');

call insert_student_condition_user(4,'pqw','1',20,'C1');

drop PROCEDURE insert_student_condition_user;

3.创建一存储过程update_student_borthyear,在学生表(表结构如表7.3)中添加字段”borthyear”(出生年份),在存储过程中利用游标,通过学生年龄计算出出生年份并修改表中对应字段。

create procedure update_student_borthyear(in s_no char(10))

BEGIN

    declare s_age char(10);

    declare state char(20);

    declare cur cursor for select sage from student;

    declare exit handler for 1329 set state='error';

    open cur;

REPEAT

    fetch cur into s_age;

    update student set borthyear=2018-s_age where sno=s_no;

    until state='error'

end repeat;

close cur;

END

 

 

call update_student_borthyear(201818);

 

mysql语句对于大小写不敏感,所以在写的时候要注意区分,整整找了半个小时的错误。

 

 


猜你喜欢

转载自blog.csdn.net/wuye1015/article/details/80846750