课程实验课程名称数据库课程实验题目名称数据库SQL语言的应用学生学院计算机学院专业班级计科5班学号3111005909学生姓名周鸿圳指导教师郝彦军2014年1 月数据定义测试(1)数据库的创建及基本表的定义,删除与修改为用户3111005909创建模式S_T错误原因:Mysql不支持创建模式,创建的数据库就相当于模式。
同理,既然没有创建,就没有删除,也没有模式的级联和限制创建数据库student_course:使用数据库student_course并且创建‘学生’表student:创建‘课程’表course:创建‘学生选课’表SC查询三个表的结构:student表的结构course表的结构SC表的结构修改表student,向其添加‘入学时间’,类型为时间类型修改student表中的Sage属性为int为course表添加唯一值的约束条件:(2)索引的建立与删除分别为student,course和SC表建立索引删除表student的索引删除student表中的S_entrance原因:下一步的插入数据没有S_entrance这一项,所以在这里把它删了,不然在用insert 表名时会因为列数据不对应而报错,如图:向student表中插入数据:向course表中插入数据:向SC表中插入数据数据查询测试(1)单表查询查询全体学生的姓名和学号查询全体学生姓名及其出生年份,用小写字母表示系别查询全体计算机系的学生查询年龄在20岁以下的全体学生姓名及其年龄查询成绩在85分以下的学生学号查询年龄不在20到23岁之间的学生系别,姓名和年龄查询计算机系,数学系和信息系的学生姓名和性别查询学号为’200215121’的学生的具体情况查询所有姓李的同学的学号和性别查询学生中姓名第二个字为‘阳’字的学生姓名和学号,性别查询计算机系下年龄在20岁以下的学生姓名查询迅修了3号课程的学生的学号及其成绩,降序排序查询全体学生情况,结果按所在系的序号排列,同系学生按年龄降序排序查询学生的总人数计算1号课程的学生的平均成绩查询选修1号课程的学生的最高成绩查询学号为‘200215122’的学生的全部选修成绩的总分数求各个课程号及相应的选课人数查询选修了三门学科以上的学生学号(2)连接的查询查询每个学生及其选修的情况查询选修2号课程并且成绩在90分以上的所有学生查询每个学生的学号,姓名,选修的课程名及其成绩(3)嵌套查询查询与李晨同一个系的学生查询每门选修的间接先修课查询选修了课程名为信息系统的学生姓名和学号查询其他系中比计算机系某一学生年龄小的学生姓名和年龄查询选修了1号课程的学生姓名查询没有选修1号课程的学生姓名(4)集合查询查询计算机科学系的学生及年龄不大于19岁的学生查询计算机系的学生与年龄不大于19岁的学生的交集原因:Mysql不支持intersect,为了查询表的交集,给出以下查询方法查询计算机系学生与年龄不大于19岁的学生的交集原因:Mysql不支持except,解决方法可为数据更新测试(1)插入数据插入一个新生元祖插入张民的学生信息插入一条选课记录对每个系求学生的平均年龄,将结果存入数据库(2)修改数据将学生200215121的年龄改为22岁将所有的学生年龄加一岁将计算机科学系全体学生的成绩设置为0(3)删除数据删除学号为200215128的元组视图(1)定义视图建立信息系的学生视图定义一个反映学生出生年份的视图(2)删除视图删除视图BT_S(3)更新视图更新视图IS_Student插入一个新的学生记录删除视图中的记录实验总结书上所说的SQL语句和实际操作的mysql语句还是有一定差别的。
例如MySql中没有交操作intersect,差操作except。
此外在实验过程中还遇到了如语法错误,外键问题,表重定义问题。
数据库安全性控制授权与回收首先建立u1-u7的用户把查询student表的权限授给用户u1错误原因:不能在用户表中找到u1这个用户。
在Mysql中用户名必须为创建时的全名,解决方法如下:将student,course 表的全部操作权限授予用户u2,U3错误原因:Mysql不支持同时将两张表的权限授予用户,解决方法如下:把对Sc表的查询权限授予所有用户错误原因:public 不是用户表里面的用户,也就是说Mysql没有用户组的概念,不能用public 来代替所有的用户,解决方法暂为一个个授权。
把查询student表和修改学生学号的权限授予用户u4把对表SC的insert权限授予u5,并允许将此权限再授予其他用户将u5的权限授予u6权限收回将u4修改学生学号的权限收回把用户u5对Sc表的insert 权限收回错误原因:mysql不支持cascade,所以这里报错;角色的创建创建角色R1错误原因:Mysql不支持角色的创建,所以这里与角色有关的操作都无法进行视图机制建立计算机系学生的视图,把该视图的select权限授予u7,再将权限授予u6审计对SC表结构或修改SC表数据的操作进行审计错误原因:mysql服务器自身没有提供审计功能数据库完整性因为在之前就定义了数据库表student,course,sc,这时为SC表中定义的参照完整性为:修改表SC并显式说明参照完整性的违约处理执行结果如下:用户定义的完整性:列值唯一unique,建立部门表DEPT,要求部门名称列值唯一,部门编号Deptno为主码用check短语指定列值应该满足的条件Student 表的Ssex 只允许取‘男’或者‘女’Student.txt内容如下执行结果:错误原因:在之前建立SC表的时候,SC表的外键Sno与student表的主键约束,所以此时无法删除student表,此时可以先删除SC表,再删除student表。
重新建立SC表执行结果如下:元组上的约束条件的定义当学生的性别是男的时候,其名字不能以MS.开头修改student表,如下图所示:执行结果如图:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是‘男’或‘女’修改student.txt,结果如图:执行结果:错误原因:少了逗号将constraint与属性隔开根据错误原因将student.txt进行简单修改,执行结果如下错误原因:Sname char(20),constraint c2 not null 这句报错,说明constraint 的列级约束键后不能为空,否则将产生错误最终修改后的student.txt 如下:执行结果如下:查看表student :建立教师表TEACHER,要求每个教师的应发工资不低于3000元。
教师表teacher.txt 如下:执行结果如下:修改表中的完整性约束:去掉表student的性别约束:执行结果如下:错误原因:在mysql中,没有删除constraint的语句,所以在读到constraint时就会报错域中完整性约束:建立一个性别域,并声明性别域的取值范围错误原因:mysql不支持domain语句触发器定义触发器定义一个before行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000,如果低于4000,自动更改为4000元”Before.txt如下:执行结果如下:错误原因:Mysql不支持同时触发insert 或者update的条件。
此外,mysql的触发器需要定义在DELIMITER中.mysql也不支持AS BEGIN这种写法;此外,给新的字段赋值的时候,也需要用到SET这个关键字。
做出以上修改之后便可定义正确的触发器。
执行结果如下:定义一个AFTER行级触发器,当教师表teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录。
AFTER.TXT如下:执行结果如下:错误原因:mysql的trigger是仅仅statement激活,不能对同一table的同一个event写两个trigger, 所以我们在之前已经定义了触发器INSERT_OR_UPDATE_SAL,此时再定义就会出现错误。
删除触发器删除Teacher表的触发器INSERT_OR_UPDATE_SAL执行结果:错误原因:删除时不需要加上表的名称解决方法如下:心得体会:这次的实验2走了很多的弯路,首先在实验课上被告知mysql是不支持的check约束的,所以在实验开始时就觉得寸步难行,既然不支持check约束,那么后面的很多实验都将无法进行。
后来通过学习,mysql是支持check约束的,所以在接下来的实验虽然也遇到了一些小麻烦,但是总算顺利完成了。
此外,mysql的触发器也是比较困难的一部分,书上的例子根本无法再mysql上顺利运行,通过学习后才知道mysql的触发器需要放在关键字DELIMITER 里面,且还有好多约束。
通过学习并且运行mysql网站上的API上的例子,终于明白触发器的使用。
后来也终于顺利完成了报告。