数据库原理及应用实验报告,MySQL

数据库原理及应用 实 验 报 告 册

运用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

实验目的

  1. 掌握单表查询的语法格式;
  2. 2.熟练掌握集函数使用;

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…)

  • 查询所有列([*]数据量大的情况下,不要轻易使用)
  • 查询指定列(比查询所有列更快速)
  • 取消重复行(distinct)

(2)查询满足条件的记录(where子句)

  • 比较大小(比较运算符=,>,<,>=,<=,!=或<>,!>,!<)
  • 查询经过计算的值(算术表达式,支持+、-、*、/)
  • 确定范围(字段名>=上限值 and 字段名<=下限值或字段名 between 上限值 and 下限值)
  • 确定集合(字段名[not] in(集合常量))
  • 字符匹配(字符型字段名 [not] like ‘匹配串’)
  • 涉及空值的查询(字段名is [not] null)

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语句。在对视图查询时,按视图的定义从基本表中将数据查出。

                                                                                                           

五、教师评语

猜你喜欢

转载自blog.csdn.net/weixin_43730875/article/details/106884504