近期课上利用MySql进行数据库实验和课设,遇到了一些问题,也收获了很多,对此进行总结。
理解和掌握数据库DDL语言,能够熟练地使用SQL语句创建、修改和删除数据库和基本表。
1. 安装数据库系统软件,熟悉其基本操作;
2. 使用SQL语句创建、使用和删除数据库;
3. 使用SQL语句创建、修改和删除基本表。
1. 安装数据库系统软件MySQL,用户名root密码为123456,学习使用命令行方式来操作数据库,学习将SQL语句导出成文件。
这里必须说明一下,实验一的安装MySql花费的时间最多,一开始,我使用了提供的5.6版本,然后一直卡在start service上,无法启动数据库,查过很多方法,包括打开管理服务->修改登录用户、修改my_default.ini文件内容等,但是都没有用,最后从官网上下载了最新版本8.0,默认安装,才成功。在此,吐槽一下,这些软件如果默认C盘安装就很少出现问题,如果修改路径就很有可能出现一些未知的问题。
2. 数据库操作
熟悉数据库相关操作命令:CREATE、SHOW、USE、DROP等。
*关键语句:DROP DATABASE IF EXISTS <数据库名>
具体要求:
1)显示所有数据库名;
2)建立一个名为school的数据库;
3)建立一个名为school_test的数据库,并且删除;
4)使用school数据库。
5)补充:查看当前使用数据库
- select database()
- status (命令符输入形式下)
3. 基本表操作
熟悉数据库基本表相关操作命令:CREATE、ALTER、DROP等。
具体要求:
1)创建学生表student,要求:
(1)该表属性包括学号(sno)、学生姓名(sname)、年龄(age)、性别(sex)、所在系(dept);
(2)学号为表的主码;
(3)姓名非空;
(4)年龄缺省值为20;
(5)性别取值只能是男或女;
2)创建课程表course (cno, cname, credit, teacher, pcno),要求:
(1)该表属性包括课程号(cno)、课程名称(cname)、学分(credit)、任课老师(teacher)、先修课(pcno);
(2)课程号为表的主码;
(3)课程名非空;
(4)学分类型为实数;
(5)先修课为外码,参考属性为本表的课程号;
3)创建选课表sc,要求:
(1)该表属性包括学号(sno)、课程号(cno)、成绩(score);
(2)学号与课程号联合作为表的主码;
(3)学号参照student表;
(4)课程号参照course表;
(5)成绩在0和100之间;
实验结果:
4)对基本表进行修改,要求:
(1)向student 表增加“入学时间” entrance列,数据类型为日期型。;
(2)将student表中dept的数据类型由字符型改为整数;
(3)课后题:把student表中增加学生名称必须取唯一值的约束条件。
5)对基本表进行删除,要求:
(1)删除基本表course;
(2)使用SQL命令“drop table sc”删除sc 基本表;
(3)分析为什么会出现删除报错,以及如何强制删除该表,在实验报告中提交。
实验结果:
分析:一开始出现了删除错误,因为course表的cno列是sc表的外码,所以不能删除,必须使用cascade才可以删除,同时需要将两个删除表的顺序调换。否则,先使用cascade删除cuorse表,就已经删除sc表了,再次执行会报错。
熟练运用SQL语言实现数据查询功能,包括单表查询、分组查询、连接查询和嵌套查询等。
1. 学习导入某个数据库文件;
2. 使用SQL语句设计各种单表查询语句、分组查询语句;
3. 使用SQL语句设计多个表的连接查询;
4. 使用SQL语句设计包含子查询的嵌套查询。
1. 使用MySQL软件导入包含数据的school1.sql,生成新的数据库。
2. 查看数据库包含的表:SHOW tables,查看具体表结构:desc <表名>
3. 单表查询
具体要求:
1)查询指定列
题目:查询全体学生的姓名与学号。
2)查询全部列
题目:查询全体学生的详细记录
3)查询经过计算的值
题目:查询全体学生的姓名及其出生年份和所在系
4)消除重复行
题目:查询选修了课程的学生学号,并且去除重复的记录
5)查询满足条件的行
a. 比较运算
题目1:查询所有年龄在20岁以下的学生的姓名和年龄;
题目2:查询计算机系全体学生的名单
b. 范围运算(BETWEEN AND)
题目1:查询年龄在19-21岁之间的学生的姓名和年龄;
题目2:查询年龄不在19-21岁之间的学生的姓名和年龄;
c. 集合运算(IN)
题目1:查询计算机专业、物联网专业的学生的姓名和所在系;
题目2:查询既不是计算机专业,也不是物联网专业的学生的姓名和所在系;
d. 字符匹配(LIKE)
题目1:查询学号为201701001的学生的详细情况;
题目2:查询所有姓王的学生的姓名和性别、年龄;
题目3:查询名字中第二个字为“晓”的学生的姓名和学号;
题目4:查询所有不姓王的学生的姓名和学号;
思考题:查询以“DB_”开头,且倒数第三个字符为T的课程的详细情况。
e. 空值情况查询(NULL)
题目:查询所有有成绩的学生学号和课程号
f. 多条件查询(AND OR)
题目:查询计算机系年龄在20岁以下的学生姓名;
g. 查询结果排列(ORDER BY)
题目1:查询选修了1号课程的学生的学号及成绩,查询结果按分数的降序排列;
题目2:查询全体学生情况,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列;
h. 使用聚集函数的查询(COUNT SUM AVG MAX MIN)
题目1:查询学生总人数;
题目2:查询选修了1号课程的学生的平均成绩;
题目3:查询选修了1号课程的学生的最高分数;
i. 分组查询(GROUP BY… HAVING)
题目1:求每个课程号及其选课人数;
题目2:查询选修了两门以上课程的学生学号;
题目3:查询平均成绩大于等于80分的学生学号和平均成绩
4. 连接查询
具体要求:
1)自然连接
题目1:查询每个学生及其选修课程的情况;
题目2:查询选修1号课程且成绩在80分以上的学生的学号和姓名。
2)自身连接
题目1:查询每一门课的间接先修课
3)多表连接
题目:查询每个学生的学号、姓名、选修的课程名及成绩
5. 嵌套查询
具体要求:
1)IN查询
题目1:查询与“王一”在同一个系学习的学生的情况;
题目2:查询选修了课程名为“DB_DESIGN”的学生学号和姓名;
2)比较查询(ANY ALL)
题目1:查询非物联网系比物联网系任何一个学生年龄小的学生的姓名和年龄;
题目2:查询非物联网系比物联网系所有学生年龄都小的学生的姓名和年龄;
这里有一些问题,加上any、all以后,报错,但是在另一个版本上却没有错误。
3)EXISTS查询
题目1:查询所有选修了1号课程的学生姓名;
题目2:查询没有选修1号课程的学生姓名;
4)相关子查询
题目1:查询每个学生超过他自己选修课程平均成绩的课程号;
5)思考题
题目1:查询选修了全部课程的学生姓名;
题目2:查询至少选修了学生201702001选修的全部课程的学生学号。
实验源码下载