数据库原理及应用 实 验 报 告 册
运用Navicat软件,结合MySQL,对下面几个实验进行分析讲解。
课 程 数据库原理及应用实验
批阅教师签名 ***
学 院 信息工程学院
专 业 计算机科学与技术
班 级 2018级计科2班
学 号 ***************
姓 名 *******
地 点 www.educoder.net 平台
指导教师 *******
学年学期 2019 年~ 2020 年第 2 学期
实验报告填写要求
1、实验报告填表说明
(1)实验名称:要求与实验大纲和实验指导书中的实验项目名称保持一致。
(2)实验学时:要求与实验大纲和实验指导书中完成该实验项目所需学时一致。
(3)实验类型:是指演示性、操作性、验证性、综合性、设计性。
演示性:教师操作,学生观察,验证理论、说明原理和方法。
操作性:学生按要求动手拆装、调试实验装置或上机操作,掌握其基本原理和方法。
验证性:按实验指导书(教材)要求,由学生通过操作验证所学理论,加深对理论知识的理解,掌握基本实验知识、方法、技能、数据处理等。
综合性:实验内容涉及本课程的综合知识或相关课程的知识,运用多种知识、多种方法,按要求或自拟实验方案进行实验。主要培养学生综合运用所学知识、实验方法和实验技能,以培养其分析、解决问题的能力。
设计性:给定实验目的、要求和实验条件,学生自己设计实验方案并加以实现的实验。学生独立完成从查阅资料、拟定实验方案、实验方法和步骤(或系统分析和设计)、选择仪器设备(或自行设计制作)进行实验并完成实验全过程,形成实验报告,培养学生自主实验的能力。
(4)若有必要,可在实验报告中粘贴打印内容,包含程序、原理图、图形、表格等
2、教师批改学生实验报告要求
(1)批改:要求用红色字迹笔全部批改,在错误的地方进行标注。
(2)评分:按百分制评分,不能评分为“优、良、中、差”或“A、B、C”。
(3)成绩:实验成绩标注在实验报告上,并填写学生实验成绩表,实验成绩作为学期成绩评定的依据。
实验名称 |
基本表定义 |
成绩 |
|
||
实验类型 |
验证性 |
实验学时 |
2 |
日期 |
4.22 |
实验目的 |
1.掌握sql语句定义基本表; 2.理解完整性约束定义方法。 |
||||
实验设备 |
Windows计算机(含Oracle11g)。 |
||||
一、 实验原理(要求、任务等) 1.创建表的语法格式(create table) CREATE TABLE <表名> (<列名> <数据类型>[ <列级完整性约束条件> ] [,<列名> <数据类型>[ <列级完整性约束条件>] ] … [,<表级完整性约束条件> ] ); 注:表名与列名的命名规则(Oracle) (1)必须以字母开头; (2)长度不能超过30个字符; (3)不能使用Oracle的保留字(create table ,alter,select 等); (4)只能使用如下字符A-Z,a-z,0-9,$,#等。 2.修改表的结构(alter table) (1)添加一个字段 ALTER TABLE <表名> ADD<新列名> <数据类型> [ 完整性约束 ] ; (2)修改字段的长度或类型 alter table 表名 modify 列名 新数据类型[或原类型(新长度)]; (3)删除一个字段【最好不要执行此操作】 alter table 表名 drop column 列名 ; (4)修改表的名字【需求更少】 rename 原名字 to 新名字; 3.删除表结构 drop table 表名; 4.完整性约束定义 (1)主键约束(primary key) (2)非空约束(not null) (3)唯一键约束(unique ) (4)检查约束(check) (5)外键约束(foreign key) 说明:可以在create table 语句和alter table 语句中创建约束。 |
|||||
二、 实验内容和步骤 (1)建立教学数据库基本表,定义主码,姓名不能重复,成绩小于等于100,并录入模拟数据。 student(sno,sname,ssex,sage,sdept) course(cno,cname,cpno,ccredit) sc(sno,cno,grade) 代码如下: -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cno` int(11) NOT NULL, `cname` varchar(255) DEFAULT NULL, `cpno` varchar(255) DEFAULT NULL, `credit` varchar(255) DEFAULT NULL, PRIMARY KEY (`cno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES ('1', '数据库', '5', '4'); INSERT INTO `course` VALUES ('2', '数学', null, '2'); INSERT INTO `course` VALUES ('3', '信息系统', '1', '4'); INSERT INTO `course` VALUES ('4', '操作系统', '6', '3'); INSERT INTO `course` VALUES ('5', '数据结构', '7', '4'); INSERT INTO `course` VALUES ('6', '数据处理', null, '2'); INSERT INTO `course` VALUES ('7', 'PASCAL语言', '6', '4');
-- ---------------------------- -- Table structure for sc -- ---------------------------- DROP TABLE IF EXISTS `sc`; CREATE TABLE `sc` ( `sno` int(11) NOT NULL, `cno` int(11) NOT NULL, `grade` varchar(255) DEFAULT NULL, PRIMARY KEY (`sno`,`cno`), KEY `cno` (`cno`), CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`sno`) REFERENCES `student` (`sno`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`cno`) REFERENCES `course` (`cno`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of sc -- ---------------------------- INSERT INTO `sc` VALUES ('201215121', '1', '92'); INSERT INTO `sc` VALUES ('201215121', '2', '85'); INSERT INTO `sc` VALUES ('201215121', '3', '88'); INSERT INTO `sc` VALUES ('201215122', '2', '90'); INSERT INTO `sc` VALUES ('201215122', '3', '80');
-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sno` int(10) NOT NULL, `sname` varchar(10) DEFAULT NULL, `ssex` varchar(10) DEFAULT NULL, `sage` varchar(10) DEFAULT NULL, `sdept` varchar(10) DEFAULT NULL, PRIMARY KEY (`sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('201215121', '李勇', '男', '20', 'CS'); INSERT INTO `student` VALUES ('201215122', '刘晨', '女', '19', 'CS'); INSERT INTO `student` VALUES ('201215123', '王敏', '女', '18', 'MA'); INSERT INTO `student` VALUES ('201215125', '张立', '男', '19', 'IS'); |
|||||
三、实验结果与分析 |
|||||
四、总结与心得体会 通过基本表实验的学习,我基本掌握了sql语句定义基本表的方法,并理解了完整性约束定义的方法,实验中也遇到过代码出错的问题,在询问同学或者之后才发现和书上的有些不同。所以有时候也不能对书上的内容生搬硬套,还是要随机而变。所以并不是做不成的,只要用心就行。
|
|||||
五、教师评语
|
实验名称 |
单表查询 |
成绩 |
|
||
实验类型 |
验证性 |
实验学时 |
2 |
日期 |
4.29 |
实验目的 |
3.掌握分组查询。 |
||||
实验设备 |
Windows计算机(含Oracle11g) |
||||
一、 实验原理(要求、任务等) 1.数据查询语法格式: SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] … FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句) [AS]<别名> [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ]; 说明: SELECT子句:指定要显示的属性列。 FROM子句:指定查询对象(基本表或视图)。 WHERE子句:指定查询条件。 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。 HAVING短语:只有满足指定条件的【组】才予以输出。 ORDER BY子句:对查询结果表按指定列值的升序或降序排序 。 2.Select语句的执行过程 (1)读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。 (2)选取满足WHERE子句中给出的条件表达式的元组。 (3)按GROUP BY子句中指定列的值分组,同时提取满足HAVING 子句中组条件表达式的那些组。 (4)按SELECT子句中给出的列名或列表达式求值输出。 (5)ORDER BY子句对输出的目标表进行排序,按ASC或DESC排列。 3.单表查询分类 (1)简单的查询语句(select…from…)
(2)查询满足条件的记录(where子句)
4.order by 列名1[asc|desc],… 对查询结果按照一个或多个属性列的升序(asc)或降序(desc)排列,默认值是升序。 5.聚集函数 (1)统计元组个数 COUNT(*) (2)统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>) (3)计算一列值的总和(此列必须为数值型) SUM([DISTINCT|ALL] <列名>) (4)计算一列值的平均值(此列必须为数值型) AVG([DISTINCT|ALL] <列名>) (5)求一列中的最大值和最小值 MAX([DISTINCT|ALL] <列名>) MIN([DISTINCT|ALL] <列名>) 6.group by 列名1,… group by子句将查询结果按某一列或多列的值分组,值相等的为一组。对查询结果分组的目的是为了细化聚集函数的作用对象。 二、 |
|||||
三、 实验内容和步骤 使用select语句完成以下操作: (1)查询“cs”系,姓“刘”的学生学号和姓名; (2)查询先行课(cpno)为空的课程名称; (3)查询选修了“1”号课程的学生学号,按学号由小到大排列; (4)统计选修了课程的学生人数; (5)查询选修了“1”号课程,并且成绩90分以上的学生人数; (6)统计各门课程的选修人数; (7)统计每个学生的选课门数; (8)查询选修的课程超过二门的学生学号及选课门数; (9)查询每个系男女生的人数、平均年龄; 代码如下: (1)select sno,sname from student where lower(sdept)='cs' and sname like'刘%'; (2)select cname from course where cpno is null; (3)select sno from sc where cno='1' order by sno; (4)select count(distinct sno) from sc ; (5)select count(sno) from sc where cno='1' and grade>=90; (6)select cno,count(sno) from sc group by cno; (7)select sno,count(cno) from sc group by sno; (8)select sno,count(cno) from sc group by sno having count(cno)>2; (9)select sdept,ssex,count(sno) from student student group by sdept,ssex;
|
|||||
三、实验结果与分析 |
|||||
四、总结与心得体会 通过学习单表查询这一章,我掌握了单表查询的语法格式。查询在数据库的使用过程中查询是经常用到的功能,掌握单表查询,是熟练使用数据库的必备技能。了解了MySQL的select的用法,让我受益良多。
|
|||||
五、教师评语
|
|||||
实验名称 |
连接查询 |
成绩 |
|
||
实验类型 |
验证性 |
实验学时 |
4 |
日期 |
5.13 |
实验目的 |
1.掌握多表连接查询的语法格式; 2.进一步掌握查询语句使用方法。 |
||||
实验设备 |
Windows计算机(含Oracle 11g) |
||||
一、 实验原理(要求、任务等) 1.连接查询:同时涉及两个以上的表的查询。 2.连接条件或连接谓词:用来连接两个表的条件。 3.一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3> 4.连接字段:连接谓词中的列名称。 5.连接条件中的各连接字段类型必须是可比的,但名字不必相同。 6.连接查询的分类 (1)等值与非等值连接查询 (2)自身连接 自连接是指在同一张表的连接查询。 (3)外连接 外连接与普通(内)连接(from a1 [inner] join a2 on 连接条件)的区别: 普通连接操作只输出满足连接条件的元组。 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。 左外连接(from a1 left join a2 on 连接条件):列出左边关系中所有的元组。 右外连接(from a1 right join a2 连接条件):列出右边关系中所有的元组。 (4)多表连接
|
|||||
四、 实验内容和步骤 使用select语句完成以下操作: (1)查询“cs”系男学的选课情况。 (2)查询选修了“数据库”课程的学生姓名。 (3)查询选修了“数据库”课程,并且成绩90分以上的学生人数、平均成绩。 (4)统计各系选课的学生人数、课程门数。 (5)统计各系男女生选课的学生人数、课程门数。 (6)查询选修课超过二门的学生学号、姓名。 (7)使用了“绿”或者“蓝”色零件的工程编号、名称,要求按工程编号从小到大排序。 (8)使用了零件“凸轮”的工程数量。 (9)统计各供应商供应工程的数量,只要求统计工程数量3个以上的,并显示供应商的编号和名称,同时按供应商编号排序。 (10)查询各“北京”供应商供应的工程数量,要求显示供应商的编号和名称。 代码如下 (1)select sc.* from sc,student where sc.sno=student.sno and lower(sdept)='cs' and ssex='男'; (2)select sname from sc,course,student where sc.cno=course.cno and sc.sno=student.sno and cname='数据库' ; (3)select count(sno),avg(grade) from sc,course where sc.cno=course.cno and cname='数据库' and grade>=90; (4)Select sdept,count(distinct student.sno),count(distinct cno) from sc,student where sc.sno=student.sno group by sdept; (5)Select sdept,ssex,count(distinct student.sno),count(distinct cno) from sc,student where sc.sno=student.sno group by sdept,ssex; (6)Select student.sno,sname,count(cno) from sc,student where sc.sno=student.sno group by student.sno,sname having count(cno)>2; (7)Select distinct j.jno,jname from spj,p,j where spj.pno=p.pno and spj.jno=j.jno and (color='绿' or color='蓝') order by j.jno; (8)Select count(distinct jno) from spj,p where spj.pno=p.pno and pname like '%凸轮%'; (9)Select s.sno,sname,count(distinct jno) from spj,s where spj.sno=s.sno group by s.sno,sname having count(distinct jno)>=3; (10)Select s.sno,sname,count(distinct jno) from spj,s where spj.sno=s.sno and city='北京' group by s.sno,sname;
|
|||||
三、实验结果与分析 |
|||||
四、总结与心得体会 通过本章连接查询的学习,使我掌握多表连接查询的语法格式,进一步掌握查询语句使用方法。 注意不同的几种连接的区别和不同的用法,用得最多的便是内连接和外连接的查询,因为它们的的方法方法效率都很高,也是大家经常使用的方法,所以要牢记他们的区别
|
|||||
五、教师评语
|
|||||
实验名称 |
嵌套查询 |
成绩 |
|
||
实验类型 |
验证性 |
实验学时 |
2 |
日期 |
5.27 |
实验目的 |
1.掌握不同嵌套查询的方法。 2.进一步掌握查询语句使用方法。 |
||||
实验设备 |
Windows计算机(含Oracle 11g) |
||||
一、 实验原理(要求、任务等) 1.嵌套查询概述 (1)一个SELECT-FROM-WHERE语句称为一个查询块。 (2)将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。 2.嵌套查询中的有关定义 (1)上层的查询块称为外层查询或父查询。 (2)下层查询块称为内层查询或子查询。 (3)SQL语言允许多层嵌套查询:即一个子查询中还可以嵌套其他子查询。 (4)子查询的限制:子查询中不能使用ORDER BY子句。 3.嵌套查询的分类 (1)带有IN谓词的子查询 (2)带有比较运算符的子查询 (3)带有ANY(SOME)或ALL谓词的子查询 (4)带有EXISTS谓词的子查询 EXISTS谓词(存在量词 ):带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则外层的WHERE子句返回真值;若内层查询结果为空,则外层的WHERE子句返回假值。由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。 NOT EXISTS谓词:若内层查询结果非空,则外层的WHERE子句返回假值:若内层查询结果为空,则外层的WHERE子句返回真值。 4.嵌套查询的求解方法 (1)相关子查询:子查询的查询条件依赖于父查询。 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。 5.使用ANY或ALL谓词时必须同时使用比较运算语义为: (1) > ANY 大于子查询结果中的某个值 (2)> ALL 大于子查询结果中的所有值 (3)< ANY 小于子查询结果中的某个值 (4)< ALL 小于子查询结果中的所有值 (5)>= ANY 大于等于子查询结果中的某个值 >= ALL 大于等于子查询结果中的所有值 6.不同形式的查询间的替换 (1)一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换。 (2)所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。 |
|||||
一、 实验内容和步骤 使用in或 exists谓词完成以下操作: (1)查询没有选择任何课程的学生; (2)查询没有选择1号课的学生; (3)查询没有选择“数据库”课程的学生; (4)查询“200215121”号学生没有选择的课程; (5)没有参与选课的男生的学生姓名; (6)没有使用“p2”零件的工程名称; (7)没有使用“s2”供应商零件的工程名称; (8)查询没有使用了红色零件的工程编号和工程名称; (9)没有人选修的课程; (10)查询选择了所有课程的学生学号和姓名; 代码如下: (1)Select * from student where sno not in (select sno from sc); (2)Select * from student where sno not in (select sno from sc where cno='1'); (3)Select * from student where sno not in (select sno from sc,course where sc.cno=course.cno and cname='数据库'); (4)Select * from course where cno not in (select cno from sc where sno='200215121'); (5)Select sname from student where sno not in (select sno from sc) and ssex='男'; (6)Select jname from j where jno not in (select jno from spj where pno='p2'); (7)Select jname from j where jno not in (select jno from spj where sno='s2'); (8)Select jno,jname from j where jno not in (select jno from spj,p where spj.pno=p.pno and color='红'); (9)Select * from course where cno not in (select cno from sc); (10)Select sno,sname from student Where not exists (select * from course Where not exists (select * from sc Where sc.cno=course.cno and sc.sno=student.sno)); |
|||||
三、实验结果与分析 |
|||||
四、总结与心得体会 通过学习本章的嵌套查询,使我掌握不同嵌套查询的方法,进一步掌握查询语句使用方法。进一步掌握了查询语句使用方法。子查询的查询条件必须依赖于父查询。有些嵌套查询可以用连接运算代替,但是有一些是不能代替的,当查询涉及多个关系时,用嵌套查询的方法逐步求解层次会更清楚,易于构造。
|
|||||
五、教师评语
|
|||||
实验名称 |
更新,视图 |
成绩 |
|
||
实验类型 |
验证性 |
实验学时 |
4 |
日期 |
6.10 |
实验目的 |
1.熟悉数据库的数据更新操作,能够实验SQL语句对数据库进行数据的插入、修改、删除操作。 2.熟悉视图定义和使用。 |
||||
实验设备 |
Windows计算机(含Oracle 11g) |
||||
一、 实验原理(要求、任务等) 1更新操作 (1)插入部分字段的值(insert) insert into 表名(列名1,列名2,…) values(列1值,列2值,...); (2)修改数据(update) update 表名 set 列名1=列值1,列名2=列值2… [where 条件 表达式]; (3)删除数据 delete from 表名 [where <条件表达式>]; (4)删除数据【慎用】 truncate table表名; 2.视图 (1)视图定义 虚表,是从一个或几个基本表(或视图)导出的表;只存放视图的定义,不存放视图对应的数据;基表中的数据发生变化,从视图中查询出的数据也随之改变。 (2)创建视图的语法格式 CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION]; (3)视图的操作 关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。 |
|||||
二、 实验内容和步骤 (1)将‘1’号课名称改为“数据库概论”、学分为3 (2)增加选课元组,(‘200215125’,‘1’,‘85’)、 (‘200215125’,‘2’,‘88’) (3)将‘is’系的选课成绩清零 (4)删除‘is’系的选课记录 (5)将系别改为小写字母(参见lower函数) (6)将男生姓名前增加字符a(参见字符串连接函数concat(串1,串2)) (7)将零件的color增加一个‘色’字,如:“红色”、“蓝色”等 (8)删除“s5”供应商所有信息(涉及到s,spj两张表) (9)创建反映cs系学生信息视图 (10)创建反映学生平均成绩的视图(包括学号、姓名、平均成绩) 代码如下: (1)Update course set cname='数据库概论',credit=3 where cno='1'; (2)insert into sc(sno, cno, grade) values('200215125','1',85),('200215125','2',88); (3)Update sc set grade=0 where sno in (select sno from student where lower(sdept)='is'); (4)Delete from sc where sno in (select sno from student where lower(sdept)='is'); (5)Update student set sdept=lower(sdept); (6)Update student set sname=concat('a',sname) where ssex='男'; (7)Update p set color= concat(color,'色'); (8)Delete from s where sno='s5'; (9)create view cs_student as select sno,sname,sage from student where lower(sdept)= 'cs' (10)create view avg1 (学号,姓名,平均成绩) as select sc.sno,sname,avg(grade) from sc,student where sc.sno=student.sno group by sc.sno,sname;
|
|||||
三、实验结果与分析 |
|||||
四、总结与心得体会 通过学习本章的更新和视图,使我熟悉数据库的数据更新操作,能够实验SQL语句对数据库进行数据的插入、修改、删除操作。熟悉视图定义和使用。了解了关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。
|
|||||
五、教师评语
|