《数据库原理与应用实验》
实验报告册
学年第学期
学院:
专业:
年级:
姓名:
学号:
任课教师:
MySQL+Navicat安装步骤与下载地址百度地址:
配置与简单使用百度地址:
本文档所书写的代码,为本人纯手工敲打,并且通过软件测试成功,欢迎大家进行学习,如有错误,可联系本人
实验一创建和维护数据库
一、实验目的
(1)掌握在Windows 平台下安装与配置MySQL 的方法。(2)掌握启动服务并登录MySQL 数据库的方法和步骤。(3)掌握MySQL 数据库的相关概念。
(4)掌握使用Navicat 工具和SQL 语句创建数据库的方法。
(5)掌握使用Navicat 工具和SQL 语句删除数据库的方法。
二、实验要求
(1)学生提前准备好实验报告,预习并熟悉实验步骤;(2)遵守实验室纪律,在规定的时间内完成要求的内容;三、实验内容及步骤
(1)在Windows 平台下安装与配置MySQL 版。
(2)在服务对话框中,手动启动或者关闭MySQL 服务。(3)使用Net 命令启动或关闭MySQL 服务。
(4)分别用Navicat 工具和命令行方式登录MySQL。
(5)在文件中将数据库的存储位置改为D:\MYSQL\DATA。
(6)创建数据库。
①使用Navicat 创建学生信息管理数据库gradem。
②使用SQL 语句创建数据库MyDB。
(7)删除数据库。
①使用Navicat 图形工具删除gradem 数据库。
②使用SQL 语句删除MyDB 数据库。
常见的数据库产品有哪些
五、实验总结
1、收获
2、存在的问题
实验二管理表
一、实验目的
(1) 掌握表的基础知识。
(2) 掌握使用Navicat管理工具和SQL语句创建表的方法。
(3) 掌握表的修改、查看、删除等基本操作方法。
二、实验要求
(1)学生提前准备好实验报告,预习并熟悉实验步骤;
(2)遵守实验室纪律,在规定的时间内完成要求的内容;
三、实验内容及步骤
(1)在gradem数据库中创建表~表所示结构的表。
表 student表的表结构
表 course表(课程名称表)的表结构
表 sc表(成绩表)的表结构
表 teaching表(授课表)的表结构
(2) 向表至表输入数据记录,见表~表。
表课程关系表course
表成绩表sc
表教师表teacher
表授课表teaching
(3)在navicat下修改表结构。
①向student表中增加“入学时间”列,其数据类型为日期时间型。
②将student表中的sdept字段长度改为20。
③将student表中的speciality字段删除。
④删除student表。
(4) 利用SQL命令(create table、alter table、drop table)完成对表的操作
①利用create talbe 命令完成student表和course表的定义。
②利用alter table、drop table命令实现(3)中的所有任务。
四、思考题
(1) 在定义基本表语句时,NOT NULL参数的作用是什么
(2) 主码可以建立在“值可以为NULL”的列上吗
五、实验总结:
1、收获
2、存在的问题
实验三简单查询——单表无条件和有条件查询
一、实验目的
(1) 掌握SELECT语句的基本用法。
(2) 使用WHERE子句进行有条件的查询。
(3) 掌握使用IN和NOT IN,BETWEEN…AND和NOT BETWEEN…AND来缩小查询范围的方法。
(4) 利用LIKE子句实现字符串匹配查询。
二、实验要求
1、学生提前准备好实验报告,预习并熟悉实验步骤;
2、遵守实验室纪律,在规定的时间内完成要求的内容;
三、实验内容及步骤
在上次实验建立的Gradem或Gradem1数据库中完成下面查询:
(1) 查询所有学生的基本信息、所有课程的基本信息和所有学生的成绩信息(用三条SQL语句)。SELECT *
FROM student;
SELECT *
FROM course;
SELECT *
FROM sc;
(2) 查询所有学生的学号、姓名、性别和出生日期。
SELECT sno,sname,ssex,sbirthday
FROM student;
(3) 查询所有课程的课程名称。
SELECT cname
FROM course
(4) 查询前10门课程的课号及课程名称。
SELECT cno,cname
FROM course
WHERE cno<=10
(5) 查询所有学生的姓名及年龄。
SELECT sname ,year(now())-year(sbirthday)
FROM student;
(6) 查询所有年龄大于18岁的女生的学号和姓名。
SELECT sno,sname
FROM student
WHERE ssex='女'and year(now())-year(sbirthday)>18
(7) 查询所有男生的信息。
SELECT *
FROM student,teacher
WHERE ssex='男'and tsex='男'
(8) 查询所有任课教师的姓名(Tname)和所在系别(Tdept)。SELECT tname,tdept
FROM teacher
(9) 查询“电子商务”专业的学生姓名、性别和出生日期。SELECT sname,ssex,sbirthday
FROM student
WHERE sdept='电子商务'
(10) 查询Student表中的所有系名。
SELECT sdept
FROM student
(11) 查询“C01”课程的开课学期。
SELECT cterm
FROM teaching
WHERE cno='c01'
(12) 查询成绩在80~90分之间的学生学号及课号。
SELECT sno,cno
FROM sc
WHERE degree BETWEEN 80 and 90
(13) 查询在1970年1月1日之前出生的男教师信息。
SELECT *
FROM teacher
WHERE tbirthday<'1970-01-01'and tsex=’男’;
(14) 输出有成绩的学生学号。
SELECT sno
FROM sc
WHERE degree is NOT NULL;
(15) 查询所有姓“刘”的学生信息。
SELECT *
FROM student
WHERE sname LIKE'刘%'
(16) 查询生源地不是山东省的学生信息。
SELECT *
FROM student
WHERE saddress NOT LIKE'山东%'
(17) 查询成绩为79分、89分或99分的记录。
SELECT *
FROM sc
WHERE degree='79' or degree='89' or degree='99'
(18) 查询名字中第二个字是“小”字的男生的学生姓名和地址。SELECT sname,saddress
FROM student
WHERE ssex='男' and sname LIKE'_小'
(19) 查询名称以“计算机_”开头的课程名称。
SELECT cname
FROM course
WHERE cname LIKE'计算机_'
(20) 查询计算机工程系和软件工程系的学生信息。
FROM student
WHERE sdept='计算机工程系' OR sdept='软件工程系'
四、思考题
1、LIKE的通配符有哪些分别代表什么含义
通配符含义
% 有零个或更多个字符组成的任意字符串
_ 任意单个字符
[ ] 用于指定范围,例如[A ~ F],表示A ~ F范围内的任何单个字符
[ ^ ] 表示指定范围之外的,例如[ ^A ~ F ],表示A ~ F 范围以外的任何单个字符。
2、知道学生的出生日期,如何求出其年龄
SELECT year(now())-year(sbirthday)
FROM student;
3、IS能用“=”来代替吗
不能
is是用来判断null的,比如 remark is null 或者remark is not null
=是用来直接比较值的。
4、关键字ALL和DISTINCT有什么不同的含义
ALL表示所有的字段,有重复的2条,2 条都显示,
DISTINCT表示如果有重复的,只取一条。
五、实验总结:
1、收获
经过这节数据库课程的学习,我基本上掌握了创建数据库以及对数据库的操作的基础知识。学习了SQL数据库中的增、删、改、查等功能,数据库这门课涉及到以前的知识不多,是一门从头学起的课程,即使基础不是很好,只要认真听讲、复习功课,还是一门比较容易掌握的课。
2、存在的问题
不够熟悉对数据库系统的操作,不会运用快捷键,需要更多的练习和操作。
实验四简单查询——分组与排序
一、实验目的:
(2) 利用ORDER BY子句对查询结果排序。
(3) 掌握聚集函数的使用方法。
二、实验要求
1、学生提前准备好实验报告,预习并熟悉实验步骤;
2、遵守实验室纪律,在规定的时间内完成要求的内容;
三、实验内容及步骤
在Gradem或Gradem1数据库中完成下面查询:
(1) 统计有学生选修的课程的门数。
SELECT COUNT(DISTINCT cno)
FROM course
(2) 计算“c01”课程的平均成绩。
SELECT AVG(degree)
FROM sc
WHERE cno='c01';
(3) 查询选修了“c03”课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT sno,degree
FROM sc
WHERE cno='c03'
ORDER BY degree DESC;
(4) 查询各个课程号及相应的选课人数。
SELECT cno,COUNT(sno)
FROM sc
GROUP BY cno
(5) 统计每门课程的选课人数和最高分。
SELECT COUNT(sno),MAX(degree)
FROM sc
GROUP BY cno
(6) 统计每个学生的选课门数和考试总成绩,并按选课门数降序排列。
SELECT COUNT(sno),sum(degree)
FROM sc
GROUP BY sno
ORDER BY COUNT(sno) DESC;
(7) 查询选修了3门以上课程的学生学号。
SELECT sno
FROM sc
GROUP BY sno
HAVING COUNT(cno)>3
(8) 查询成绩不及格的学生学号及课号,并按成绩降序排列。SELECT sno,cno
FROM sc
WHERE degree<60
ORDER BY degree DESC
(9) 查询至少选修一门课程的学生学号。
SELECT sno
FROM sc
GROUP BY sno
HAVING COUNT(cno)>1
(10) 统计输出各系学生的人数
SELECT sdept ,COUNT(*)
FROM student
GROUP BY sdept
(11) 统计各系的男、女生人数。(两条命令)
From student
Group by sdept ,ssex
(12) 统计籍贯的男、女生人数。(两条命令)
Select saddress,ssex,count(*)
From student
Group by saddress ,ssex
(13) 统计各系的老师人数,并按人数升序排序。
SELECT tdept ,COUNT(*)
FROM teacher
GROUP BY tdept
ORDER BY COUNT(*) DESC
(14) 统计不及格人数超过10人的课程号。
SELECT cno
FROM sc
GROUP BY cno
HAVING COUNT(degree<60)>10
(15)统计选修人数超过10人的课程号。
SELECT cno
FROM sc
GROUP BY cno
HAVING COUNT(*)>10
(16) 查询软件系的男生信息,查询结果按出生日期升序排序,出生日期相同的按地址降序排序。SELECT *
FROM student
WHERE ssex='男' and sdept='信息工程系'
ORDER BY sbirthday,saddress DESC
四、思考题
(1) 聚集函数能否直接使用在SELECT子句、HAVING子句、WHERE子句、GROUP BY子句中
(2) WHERE子句与HAVING子句有何不同
五、实验总结:
1、收获
2、存在的问题
实验五多表查询
一、实验目的
(1) 掌握SELECT语句在多表查询中的应用。
(2) 掌握多表连接的几种连接方式及应用。
二、实验要求
1、学生提前准备好实验报告,预习并熟悉实验步骤;
2、遵守实验室纪律,在规定的时间内完成要求的内容;
三、实验内容及步骤:
在Gradem或Gradem1数据库中完成下面查询:
(1)查询计算机工程系女学生的学生学号、姓名及考试成绩。
SELECT ,sname,
FROM student,sc
WHERE = and ='计算机工程系' and ='女';
(2)查询“李勇”同学所选课程的成绩。(不考虑重名)
SELECT
FROM student,sc
WHERE = and ='李勇'
(3)查询“李新”老师所授课程的课程名称。
SELECT
FROM teacher,teaching,course
WHERE = and = and ='李新'
(4)查询女教师所授课程的课程号及课程名称。
SELECT ,
FROM teacher,teaching,course
WHERE = and = and ='女'
(5)查询至少选修一门课程的女学生姓名。
SELECT
FROM student,sc
WHERE = AND ='女'
GROUP BY
HAVING COUNT>1
(6)查询姓“王”的学生所学的课程名称。
SELECT
FROM student,sc,course
WHERE = AND = AND sname='王%'
(7)查询选修“数据库”课程且成绩在80~90分之间的学生学号及成绩。
SELECT ,
FROM student,sc,course
WHERE = AND = AND cname='数据库'
AND degree BETWEEN 80 AND 90
(8)查询课程成绩及格的男同学的学生信息及课程号与成绩。
SELECT student.*,,
FROM student,sc,course
WHERE = AND =
AND degree>60 AND ssex='男'
(9)查询选修“c04”课程的学生的平均年龄。
SELECT AVG(year(NOW())-YEAR(sbirthday))
FROM student,sc,course
WHERE = AND = AND ='c04'
(10)查询学习课程名为“数学”的学生学号和姓名。
SELECT ,sname
FROM student,sc,course
WHERE = AND = AND cname='数学'
(11)查询“钱军”教师任课的课程号,选修其课程的学生的学号、姓名和成绩。
SELECT ,,sname,
FROM teacher,teaching,course,student,sc
WHERE = and = and =
and = and ='钱军'
(12)查询在第3学期所开课程的课程名称及成绩。
SELECT ,
FROM course,sc,teaching
WHERE = and =
and cterm='3'
(13)查询“c02”号课程不及格的学生信息。
SELECT student.*
FROM student,sc
WHERE = and cno='c02' and degree<60 and degree IS NULL
(14)查询软件系成绩在90分以上的学生姓名、性别和课程名称。
SELECT ,ssex,
FROM student,sc,course
WHERE = and = and sdept='软件系' AND degree>90
(15)查询同时选修了“c04”和“c02”课程的学生姓名和成绩。
SELECT ,
FROM student,sc,course
WHERE = and = and ='c04' AND ='c02'
四、思考题
(1) 指定一个较短的别名有什么好处
更容易辨识
方便查看
(2) 内连接与外连接有什么区别
内连接: 只有两个表相匹配的行才能在结果集中出现
外连接: 包括
左外连接(左边的表不加限制)
右外连接(右边的表不加限制)
全外连接(左右两表都不加限制)
(3) “=”与IN在什么情况下作用相同
选值只有一个
五、实验总结
1、收获
经过近一个小时的调试,编写,最终得出结论,并进行书写。使我加深了对mysql进一步学习和认识,更加熟练了对软件的使用,收获颇丰。
2、存在的问题
对于语句的使用略显生疏,需要进一步的练习,加深认识。