答:请参看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) 数据库文件(如db.opt)
(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等一系列二进制日志文件(该知识点超出本章范围) mysql-bin.index二进制日志索引文件(该知识点超出本章范围) mysqld.exe进程ID号PID文件
auto.cnf文件:server_uuid:服务器身份ID。在第一次启动MySQL时,会自动生成一个server_uuid并写入到数据库根目录下auto.cnf文件里,官方不建议修改。
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存储引擎的独享表空间的表,则张三的数据存放在“student.ibd”的数据文件。
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脚本文件choose.sql,书写SQL代码,运行choose.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字符串类型的字段上,且全文索引不支持前缀索引。
全文检索是指以全部文本信息作为检索对象的一种信息检索技术。 摘自http://wiki.mbalib.com/wiki/全文检索
本书5.10章节中,也给出了全文检索的定义:简单地说,MySQL中的全文检索使用特定的分词技术,利用查询关键字和查询字段内容之间的相关度进行检索。通过全文索引可以提高文本匹配的速度。
10.索引与约束有什么关系? 答:请参看3.5.3章节内容。