admin 管理员组文章数量: 887032
2023年12月19日发(作者:网站特效设计的实验分析与体会)
MySQL数据库基础与实例教程练习题参考答案
由于时间仓促,中难免存在错误,不妥之处恳请读者批评指正!
第一章答案
1.数据库管理系统中常用的数学模型有哪些?
数据库管理系统通常会选择某种“数学模型”存储、组织、管理数据库中的数据,常用的数学模型包括“层次模型”、“网状模型”、“关系模型”以及“面向对象模型”等。
2.您听说过的关系数据库管理系统有哪些?数据库容器中通常包含哪些数据库对象?
目前成熟的关系数据库管理系统主要源自欧美数据库厂商,典型的有美国微软公司的SQL Server、美国IBM公司的DB2和Informix、德国SAP公司的Sybase、美国甲骨文公司的Oracle。
数据库容器中通常包含表、索引、视图、存储过程、触发器、函数等数据库对象。
3.通过本章知识的讲解,SQL与程序设计语言有什么关系?
SQL并不是一种功能完善的程序设计语言,例如,不能使用SQL构建人性化的图形用户界面(Graphical User Interface,GUI),程序员需要借助Java、VC++等面向对象程序设计语言或者HTML的FORM表单构建图形用户界面(GUI)。如果选用FORM表单构建GUI,程序员还需要使用JSP、PHP或者.NET编写Web应用程序,处理FORM表单中的数据以及数据库中的数据。
其他答案:
1、首先SQL语言是数据库结构化查询语言,是非过程化编程语言。而程序设计语言则有更多的面向对象及逻辑程序设计。比如用SQL语言编写图形用户界面(例如窗口、进度条),是无法实现的。2、SQL语言可以说是,程序设计语言和数据库之间的一个翻译官。程序设计语言需要操作数据库时,需要借助(或者说调用)SQL语言来翻译给数据库管理系统。3、不同数据库管理系统会有一些特殊的SQL规范,比如 limit关键词在SQL Server中无法使用。而这些规范与程序设计语言无关。
4.通过本章的学习,您了解的MySQL有哪些特点?
与题目2中列举的商业化数据库管理系统相比,MySQL具有开源、免费、体积小、便于安装,但功能强大等特点。
5.通过本章的学习,您觉得数据库表与电子表格(例如Excel)有哪些区别?
限于本章的知识点:外观上,关系数据库中的一个数据库表和一个不存在“合并单元格”的电子表格(例如Excel)相同。与电子表格不同的是:同一个数据库表的字段名不能重复。为了优化存储空间以及便于数据排序,数据库表的每一列必须指定某种数据类型。
关系数据库中的表是由列和行构成的,和电子表格不同的是,数据库表要求表中的每一行记录都必须是唯一的,即在同一张数据库表中不允许出现完全相同的两条记录。
6.您所熟知的数据库设计辅助工具有哪些?您所熟知的模型、工具、技术有哪些?
数据库设计辅助工有数据模型、数据建模工具、关系数据库设计技术。其中常用的数据模型有ER模型和类图;常用的数据建模工具如ERwin、PowerDesigner、Visio等;常用的关系数据库设计技术如数据库规范化技术。
1.模型
数据模型有E-R图或者类图等数据模型。业务模型有程序流程图、数据流程图DFD、时
序图、状态图等业务模型。
2.工具
软件项目管理工具如美国微软公司的Project,数据建模工具如ERwin、PowerDesigner、Visio,业务建模工具如PowerDesigner、Rational Rose以及Visio等。IDE工具有VC++6.0、Visual Studio、Eclipse以及NetBeans等。测试工具有Junit单元测试工具、QuickTest
Professional功能测试工具以及LoadRunner性能测试工具等。
3.技术
软件开发时常用的技术包括:面向对象分析和设计技术、结构化分析和设计技术、软件测试技术和关系数据库设计技术等。
7.请您罗列出“选课系统”需要实现哪些功能,使用数据库技术能够解决“选课系统”中的哪些商业问题?
“选课系统”中存在的商业问题(等于“选课系统”需要实现的功能):
如何存储以及维护课程、学生、教师以及班级的详细信息?
不同教师申报的课程名能否相同?如果允许课程名相同,如何区分课程?
如何控制每位教师只能申报一门选修课程?
如何控制每门课程的人数上限在(60、150、230)中取值?
如何控制每一门课程的选课学生总人数不超过该课程的人数上限?
如何实现学生选课功能、退选功能以及调课功能?
如何控制每位学生最多可以选修两门课程,且两门课程不能相同?
系统如何自动记录学生的选课时间?
如何统计每一门课程还可以供多少学生选修?
如何统计人数已经报满的课程?
如何统计某一个教师已经申报了哪些课程?
如何统计某一个学生已经选修了多少门课程,是哪些课程?
如何统计选修人数少于30人的所有课程信息?
如何统计选修每一门课程的所有学生信息?
课程信息删除后,如何保证选择该课程的学生可以选修其他课程?
如何通过搜索关键字检索自己感兴趣的课程信息?
8.您所熟知的编码规范有哪些?
1.命名规范
2.注释
3.书写规范(缩进规范)
9.您是如何理解“E-R图中实体间的关系是双向的”?能不能举个例子?
请参看1.3.1章节的内容。
10.E-R图中,什么是基数?什么是元?什么是关联?
请参看1.3.2章节的内容。
11.E-R图的设计原则是什么?您是怎么理解E-R图的设计原则的?
请参看1.3.3章节数据库开发人员通常采用“一事一地”的原则的内容。
12.关系数据库的设计步骤是什么?为每张表定义一个主键有技巧可循吗?主键与关键字有什么关系?
关系数据库的设计步骤,请参看1.4章节的内容。
为每张表定义一个主键技巧,请参看1.4.2章节的内容。
主键与关键字有什么关系,请参看1.4.2章节的内容。
12.在关系数据库设计过程中,如何表示E-R图中的1:1、1:m、m:n关系?
请参看1.4.3以及1.4.4章节的内容。
13.在数据库管理系统中,您所熟知的数据类型有哪些?每一种数据类型能不能各列举一些例子?
请参看1.4.5章节的内容。
14.您所熟知的约束条件有哪些?MySQL支持哪些约束条件?
请参看1.4.6章节的内容。MySQL支持主键(primary key)约束、外键(foreign key)约束、唯一性()约束、默认值(default)约束、非空()约束。
15.数据库中数据冗余的“并发症”有哪些,能不能列举一些例子?
数据冗余“并发症”插入有异常、删除异常、修改复杂。例子参看1.4.8章节的内容。
16.如何避免数据冗余?什么是1NF、2NF、3NF?
使用规范化减少数据冗余请参看1.4.8章节的内容。
17.根据本章的场景描述——“很多团购网站在网上对房源进行出租”的E-R图,请设计该场景描述的数据库表。
团购网站(网站ID,网址)
房源(房间号,房型)
顾客(顾客号)
出租(出租ID,网站ID,房间号,顾客号)
19.如果将学生student表设计为如下表结构:
请用数据库规范化的知识解释该表是否满足3NF范式的要求?该表是否存在数据冗余?是否会产生诸如插入异常、删除异常、修改复杂等数据冗余“并发症”?
此题题目中的学生student表存在问题。建议将学生student表修改为如下结构。
学号 姓名 性别 课程号 课程名 成绩 课程号 课程名 成绩 居住地 邮编
(student_no,student_no,student_name,student_contact,class_no,department_name)
请参看1.4.8章节的内容。
20.在“选课系统”中,学生选课时,由于每一门课程受到教室座位数的限制,每一门课程设置了人数上限,如何确保每一门课程选报学生的人数不超过人数上限?有几种设计方案?这些设计方案的区别在哪里?
请参看1.4.9章节的内容。
21.“选课系统”有几张表,每个表有哪些字段?
teacher(teacher_no,teacher_name ,teacher_contact)
classes(class_no,class_name, department_name)
course(course_no ,course_name, up_limit,description,status,teacher_no)
student(student_no, student_name, student_contact,class_no)
choose(choose_no,student_no char(11),course_no,score,choose_time)
22.依据自己所掌握的知识,描述如何使用数据库技术解决“选课系统”问题域中的问题。
如何存储以及维护课程、学生、教师以及班级的详细信息?
答:course、student、teacher、classes表可以用于存储以及维护课程、学生、教师以及班级的详细信息。
不同教师申报的课程名能否相同?如果允许课程名相同,如何区分课程?
答:如果需求要求:不同教师申报的课程名不能相同,则可以通过将course表的course_name字段设置为unique约束即可。
如果需求要求:不同教师申报的课程名可以相同,此时可以通过给course表添加course_id(无任何逻辑意义)主键字段,标记不同教师申报的课程。
如何控制每位教师只能申报一门选修课程?
请参看1.4.3章节的“情形二”内容。
如何控制每门课程的人数上限在(60、150、230)中取值?
答:MySQL目前不正常check约束。但该问题可以借助MySQL触发器解决,该题超出本章知识点内容,请参看触发器章节内容。
如何控制每一门课程的选课学生总人数不超过该课程的人数上限?
请参看1.4.9章节的内容。
如何实现学生选课功能、退选功能以及调课功能?
答:该问题可以借助MySQL存储过程、事务解决,该题超出本章知识点内容,请参看存储过程章节以及事务章节的内容。
如何控制每位学生最多可以选修两门课程,且两门课程不能相同?
答:该问题可以借助MySQL存储过程解决,该题超出本章知识点内容,请参看存储过程章节内容。
系统如何自动记录学生的选课时间?
答:借助MySQL的now()函数。
如何统计每一门课程还可以供多少学生选修?
如何统计人数已经报满的课程?
如何统计某一个教师已经申报了哪些课程?
如何统计某一个学生已经选修了多少门课程,是哪些课程?
如何统计选修人数少于30人的所有课程信息?
如何统计选修每一门课程的所有学生信息?
答:上述统计信息超出本章知识点内容,请参看表记录的检索章节内容。
课程信息删除后,如何保证选择该课程的学生可以选修其他课程?
答:可以通过外键约束级联删除实现,也可以通过触发器实现。
如何通过搜索关键字检索自己感兴趣的课程信息?
答:通过全文检索或者模糊查询like关键字实现。
第二章答案
1.通过本章的学习,您了解的MySQL有哪些特点?
答:请参看2.1.1章节内容。
2.请您简单描述MySQL的使用流程。什么是MySQL客户机?登录主机与MySQL客户机有什么关系?什么是MySQL会话?
答:请参看2.1.1章节内容。
MySQL客户机:与MySQL服务器通话的客户端不止一种,比如Windows操作系统下的命令行,可以直接通过命令建立与mysql数据库的通话,另外还有phpmyadmin、MySQL
等图形化界面连接方式等。本书经常使用的MySQL客户机程序存放在C:Program
FilesMySQLMySQL Server 5.6bin目录。
在一台登录主机上可以开启多个MySQL客户机。
数据库用户访问MySQL服务器的数据时,首先需要选择一台登录主机,然后在该登录主机上开启MySQL客户机,输入正确的账户名、密码,建立一条MySQL客户机与MySQL服务器之间的“通信链路”。通信链路断开之前,MySQL客户机可以向MySQL服务器发送多次“请求”,MySQL服务器会对每一次请求做出“响应”,请求/响应期间称为MySQL会话。
3.通过Google或者Baidu搜索引擎,搜索常用的MySQL客户端工具(或者客户机程序)有哪些。
答案参见知乎,网址:/question/20423448
4.MySQL服务、MySQL服务实例、MySQL服务器分别是什么?什么是端口号?端口号有什么作用?
答:请参看2.1.1章节内容。
5.请列举配置文件中常用的参数选项组以及参数信息。
答:请参看2.1.5章节内容。
6.启动MySQL服务的方法有哪些?停止MySQL服务的方法有哪些?
答:请参看2.1.4章节内容。
7.MySQL客户机连接MySQL服务器的方法有哪些?连接MySQL服务器时,需提供哪些信息?
答:请参看2.1.7章节内容。
8.字符、字符集、字符序分别是什么?字符序的命名规则是什么?
答:请参看2.2.1章节内容。
9.您所熟知的字符集、字符序有哪些?它们之间有什么区别?
答:请参看2.2.2章节内容。
10.请简述MySQL字符集的转换过程。
答:请参看2.2.3章节内容。
11.MySQL系统数据库有哪些?这些系统数据库有什么作用?
答:请参看2.2.1章节内容。
12.如果仅仅需要在数据库中存储中文简体字符,那么如何设置MySQL字符集?
答:请参看2.2.4章节内容。
13.请自己编写一段SQL脚本文件,并运行该脚本文件中的代码。
答:请参看2.2.5章节内容。
14.您所熟知的存储引擎有哪些?MyISAM存储引擎与InnoDB存储引擎相比,您更喜欢哪一个?它们都有什么特点?
答:请参看2.4.1章节内容。
15.创建student数据库,并在该数据库中创建student表,用于保存您的个人信息(如姓名、性别、身份证号、出生日期等),并完成下列操作或问题。
1)上述的student表有没有出现数据冗余现象?(提示:出生日期可以由身份证号推算得出)
答:出生日期可由身份证号计算得出,所以上述的student表存在数据冗余现象。
2)student数据库目录存放在数据库根目录中,默认情况下,根目录是什么?
答:使用命令“show variables like 'datadir';”可以查看参数datadir的值。默认安装MySQL后,数据库根目录datadir的值为“C:/Documents and Settings/All Users/Application
Data/MySQL/MySQL Server 5.6/Data/”。
3)如何查看student数据库的结构。
答:请参看2.3.3章节内容。
4)如何查看student表的结构,并查看该表的默认字符集、字符序、存储引擎等信息。
答:请参看2.4.4章节内容。
5)student数据库目录中存放了哪些文件?数据库根目录中存放了哪些文件?
答:请参看2.4.1章节内容。
student数据库目录中存放了如下文件:
(1) 数据库文件(如)
(2) 表名、后缀名为frm的表结构定义文件
(3) 如果student数据库中存在InnoDB存储引擎的独享表空间的表,则student数据库目录中还会存放一个名为“表名.ibd”的数据文件。
(4) 如果student数据库中存在MyISAM存储引擎的表,则student数据库目录中会存在一个文件名为表名、后缀名为MYD(即MYData的简写)的数据文件以及文件名为表名、后缀名为MYI(即MYIndex的简写)的索引文件。
数据库根目录中存放如下文件以及目录(如下图所示):
数据库目录(例如test数据库目录、student数据库目录)
ib_logfile0及ib_logfile1是重做日志文件
InnoDB共享表空间文件ibdata1文件
mysql-bin.000001等一系列二进制日志文件(该知识点超出本章范围)
二进制日志索引文件(该知识点超出本章范围)
进程ID号PID文件
文件:server_uuid:服务器身份ID。在第一次启动MySQL时,会自动生成一个server_uuid并写入到数据库根目录下文件里,官方不建议修改。
6)将个人信息插入到student表中,并查询student表的所有记录。
create database student;
use student;
create table student(
name char(10) not null,
sex char(3) not null,
ID char(18) primary key
);
insert into student values('张三','男','410******001');
select * from student;
7)在上一步骤的查询结果中是否出现了乱码?如果出现了乱码,如何避免乱码问题的发生?如果没有出现乱码,经过哪些设置可以产生乱码?
如果出现了乱码,重新删除数据库,重新设置字符集,再创建数据库和数据库表(要求在同一个MySQL会话中依次执行下列代码):
drop database if exists student;
set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_database = gbk;
set character_set_results = gbk;
set character_set_server = gbk;
create database student;
use student;
create table student(
name char(10) not null,
sex char(3) not null,
ID char(18) primary key
);
insert into student values('张三','男','410******001');
select * from student;
如果没有出现乱码,经过哪些设置可以产生乱码:
set names latin1;
select * from student;
8)您的个人信息存放到了哪个文件中?
情形一:如果student表是MyISAM存储引擎的表,则则张三的数据存放在一个文件名为studnet、后缀名为MYD(即MYData的简写)的数据文件。
情形二:如果student表是InnoDB存储引擎的共享表空间的表,则张三的数据存放在InnoDB共享表空间文件ibdata1数据文件。
情形三:如果student表是InnoDB存储引擎的独享表空间的表,则张三的数据存放在“”的数据文件。
9)如何修改student表的存储引擎?修改student表的存储引擎后,您的个人信息存放到了哪个文件中?
答案:参考上一题。
10)删除student表以及student数据库。
use student;
drop table student;
drop database student;
16.您所熟知的系统变量有哪些?如何设置系统变量的值?
答:请参看2.5.2章节内容。请参看2.5.3章节内容。
17.如何进行数据库备份和恢复?备份期间,有哪些注意事项?
答:请参看2.6章节内容。
第三章答案
1.MySQL数据库类型有哪些?如何选择合适的数据类型?
答:请参看3.1章节内容。请参看3.1.7章节内容。
2.简单总结char(n)数据类型与varchar(n)数据类型有哪些区别。
答:请参看3.1.3章节内容。
3.datetime与timestamp数据类型有什么区别?
答:请参看3.1.4章节内容。
4.MySQL模式与MySQL复合数据类型有什么关系?
答:请参看3.1.5章节内容。
5.创建SQL脚本文件,书写SQL代码,运行,创建choose数据库的5张表。
set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_database = gbk;
set character_set_results = gbk;
set character_set_server = gbk;
create database choose;
use choose;
create table teacher(
teacher_no char(10) primary key,
teacher_name char(10) not null, #教师姓名不允许为空
teacher_contact char(20) not null #教师联系方式名不允许为空
)engine=InnoDB default charset=gbk;
create table classes(
class_no int auto_increment primary key,
class_name char(20) not null unique, #班级名不允许为空、且不允许重复
department_name char(20) not null #院系名不允许为空
)engine=InnoDB default charset=gbk;
create table course(
course_no int auto_increment primary key,
course_name char(10) not null, #课程名允许重复
up_limit int default 60, #课程上限设置默认值为60
description text not null, #课程的描述信息为文本字符串text,且不能为空
status char(6) default '未审核', #课程状态的默认值为“未审核”
teacher_no char(10) not null unique, #唯一性约束实现教师与课程之间1:1关系
constraint course_teacher_fk foreign key(teacher_no) references teacher(teacher_no)
)engine=InnoDB default charset=gbk;
create table student(
student_no char(11) primary key, #学号不允许重复
student_name char(10) not null, #学生姓名不允许为空
student_contact char(20) not null, #学生联系方式不允许为空
class_no int , #学生的班级允许为空
constraint student_class_fk foreign key (class_no) references classes(class_no)
)engine=InnoDB default charset=gbk;
create table choose(
choose_no int auto_increment primary key,
student_no char(11) not null, #学生学号不允许为空
course_no int not null, #课程号不允许为空
score tinyint unsigned,
choose_time datetime not null, #选课时间可由now()函数自动生成
constraint choose_student_fk foreign key(student_no) references student(student_no),
constraint choose_course_fk foreign key(course_no) references course(course_no)
)engine=InnoDB default charset=gbk;
6.分析choose数据库的5张表的表结构,通过这5张表,可以解决“选课系统”问题域中的哪些问题?
答:请参看第一章课后习题的答案。
7.您是如何理解索引的?索引越多越好吗?
答:请参看3.5章节内容。请参看3.5.1章节内容。
8.索引关键字的选取原则有哪些?
答:请参看3.5.2章节内容。
9.您所熟知的索引种类有哪些?什么是全文索引?
答:请参看3.5.4章节内容。
全文索引与全文检索
全文索引:当查询数据量大的字符串信息时,使用全文索引可以大幅提升字符串的检索效率。需要注意的是,全文索引只能创建在char、varchar或者text字符串类型的字段上,且全文索引不支持前缀索引。
全文检索是指以全部文本信息作为检索对象的一种信息检索技术。
摘自/wiki/全文检索
本书5.10章节中,也给出了全文检索的定义:简单地说,MySQL中的全文检索使用特定的分词技术,利用查询关键字和查询字段内容之间的相关度进行检索。通过全文索引可以提高文本匹配的速度。
10.索引与约束有什么关系?
答:请参看3.5.3章节内容。
第四章答案
1.NUL与NULL有什么区别?
答:请参看4.4章节内容。
2.truncate与delete有什么区别?
答:请参看4.3.2章节内容。
3.更新操作与字符集有什么关系?
答:如果更新语句中包含中文简体字符,应该合理地设置字符集,否则,将把乱码数据更新到数据库表中。详细请参看4.1.2章节内容。
4.数据库表中自增型字段的值一定连续吗?
答:请参看4.1.3章节内容。
5.replace语句与insert语句有什么区别?
答:请参看4.1.6章节内容。
6.执行了delete语句后,表结构被删除了吗?使用什么命令可以删除表结构?
答:delete语句删除的是表中的记录,无法删除表结构;删除表结构可以使用drop table命令。
7.请读者向“选课系统”choose数据库中的选课choose表插入表4-8所示的信息,并完成其他操作。
表4-8
choose_no
1
2
3
4
5
6
7
8
向choose表添加的测试数据
student_no
2012001
2012001
2012002
2012002
2012003
2012004
2012005
2012005
course_no
2
1
3
2
1
2
3
1
score
40
50
60
70
80
90
NULL
NULL
choose_time
服务器当前时间
服务器当前时间
服务器当前时间
服务器当前时间
服务器当前时间
服务器当前时间
服务器当前时间
服务器当前时间
(1)学生张三(student_no=2012001)已经选修了课程java程序设计(course_no=1),在选修时间截止前,他想把该课程调换成MySQL数据库(course_no=2),试用SQL语句实现该功能。
说明:题目中的张三(student_no=2012005)应该修改为张三(student_no=2012001)
第一种方法:
use choose;
update choose set course_no=2 where course_no=1 and student_no='2012001';
第二种方法:
use choose;
delete from choose where course_no=1 and student_no='2012001';
insert into choose values(null,'2012005',2,null,now());
(2)学生田七(student_no=5)已经选修了课程c语言程序设计(course_no=3),由于
某种原因,在选修时间截止前,他不想选修该课程了,试用SQL语句实现该功能。
说明:题目中的田七(student_no=5)应该修改为田七(student_no=2012005)
use choose;
delete from choose where course_no=3 and student_no='2012005';
(3)课程结束后,请录入某个学生的最终成绩,最终成绩=(原成绩*70%)+30。
说明:题目修改为:课程结束后,请修改所有学生的最终成绩,最终成绩=(原成绩*70%)+30
use choose;
update choose set score=score*0.7+30;
(4)请解释学生的成绩为NULL值的含义,NULL值等于零吗?
答:成绩为NULL值,表示学生还没有考试该课程,成绩未知。成绩为零,表示学生已经考试了该课程,成绩已知。
第五章答案
1.简述limit以及distinct的用法。
答:请参看5.1.2章节内容。
2.什么是内连接、外连接?MySQL支持哪些外连接?
答:请参看5.1.3章节内容。
3.NULL参与算术运算、比较运算以及逻辑运算时,结果是什么?
答:请参看5.2.2章节内容。
4.NULL参与排序时,MySQL对NULL如何处理?
答:请参看5.3章节内容。
5.您怎样理解select语句与字符集之间的关系?
答:请参看5.2.3章节内容。
6.MySQL常用的聚合函数有哪些?这些聚合函数对NULL值操作的结果是什么?
答:请参看5.4章节内容。
7.您怎样理解having子句与where子句之间的区别?
答:请参看5.5.2章节内容。
8.您怎样理解concat()与group_concat()函数之间的区别?
答:请参看5.5.3章节内容。
9.什么是相关子查询与非相关子查询?
答:如果子查询中仅仅使用了自己定义的数据源,不依靠主查询,能够独立运行的子查询,这种查询是非相关子查询。非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给主查询。
如果子查询中使用了主查询的数据源,这种查询是相关子查询,此时主查询的执行与相关子查询的执行相互依赖。
10.请编写SQL脚本,输入选课系统综合查询章节内的select语句。
答:请参看5.8章节内容。
11.MySQL如何使用like关键字实现模糊查询?有什么注意事项?
答:请参看5.2.5章节内容。
12.MySQL如何使用正则表达式实现模糊查询?
答:请参看5.9章节内容。
13.MySQL如何进行全文检索?全文检索有什么注意事项?
答:请参看5.10章节内容。
14.您觉得全文检索与like模糊查询、正则表达式模糊查询最大的区别是什么?
答:
全文检索:是指全文检索解析器(分词技术)通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户进行against查询时,根据事先建立的全文索引进行查找,并将查找的结果反馈给用户。
以全文检索“我们is中国人而自豪”为例。全文检索解析器可将该中文信息切分成:我们、is、中国、国人、人而、而自、自豪(这里以两个字为单位进行分割为例,实际情况更为复杂),并建立全文索引。
当用户使用contains语句查询“自豪”(为了区分,搜索关键词是蓝色字)关键词时,此时“自豪”(蓝色字)去匹配全文索引中的“自豪”(为了区分,索引关键词是红色字),并将匹配到的结果“我们is中国人而自豪”返回!
而使用like或者正则表达式查询“自豪”关键词时,并没有将“我们is中国人而自豪”这句话分割,还是将整句话当作整体来看,然后通过字符串比较的方式,判断“自豪”字符串是不是“我们is中国人而自豪”字符串的子字符串。如果是,说明成功匹配,然后将匹配到的结果“我们is中国人而自豪”返回!
因此:全文检索的核心是利用分词技术建立索引,继而利用索引加快字符串的匹配速度。
like或者正则表达式的核心是搜索关键词“自豪”字符串是不是“我们is中国人而自豪”字符串的子字符串。
15.最新版本的MySQL中,InnoDB存储引擎的表支持全文检索吗?
答:支持
16.MySQL不支持完全连接,您能不能通过其他技术手段实现完全连接的功能?
答:将左连接和右连接通过union模拟实现完全连接。
17.合并结果集时,union与union all有什么区别?
答:请参看5.6章节内容。
18.给定一个教师的工号(例如'001'),统计该教师已经申报了哪些课程。
答:
select
course_no,course_name,up_limit,description,r_no,teacher_name,teacher_contact,available,status
from course join teacher on r_no=r_no
where r_no = '001';
第六章答案
1.使用select语句输出各种数据类型的常量时,数据类型都是如何转换的?
答:各种数据类型的常量会被自动转换为“字符串”再进行显示。
2.系统会话变量与用户会话变量有什么区别与联系?
答:请参看6.1.2章节内容。
3.用户会话变量与局部变量有什么区别与联系?
答:请参看6.1.2章节内容。
4.为用户会话变量或者局部变量赋值时,有哪些注意事项?
答:请参看6.1.2章节内容。
5.编写MySQL存储程序时,为什么需要重置命令结束标记?
答:请参看6.1.5章节内容。
6.创建本书涉及到的所有自定义函数,并进行调用。
答:请参看本章内容。
7.总结哪些日期、时间函数的执行结果与时区的设置无关。
答:请参看6.3.6章节内容。
8.创建自定义函数有哪些注意事项?
(1) 自定义函数的函数体使用select语句时,该select语句不能产生结果集,否则将产生编译错误。
(2) 自定义函数是数据库的对象,因此,创建自定义函数时,需要指定该自定义函数隶属于哪个数据库。
(3) 同一个数据库内,自定义函数名不能与已有的函数名(包括系统函数名)重名。建议在自定义函数名中统一添加前缀“fn_”或者后缀“_fn”。
(4) 函数的参数无需使用declare命令定义,但它仍然是局部变量,且必须提供参数的数据类型。自定义函数如果没有参数,则使用空参数“()”即可。
(5) 函数创建成功后,记得将命令结束标记恢复“原状”。
(6) 函数必须指定返回值数据类型,且须与return语句中的返回值的数据类型相近(长度可以不同)。
9.请分析下面的getdate()函数完成的功能,创建该函数,并调用该函数。
函数的功能:对日期时间进行格式化。
10.通过本章知识的讲解,您是如何理解中文全文检索的?您觉得实现中文全文检索的核心技术是什么?
答:请参考第五章课后习题答案。
第七章答案
1.视图与基表有什么区别和联系?视图与select语句有什么关系?
答:视图与基表有什么区别和联系:
数据库表称为基本表或者基表,视图称为虚表。基表的数据发生变化时,虚表的数据也会随之变化。
触发器基于表(严格地说是基于表的记录),这里的表是基表,不是临时表(temporary类型的表),也不是视图。
通过视图虽然可以更新基表的数据,但本书并不建议这样做。原因在于,通过视图更新基表数据,并不会触发触发器的运行。
视图与select语句有什么关系:
视图中保存的就是一条select语句。对于经常使用的结构复杂的select语句,建议将其封装为视图。
2.什么是检查视图?什么是local检查视图与cascaded检查视图?
答:创建视图时,没有使用with check option子句时,即with_check_option的值为0,表示视图为普通视图;使用with check option子句或者with cascaded check option子句时,表示该视图为cascaded检查视图;使用with local check option子句,表示该视图为local检查视图。
检查视图:通过检查视图更新基表数据时,检查视图对更新语句进行了先行检查,只有满足检查条件的更新语句才能成功执行。如果更新语句不满足检查视图定义的检查条件,则检查视图抛出异常,更新失败。
local检查视图与cascaded检查视图的区别联系,请参看7.1.7章节内容
3.请用触发器实现检查约束:一个学生某门课程的成绩score要求在0到100之间取值。
答:本题需要为choose表创建了一个before、insert触发器和一个before、update触发器。由于本章7.2.3章节中,已经为choose表创建了一个before、insert触发器和一个before、update触发器。而同一个表不能创建两个相同触发时间、触发事件的触发程序。
因此,为了实现本题功能,需要首先删除7.2.3章节中的两个触发器。
drop trigger choose_insert_before_trigger;
drop trigger choose_delete_before_trigger;
然后再为choose表创建一个after、insert触发器和一个after、update触发器,自动维护课程available的字段值。
delimiter $$
create trigger choose_insert_after_trigger after insert on choose for each row
begin
update course set available=available-1 where course_no=_no;
end;
$$
delimiter ;
delimiter $$
create trigger choose_delete_after_trigger after delete on choose for each row
begin
update course set available=available+1 where course_no=_no;
end;
$$
delimiter ;
最后,再为choose表创建一个before、insert触发器和一个before、update触发器实现检查约束:一个学生某门课程的成绩score要求在0到100之间取值。
delimiter $$
create trigger choose_insert_before_trigger before insert on choose for each row
begin
if(>=0 && <=100) then
set = ;
else insert into mytable values(0);
end if;
end;
$$
delimiter ;
delimiter $$
create trigger choose_update_before_trigger before update on choose for each row
begin
if(>=0 && <=100) then
set = ;
else insert into mytable values(0);
end if;
end;
$$
delimiter ;
4.MySQL触发器中的触发事件有几种?触发器的触发时间有几种?
答:请参看7.2.1章节内容。
5.创建触发器时,有哪些注意事项?
答:本题修改为:使用触发器时,有哪些注意事项?
请参看7.2.7章节内容。
6.使用触发器可以实现哪些数据的自动维护?
答:使用触发器可以实现检查约束
使用触发器可以自动维护冗余数据,例如课程available的字段值。
使用触发器可以模拟外键级联选项。
7.您是如何理解临时表的?临时表与基表有什么关系?
答:请参看7.3.1章节内容。请参看7.3.4章节内容
8.您是如何理解视图、子查询、临时表、派生表之间的关系的?
答:请参看7.5章节内容。
第八章答案
1.编写“选课系统”的存储过程,并对其进行调用、测试。
答:请参看本章代码。
2.查看存储过程定义的方法有哪些?
答:请参看8.1.4章节内容。
3.请罗列存储过程与函数的区别与联系。
答:请参看8.1.6章节内容。
4.数据库开发人员定义错误处理机制时,需要提供错误处理类型、错误触发条件以及错误处理程序等信息,错误处理类型有哪些?什么是错误触发条件以及错误处理程序?
答:错误处理类型的取值要么是continue,要么是exit。当错误处理类型是continue时,表示错误发生后,MySQL立即执行自定义错误处理程序,然后忽略该错误继续执行其他MySQL语句。当错误处理类型是exit时,表示错误发生后,MySQL立即执行自定义错误处理程序,然后立刻停止其他MySQL语句的执行。
错误触发条件以及错误处理程序,请参看8.2.1章节内容。
5.游标的使用步骤是什么?每一个步骤完成什么任务?
答:请参看8.3.1章节内容。
6.举例说明,如何遍历游标中的“结果集”。
答:请参看8.3.2章节内容。
7.使用预处理SQL语句有哪些注意事项?预处理SQL语句与静态SQL语句有什么区别和联系?
答:注意事项请参看8.4.1章节内容;预处理SQL语句与静态SQL语句有什么区别和联系请参看8.4.4章节内容。
第九章答案
1.请简单描述事务的必要性。
答:请参看9.1.1章节内容。
2.关闭MySQL自动提交的方法有哪些?您推荐数据库开发人员使用哪一种方法?
答:请参看9.1.2章节内容。推荐数据库开发人员尽可能地使用MySQL命令“start transaction;”隐式地关闭自动提交,使用MySQL命令“commit;”显示地提交更新语句。
3.关闭MySQL自动提交后,提交更新语句的方法有哪些?您推荐数据库开发人员使用哪一种方法?
答:请参看9.1.4章节内容。推荐数据库开发人员尽可能地使用MySQL命令“start transaction;”隐式地关闭自动提交,使用MySQL命令“commit;”显示地提交更新语句。
4.请简单描述典型的事务处理使用方法。
答:请参看9.1.5章节内容。
5.请简单描述典型的事务保存点使用方法。您是如何理解保存点是“临时状态”这句话的?
答:请参看9.1.6章节内容。
6.请简单描述锁机制的必要性。
答:请参看9.2.1章节内容。
7.为MyISAM表施加表级锁的语法格式是什么?
答:请参看9.2.3章节内容。
8.为MyISAM表施加表级锁时,read local与read选项有什么区别?
答:请参看9.2.3章节内容。
9.您是如何理解锁的粒度、隐式锁与显式锁、锁的类型、锁的钥匙以及锁的生命周期等概念的?
答:请参看9.2.2章节内容。
10.您如何理解锁的粒度、锁的生命周期与数据库的并发性能之间的关系?
答:锁的粒度越小,锁的生命周期越短,数据库的并发性能就越高,数据库越适合做并发更新操作。反之亦然。
11.您如何理解锁的粒度、锁的生命周期与服务器资源之间的关系?
答:锁粒度越小,完成某个功能时所需要的加锁、解锁的次数就会越多,反而会消耗较多的服务器资源,甚至会出现资源的恶性竞争,甚至发生死锁问题。锁是数据库管理系统重要的数据库资源,需要耗费一定的服务器内存,锁的生命周期越长,该锁占用服务器内存的时间间隔就越长;锁的生命周期越短,该锁占用服务器内存的时间间隔就越短。因此为了节省服务器资源,数据库开发人员必须尽可能的缩短锁的生命周期,尽可能早地释放锁资源。
12.“选课系统”应该使用哪种粒度的锁机制?为什么?
答:对于“选课系统”而言,系统需要为上百名学生,甚至几百名学生同时提供选课、调课、退课服务。为了提高并发性能,“选课系统”将选用行级锁,这也是“选课系统”的各个数据库表使用InnoDB存储引擎的原因。
13.为InnoDB表施加行级锁的语法格式是什么?
答:请参看9.2.4章节内容。
14.请列举现实生活中的“资源竞争”问题,如何使用锁机制解决此类“资源竞争”问题?
答:现实生活中,选课系统就存在“资源竞争”问题,解决方案请参看9.2.5章节内容。
15.完成调课功能的replace_course_proc()存储过程以及完成选课功能choose_proc()存储过程使用了行级锁解决了“资源竞争”问题,能不能将存储过程中下面的select语句写在“start transaction;”语句之前,以便缩短行级锁的生命周期?
说明:题目中的“select state into status from course where course_no=c_no”应该修改为
“select available into s3 from course where course_no=c_no for update”
答:select available into s3 from course where course_no=c_no for update
必须放在“start transaction;”语句之后,目的是:延长行级排他锁的生命周期,所以需要将该select语句写在了start transaction语句后,封装到事务中。
16.InnoDB什么时候使用间隙锁,什么时候使用记录锁?间隙锁与记录锁之间的区别是什么?
答:
当事务的隔离级别设置为repeatable read,此时为InnoDB表施加行级锁,默认情况下使用间隙锁。当事务的隔离级别设置为read uncommitted或者read committed,此时为InnoDB表施加行级锁,默认情况下使用记录锁(record lock)。
间隙锁(next-key锁):当检索条件为某个区间(例如account_no between 1 and 100)范围时,对该区间范围施加共享锁或排他锁后,满足该区间范围的记录(例如account_no=1或者account_no=2的记录)存在共享锁或排他锁;满足该区间范围,但表中不存在的记录(例如account_no=50或者account_no=100的记录)也会存在共享锁或排他锁,即行级锁会锁定相邻的键(next-key locking)。
记录锁:与间隙锁不同,记录锁仅仅为满足该查询范围的记录施加共享锁或排他锁。
17.锁等待与死锁之间是什么关系?
答:请参看9.2.9章节内容。
18.请解释事务的ACID特性。
答:请参看9.3.1章节内容。
19.MySQL支持哪些事务隔离级别?默认的事务隔离级别是什么?
答:请参看9.3.2章节内容。
20.每一种事务隔离级别可能引发什么问题?
答:脏读、不可重复读、幻读、死锁等问题。
21.脏读现象、不可重复读现象以及幻读现象之间有什么区别?
答:请参看9.3.2章节内容。
22.您如何理解事务、锁机制、事务的隔离级别之间的关系?
答:请参看9.4章节内容。
select state into status from course where course_no=c_no;
第十章答案
1.选用PHP脚本语言开发网上选课系统的原因是什么?
答:请参看10.1.1章节内容。
2.请简单描述PHP脚本程序的工作流程。
答:请参看10.1.3章节内容。
3.什么是软件开发生命周期?对于一个真实的软件项目而言,您觉得编码阶段是软件开发生命周期中最难实现的环节吗?
答:请参看10.2章节内容。对于一个真实的软件项目而言,编码阶段仅仅是软件开发生命周期中的其中一个环节,并不是最难实现的环节,俗话说,万事开头难,一般而言,最难实现的环节一般是系统规划和系统分析阶段。
4.请简单描述网上选课系统的目标、可行性分析、项目进度、人员分工。
答:请参看10.3章节内容。
5.请简单描述网上选课系统的功能需求分析与非功能需求分析。
答:请参看10.4章节内容。
6.请简单描述网上选课系统的系统设计。
答:请参看10.5章节内容。
7.按照本章要求、步骤实现网上选课系统。
答:请参看本章代码部分内容。
8.根据本章的知识,参看视图与触发器章节的内容,为网上选课系统添加两个新的功能模块:重置所有学生的密码,重置所有教师的密码。
答:代码略。
9.根据本章的知识,为网上选课系统添加新的功能模块:任课教师编辑未经审核的课程信息。
答:代码略。
10.什么是MVC模式,使用MVC模式开发程序有哪些优点?
答:请参看10.7章节内容。
11.编写功能测试用例,测试网上选课系统其他功能模块。
答:请参看10.8章节内容。
版权声明:本文标题:MySQL数据库基础与实例教程练习题参考答案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1702993000h438785.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论