Mysql培训经典教程思考题参考答案.docx
《Mysql培训经典教程思考题参考答案.docx》由会员分享,可在线阅读,更多相关《Mysql培训经典教程思考题参考答案.docx(12页珍藏版)》请在冰豆网上搜索。
![Mysql培训经典教程思考题参考答案.docx](https://file1.bdocx.com/fileroot1/2023-1/4/c073a720-6bc6-4922-a65e-6d519848f94b/c073a720-6bc6-4922-a65e-6d519848f94b1.gif)
Mysql培训经典教程思考题参考答案
思考题参考答案
第二章
2、在Win32平台上运行分发包中的setup.exe程序,安装MySQL系统后,就自动初始化授权表。
对于Unix平台,运行脚本mysql_install_db,之前应该首先切换到启动mysqld的用户,例如mysql:
#sumysql
$mysql_install_db
安装授权表之后修改root用户的密码,由于初始化后存在两个从localhost和任意主机连接的root用户,所以推荐使用下面的办法:
$mysql-urootmysql(由于现在不存在密码,因此不比提供-p选项)
mysql>UPDATEuserSETpassword=password(“mypass”)WHEREUser=root;
3、使用如下命令更改密码:
shell>mysqladmin-uroot-ppassword‘newpass’
EnterPassword:
*******
出现EnterPassword的提示后输入原来的密码oldpass即可。
读者可以尝试其它所有本章介绍的方法。
4、首先以root用户的身份连接到服务器:
shell>mysql-uroot-p
Enterpassword:
*******
出现Enterpassword提后输入root用户的密码,然后即进入mysql客户机的交互模式,可以看到下面的提示:
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis4toserverversion:
3.23.25-beta-log
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer
mysql>
然后发布查询,直接键入题目中的语句:
mysql>SELECTUser,HostFROMmysql.user;
应该有类似于下面的结果:
+-------+-----------+
|User|Host|
+-------+-----------+
|root|%|
|admin|localhost|
|root|localhost|
+-------+-----------+
5、在全局选项文件(Unix上位于/etc/f,Windows上位于c:
\f)中加入下面的几行:
[mysql]
user=root
password
然后在运行mysql客户程序,就不必提供参数:
shell>mysql
EnterPassword:
********
你可以查看当前的连接,以确定是否是如此:
mysql>SHOWPROCESSLIST;
+----+------+-----------+------+---------+------+-------+------------------+
|Id|User|Host|db|Command|Time|State|Info|
+----+------+-----------+------+---------+------+-------+------------------+
|4|root|localhost|NULL|Query|0|NULL|SHOWPROCESSLIST|
+----+------+-----------+------+---------+------+-------+------------------+
第三章
2、连接服务器的命令为:
shell>mysql-h-uroot-ptest
EnterPassword:
******
如果使用选项文件,将下面几行加入全局选项文件中:
[mysql]
host=
user=root
password
然后可以直接运行mysql,不比提供连接参数:
shell>mysql
EnterPassword:
*******
3、创建表的语句为:
CREATETABLEpet
(
nameCHAR(30),
ownerCHAR(30),
speciesCHAR(10),
sexENUM(“M”,”F”)NOTNULL,
birthDATE,
deathDATE
)
4、如下录入文件pet.txt,段与段用制表符分隔
FluffyHaroldcatF1993-02-04\N
ClawsGwencatM1994-03-17\N
BuffyHarolddogF1989-05-13\N
ChirpyGwenbirdF1998-09-11\N
FangBennydogM1990-08-27\N
BowserDianedogM1990-08-311995-07-29
WhistlerGwenbird\N1997-12-09\N
SlimBennysnakeM1996-04-29\N
PuffballDianehamsterF1999-03-30\N
然后连接服务器,发布查询:
mysql>LOADDATAINFILE“pet.txt”INTOTABLEpet;
由于缺省时,LOADDATA语句以特殊字符’\n’作为记录的结束,这和Unix系统的文本编辑器以’\n’为换行符是一致的,但是在Windows系统中,换行符是’\r\n’,因此,如果是在Windows系统编辑的文件,那么上面的语句不能成功的录入数据,要做如下的修改:
mysql>LOADDATAINFILE“pet.txt”INTOTABLEpet
->LINESTERMINATEDBY‘\r\n’;
如果使用mysqlimport程序,相应的命令行为:
shell>mysqlimporttest‘pet.tt’
或者使用:
shell>mysqlimporttest‘pet.tt’--lines-terminated-by=’\r\n’
第四章
1、创建表:
mysql>CREATETABLEex4
->(
->dataFLOAT,
->birthDATETIME
->);
录入数据:
mysql>INSERTex4VALUES(RAND(),NOW());
多录入几个数据,现有的数据为:
mysql>select*fromex4;
+----------+---------------------+
|data|birth|
+----------+---------------------+
|0.830329|2001-01-0121:
21:
10|
|0.531143|2001-01-0121:
21:
12|
|0.164729|2001-01-0121:
21:
13|
|0.230213|2001-01-0121:
21:
14|
+----------+---------------------+
data列的平均值:
mysql>SELECTAVG(data)ASaverageFROMex4;
+------------------+
|average|
+------------------+
|0.43910377845168|
+------------------+
data列的总和:
mysql>SELECTSUM(data)AS"sumofdata"FROMex4;
+-----------------+
|sumofdata|
+-----------------+
|1.7564151138067|
+-----------------+
mysql>SELECTMAX(data)AS"maxofdata",MIN(data)AS"minofdata"
->FROMex4;
+------------------+------------------+
|maxofdata|minofdata|
+------------------+------------------+
|0.83032947778702|0.16472874581814|
+------------------+------------------+
data列降序排列:
mysql>SELECT*FROMex4ORDERBYdataDESC;
+----------+---------------------+
|data|birth|
+----------+---------------------+
|0.830329|2001-02-1821:
21:
10|
|0.531143|2001-02-1821:
21:
12|
|0.230213|2001-02-1821:
21:
14|
|0.164729|2001-02-1821:
21:
13|
+----------+---------------------+
2、使用标准SQL模式匹配:
mysql>select*fromex4wherebirthlike"2001-01-01%";
+----------+---------------------+
|data|birth|
+----------+---------------------+
|0.830329|2001-01-0121:
21:
10|
|0.531143|2001-01-0121:
21:
12|
|0.164729|2001-01-0121:
21:
13|
|0.230213|2001-01-0121:
21:
14|
+----------+---------------------+
使用扩张正则表达式模式匹配:
mysql>select*fromex4wherebirthREGEXP"^2001-01-01";
+----------+---------------------+
|data|birth|
+----------+---------------------+
|0.830329|2001-01-0121:
21:
10|
|0.531143|2001-01-0121:
21:
12|
|0.164729|2001-01-0121:
21:
13|
|0.230213|2001-01-0121:
21:
14|
+----------+---------------------+
3、为student表创建索引:
mysql>ALTERTABLEstudent
->ADDPRIMARYKEY(id),
->ADDINDEXmark(english,chinese,history);
这样查看创建的索引:
mysql>SHOWINDEXFROMstudent;
+---------+------------+----------+--------------+-------------+---
|Table|Non_unique|Key_name|Seq_in_index|Column_name|...
+---------+------------+----------+--------------+-------------+---
|student|0|PRIMARY|1|id|...
|student|1|mark|1|english|...
|student|1|mark|2|chinese|...
|student|1|mark|3|history|...
+---------+------------+----------+--------------+-------------+---
为pet表创建索引,这次使用另一种方法:
mysql>CREATEINDEXnameONpet(name(10),owner(10));
查看创建的索引的情况:
mysql>SHOWINDEXFROMpet;
+-------+------------+----------+--------------+-------------+-
|Table|Non_unique|Key_name|Seq_in_index|Column_name|...
+-------+------------+----------+--------------+-------------+-
|pet|1|name|1|name|...
|pet|1|name|2|owner|...
+-------+------------+----------+--------------+-------------+-
4、删除pet表的索引:
mysql>DROPINDEXnameONpet;
或者可以:
mysql>ALTERTABLEpetDROPINDEXname;
然后再用SHOW语句产看可知
mysql>showindexfrompet;
Emptyset(0.01sec)
第五章
1、shell>mysqldump--all-database--opt>data.sql
2、shell>mysqldump--tab=”./bak”test
3、创建数据库test1
mysql>CREATEDATABASEtest1;
恢复表的结构
shell>mysqltest1<./bak/pet.sql
恢复数据:
mysql>mysqlimporttest1./bak/pet.txt
在Win32平台上,你必须一个个的恢复文件,在Unix平台上,可以通过shell的文件匹配的功能,简化命令行:
$mysqltest1<./bak/*.sql
$mysqlimporttest1./bak/*bak
4、相应更新日志的内容是:
createdatabasetest1;
usetest1;
CREATETABLEpet(
namechar(32),
ownerchar(32),
specieschar(32),
sexenum('F','M'),
birthdate,
deathdate
);
usetest1;
LOADDATAINFILE'D:
/Server/mysql/bin/./bak/pet.txt'INTOTABLEpet;
常规日志的内容由于过长,不再列出。
常规日志列出了所有客户机发布的查询,不仅包括mysql,还包括mysqladmin,mysqldump,mysqlimport等,你可以观察这些客户机完成任务所需要执行的查询。
5、为了说明下面的操作,可以先进行几条SQL操作:
mysql>INSERTpetSETname="tes";
mysql>DELETEFROMpetWHEREname="tes";
相应的在更新日志中增加的记录为:
usetest;
INSERTpetSETname="tes";
DELETEFROMpetWHEREname="tes";
然后我们删除test1数据库:
mysql>dropdatabasetest10;
相应的更新日志中的内容为:
dropdatabasetest10;
为了恢复数据库,假设更新日志的文件名是wxy.058,假定该日志包括第四题中更新日志的内容。
首先删除更新日志中删除数据库的记录,然后用下面的语句恢复数据库表:
shell>mysql--one-databsetest1<../data/wxy.058
你可以看到数据库表得到了恢复,你也可以查看常规日志,以确定在这个过程中,test1数据库之外的SQL语句被忽略了。
第六章
1、首先对表pet进行独锁定:
mysql>LOCKTABLEpetREAD;
清空缓存:
mysql>FLUSHTABLES;
检查表:
shell>myisamchk/path/to/pet(在我的主机上,为../data/test/pet)
释放表锁
mysql>UNLOCKTABLES;
2、创建数据库的方法是:
mysql>CREATEDATABASEtest2;
mysql>CREATETABLEpetSELECT*FROMtest.pet;
恢复数据库的方法是:
由于表的描述文件被删除,因此我们可以创建一个具有相同结构的表:
mysql>CREATETABLEpet1(…);
为了节省时间,由于本题只是一个演示,所以你还可以从test.pet中恢复表的结构:
mysql>CREATETABLEpet1SELECT*FROMtest.petWHERE0;
然后,进入数据库目录,把pet1.frm文件复制为pet.frm文件,完成操作即可。
3、备份过程在正文中有详细叙述。
此处略。
第七章
1、原因是:
先考虑一下mysql_install_db如何建立初始权限表和服务器如何使用user表记录匹配客户连接。
在你用mysql_install_db初始化你的数据库时,它创建类似这样的user表:
HostUser
localhost
localhost
root
root
头两个记录允许root指定localhost或主机名连接本地服务器,后两个允许匿名用户从本地连接。
当增加fox用户后,
HostUser
localhost
localhost
%root
root
fox
在服务器启动时,它读取记录并排序它们(首先按主机,然后按主机上的用户),越具体越排在前面:
HostUser
localhost
localhost
%root
root
fox
有localhost的两个记录排在一起,而对root的记录排在第一,因为它比空值更具体。
的记录也类似。
所有这些均是没有任何通配符的字面上的Host值,所以它们排在对fox记录的前面,特别是匿名用户排在fox之前。
结果是在fox试图从localhost连接时,Host列中的一个空用户名的记录在包含%的记录前匹配。
该记录的口令是空的,因为缺省的匿名用户没有口令。
因为在fox连接时指定了一个口令,由一个错配且连接失败。
这里要记住的是,虽然用通配符指定用户可以从其连接的主机是很方便。
但你从本地主机连接时会有问题,只要你在table表中保留匿名用户记录。
一般地,建议你删除匿名用户记录:
mysql>DELETEFROMuserWHEREUser="";
更进一步,同时删除其他授权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv。
2、应该给用户分配全局的RELOAD、SHUTDOWN权限,使用GRANT语句:
mysql>GRANTRELOAD,SHUTDOWNON*.*TOadmin@localhost
->INDENTIFIEDBY“mypass”;
使用直接修改授权表的方法:
mysql>INSERTmysql.user(User,Host,Password,Reload_priv,Shutdown_priv)
->VALUES(“amin”,”localhost”,PASSWORD(“mypass”),Y,Y);
3、由于该用户只在user表中有权限记录,所以只要删除该记录即可:
mysql>DELETEFROMmysql.userWHEREUser=”admin”;
4、创建数据库
mysql>CREATEDATABASEmark;
创建用户并授权:
mysql>GRANTSELECT,DROP,CREATE,INSERT,
->UPDATE,DELETE,INDEX,ALTER
->ONmark.*
->TOteacher
->IDENTIFIEDBY"mypass";
也可以不使用GRANT语句,直接修改授权表:
mysql>INSERTmysql.user(User,Password,Host)
->VALUES(“teacher”,PASSWORD(“mypass”),”%”);
mysql>INSERTmysql.dbVALUES
->("%","mark","teacher","Y","Y","Y","Y","Y","Y","N","N","Y","Y");
第八章
1、由于没有非常好的例子,这里只是做一个简单的分析:
例如,对于表pet:
mysql>SELECTspeciesFROMpetPROCEDUREANALYSE();
输出有10列,对于列Optimal_fieldtype是建议的优化列类型,都是ENUM类型,在这里,species的数值有限,故可以改为输出所建议的类型:
ENUM('bird','cat','dog','hamster','snake')NOTNULL
2、可以用两种方法
使用SQL语句:
mysql>LOCKTABLEpetWRITE;
mysql>FLUSHTABLES;
mysql>OPTIMIZETABLEtbl_name;
mysql>UNLOCKTABLES;
使用myisamchk维护程序:
mysql>LOCKTABLEpetWRITE;
mysql>FLUSHTABLES;
shell>myisamchk--recover../data/test/pet
mysql>FLUSHTABLES;
mysql>UNLOCKTABLES;