MySQL数据库原理及应用(慕课版)-习题答案 郑晓霞_第1页
MySQL数据库原理及应用(慕课版)-习题答案 郑晓霞_第2页
MySQL数据库原理及应用(慕课版)-习题答案 郑晓霞_第3页
MySQL数据库原理及应用(慕课版)-习题答案 郑晓霞_第4页
MySQL数据库原理及应用(慕课版)-习题答案 郑晓霞_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章数据库基础选择题C1-2.C1-3.B1-4.B1-5.D1-6.A1-7.A1-8.C1-9.B2.简答题2-1答:人工管理阶段是指计算机诞生的初期(即20世纪50年代后期之前),这个时期的计算机主要用于科学计算。从硬件看,没有磁盘等直接存取的存储设备;从软件看,没有操作系统和管理数据的软件,数据处理方式是批处理。这个时期数据管理的特点是:1.数据不保存2.没有对数据进行管理的软件系统3.没有文件的概念4.一组数据对应于一个程序,数据是面向应用的文件系统阶段是指计算机不仅用于科学计算,而且还大量用于管理数据的阶段(从50年代后期到60年代中期)。在硬件方面,外存储器有了磁盘、磁鼓等直接存取的存储设备。在软件方面,操作系统中已经有了专门用于管理数据的软件,称为文件系统。这个时期数据管理的特点:1.数据需要长期保存在外存上供反复使用2.程序之间有了一定的独立性3.文件的形式已经多样化4.数据的存取基本上以记录为单位数据库系统阶段是从60年代后期开始的。在这一阶段中,数据库中的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用的。这个时期数据管理的特点是:1.采用复杂的结构化的数据模型2.较高的数据独立性3.最低的冗余度4.数据控制功能2-2答:三级模式包括外模式、概念模式、内模式,三级模式能有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。二级映射指的是对象关系映射(ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。第2章MySQL数据类型选择题1-1.A1-2.A1-3.D1-4.A1-5.C2.填空题2-1.浮点数2-2.CHAR,2552-3.NULL,NOTNULL2-4.ENUM('待支付','已支付','已取消')2-5.DECIMAL(6,2)第3章MySQL运算符1.A2.A3.D4.A5.AC第4章数据库操作 1.选择题1-1.B1-2.D1-3.C1-4.A1-5.C1-6.C1-7.D 2.简答题 2-1答: 在MySQL的安装目录下能找到一个名为my.ini的配置文件。该文件中的mysqld部分存在“default-storage-engine=INNODB”语句。将该语句的“INNODB”改为需要的存储引擎。该配置文件只有重启服务后才会生效。执行SHOWVARIABLESLIKE‘storage_engine’查看默认存储引擎是否修改成功。 2-2答:MyISAM与InnoDB存储引擎的5大区别:(1)InnoDB支持事务,而MyISAM不支持事务(2)InnoDB支持行级锁,而MyISAM支持表级锁(3)InnoDB支持MVCC,而MyISAM不支持(4)InnoDB支持外键,而MyISAM不支持(5)InnoDB不支持全文索引,而MyISAM支持 3.上机操作 3-1答: CREATEDATABASEemployee;SHOWDATABASES;DROPDATABASEIFEXITSemployee;SHOWDATABASES; 3-2答: (1)showengines;//查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎。showvariableslike'%storage_engine';//查看mysql默认的存储引擎SHOWVARIABLESLIKE'default_storage_engine%';第5章数据表操作 1.选择题1-1.D1-2.B1-3.C1-4.A1-5.C1-6.B1-7.D1-8.B1-9.C1-10.C 2.上机操作 2-1答:(1)CREATETABLEanimal(idintprimarykeyauto_increment,nameVARCHAR(20),kindsVARCHAR(8)notnull,legsint,behaviorVARCHAR(50));(2)altertableanimalmodifynamevarchar(20)notnull;(3)altertableanimalmodifybehaviorVARCHAR(50)afterkinds;(4)altertableanimaladdfurvarchar(10);(5)altertableanimaldroplegs;(6)altertableanimalrenameanimalInfo; 2-2答:CREATETABLE部门(部门号NUMBER(2),部门名VARCHAR(10),经理名VARCHAR(10),电话Char(12)CONSTRAINTPK_SCRIMARYKEY(部门号));CREATETABLE职工(职工号NUMBER(4),姓名VARCHAR(10),年龄NUMBER(2),CONSTRAINTC1CHECK(年龄<=60),职务VARCHAR(9),工资NUMBER(7,2),部门号NUMBER(2),CONSTRAINTFK_DEPTNOFOREIGNKEY(部门号)REFFERENCES部门(部门号));第6章数据操作选择题B1-2.C1-3.B1-4.B1-5.A1-6.D1-7.B1-8.A1-9.D1-10.B2.简答题:2-1答:若数据库中有若干个表,表与表之间相互关联。表关联则会生成外键强制约束的问题,删除数据时,MYSQL会检查表间的关联关系,如果该数据所在表与其他表相关联,就会导致无法删除,出现上述问题。解决方案:A.修改FOREIGN_KEY_CHECKS,取消外键检验:SETFOREIGN_KEY_CHECKS=0;B.进行表内数据的删除C.再恢复外键约束:SETFOREIGN_KEY_CHECKS=1;2-2答:A.插入一条完整的数据记录行,其命令如下:B.插入多条数据记录行,其命令如下:C.插入数据记录行的一部分,其命令如下:D.插入检索查询得到的数据记录,其命令如下:2-3答:其命令如下:3.上机操作:3-1答:A.创建供应数据库,在供应数据库中使用SQL语句创建下列表。其命令如下:向供应商表中插入一条完整的数据行,(1)其值为:('S001','鸿运彩钢厂','黑龙江省哈尔滨市',)。其命令如下:(2)向供应商表中一次性插入多条完整的数据行,其值为:('S002','好运来木材厂','黑龙江省牡丹江市',),('S003','程实水泥厂','吉林省白城市',),('S004','洪城砖厂','吉林省吉林市',),('S005','天旺零件厂','黑龙江省哈尔滨市',)。其命令如下:(3)向工程表中一次性插入多条完整的数据行,其值为:('p001','学校寝室楼改造','黑龙江省哈尔滨市'),('p002','化工路改造','黑龙江省哈尔滨市'),('p003','云上小区','吉林省长春市')。其命令如下:(4)向零件表中一次性插入多条完整的数据行,其值为:('g001','彩钢房','蓝色','二层蓝色彩钢房'),('g002','彩钢房','白色','三层白色彩钢房'),('g003','土石混合料','红色','水泥石子沙子混合比为1:2:3'),('g004','标准砖','红色','标准砖的尺寸为240mm×115mm×53mm'),('g005','上下铺','棕色','上下铺总共2.1米'),('g006','床铺','棕色','上铺下桌'),('g007','螺丝','银色','M14*40')。其命令如下:(5)向供应表中一次性插入多条完整的数据行,其值为:('s001','p001','g001',5),('s001','p001','g002',4),('s002','p001','g005',100),('s001','p001','g006',700),('s001','p002','g001',2),('s001','p002','g002',1),('s003','p002','g003',500),('s001','p003','g001',10),('s001','p003','g002',3),('s004','p003','g004',10000),('s005','p003','g007',5000);3-2答:执行SQL语句,将供应表中供应商编号为s001的数量全部更新为6。其命令如下:3-3答:执行SQL语句,删除零件表中零件编号为g007的数据行。其命令如下:第7章数据查询1.选择题1-1.D1-2.D1-3.C1-4.D1-5.C1-6.D1-7.D1-8.C1-9.C1-10.C2.简答题2-1答:A.简单数据记录查询,其语法形式为select字段from表明B.条件数据记录查询,其语法形式为where+子句C.排序数据记录查询,其语法形式为orderby字段D.统计函数和分组数据记录,其语法形式为groupby字段having条件E.限制数据记录查询数量,其语法形式为limit结果显示行数2-2答:A.内连接innerJoin:查询结果只显示满足条件的数据行B.左外连接leftouterjoin:查询结果显示满足条件的数据行以及左侧表中的全部行数据。C.右外连接rightouterjoin:查询结果显示满足条件的数据行以及右侧表中的全部行数据D.交叉连接:查询结果显示多个表中所有行数据的组合,表之间进行笛卡尔积操作。2-3答:A.存放于WHERE子句中的子查询:存放于WHERE子句中的子查询支持列子查询和行子查询,子查询一般返回一行一列、多行一列或者一行多列的数据记录集合。B.存放于FROM子句中的子查询:存放于FROM子句中的子查询主要支持表子查询。此时,子查询一般返回多行多列数据记录集合,可以将查询结果集合作为一张临时表。3.上机操作答:示例要求:登录MySQL数据库管理系统,基于上一章创建的供应数据库以及其中的供应商表、工程表、零件表以及供应表;使用select语句对供应数据库中的数据进行查询操作。(1)查询所有供应商名和地址。其命令如下:(2)查询颜色为棕色的零件编号,零件名以及颜色。其命令如下:(3)查询使用供应商s004所供应零件的工程编号。其命令如下:(4)查询工程项目p002使用的各种零件的名称及数量。其命令如下:(5)查询厂商s001供应的所有零件de编号和零件名,且要求无重复值存在。其命令如下:(6)查询联系电话以133开头的供应商编号、供应商名以及联系电话(两种方式:正则表达式、like关键字)。其命令如下:(7)查询没有使用零件g001和g002的工程编号、工程名以及地址(子查询)。其命令如下:(8)查询使用s001供应商生产的棕色零件的工程编号。其命令如下:(9)查询工程p001使用的零件编号,以及各零件的整体数量,按照升序排列。其命令如下:第8章视图与索引1.选择题1-1.D1-2.C1-3.D1-4.D1-5.A 1-6.A1-7.C1-8.D2.简答题2-1答: 两者的区别:(1)视图是按照SQL语句生成的一个虚拟的表。(2)视图不占实际的物理空间,而表中的记录需要占物理空间。(3)建立和删除视图只影响视图本身,不会影响实际的记录。而建立和删除表会影响实际的记录。两者的联系:视图是在基本表上建立的表,其字段和记录都来自基本表,其依赖基本表而存在一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象,在逻辑意义上建立的新关系。 2-2答:索引建立在一个或者几个字段上。建立了索引后,表中的数据就按照索引的一定规排列。这样可以提高查询速度。主键是表中数据的唯一标识。不同的记录的主键值不同。例如,身份证好比主键,每个身份证号都可以唯一的确定一个人。在建立主键时,系统会自动建立一个唯一性索引。唯一性也是建立在表中一个或者几个字段上。其目的是为了对于不同的记录,具有唯一性的字段的值是不同的。 3.上机操作 答:create[algorithm=undefined]viewview_an(id,name,kind)asselectid,name,kindsfromanimalwithcheckoption; 注:algorithm=undefined参数可以不显式体现在代码中,因为algorithm参数的默认值既是undefined。(2)①Insertintoview_anvalues(10,’熊’,’哺乳’);②Insertintoview_anvalues(10,NULL,’哺乳’);③Insertintoview_anvalues(10,’马’,NULL); 以上①、②、③条语句为在视图view_an中插入的三条语句,查看是否插入成功则用select命令,其代码如下。 SELECT*FROMview_an; 代码运行成功后,对于语句①通过结果可以看到插入成功,而语句②和语句③则插入失败,因为在创建视图view_an时使用了withcheckoption参数约束了插入元组的中的id,name,kind属性的值都不允许为空。 (3)createorreplaceviewview_an(id,name,kind)asselectid,name,kindsfromanimalWHEREkinds=’哺乳’withcheckoption; 或者 ALTERviewview_an(id,name,kind)asselectid,name,kindsfromanimalWHEREkinds=’哺乳’withcheckoption;dropviewview_an;Createuniqueindexindex_idonanimal(id);Createfulltextindexindex_havioronanimal(behavior);Dropindexindex_havioronanimal;第9章触发器选择题B1-2.D1-3.C1-4.D1-5.C1-6.B1-7.D1-8.A1-9.C1-10.D简答题2-1答:触发器是一种与表操作有关的数据库对象,在预定义的事件发生时,触发程序就会被MySQL自动调用。触发器经常用于实现加强数据的完整性约束和业务规则、跟踪监控用户对数据库的操作等功能,总的来说,触发器可以提高系统的自动化程度,增强系统的灵活性和可靠性,并帮助开发人员更好地控制和管理系统的行为。2-2答:按照触发事件分类有三类,分别为INSERT触发器、UPDATE触发器和DELETE触发器。INSERT:在表中新增新数据时激活触发器。UPDATE:在表中更新数据时激活触发器。DELETE:从表中删除数据时激活触发器。按照触发时刻分类有两类,分别是BEFORE触发器和AFTER触发器。BEFORE:在触发事件发生之前触发程序。AFTER:在触发事件发生之后触发程序。2-3答:滥用触发器可能导致以下几个方面的影响:性能问题:触发器是在数据库中执行的逻辑代码,如果触发器逻辑复杂或不合理,可能会对数据库的性能产生负面影响。频繁的触发器执行可能导致响应时间延迟和系统性能下降。死锁和循环触发:如果触发器逻辑导致了循环触发的情况,可能会产生死锁问题,导致数据库无法正常运行。例如,触发器A触发了触发器B,而触发器B又触发了触发器A,形成了一个无限循环。数据不一致性:不恰当的触发器逻辑可能导致数据一致性问题。如果触发器逻辑有错误或逻辑不完善,可能会导致数据更新不正确或数据丢失等问题。调试和维护困难:滥用触发器可能增加代码的复杂性和耦合性,使调试和维护变得困难。当存在多个复杂的触发器时,定位问题和诊断错误可能会更加困难。因此,在使用触发器时,需要谨慎设计、监控和测试触发器的逻辑,确保其合理性、可靠性和性能方面的考虑。在某些情况下,可以考虑使用其他方式替代触发器,避免潜在的问题和风险。上机操作答:a.创建日志表,包含操作用户、时间、操作类别和详细信息。CREATETABLE日志(操作用户VARCHAR(30),时间TIMESTAMP,操作类别VARCHAR(10),详细信息VARCHAR(50));b.创建供应商新增触发器、供应商修改触发器、供应商删除触发器。--供应商新增触发器CREATETRIGGERtr_供应商_insertAFTERINSERTON供应商FOREACHROWINSERTINTO日志VALUES(user(),now(),'INSERT',concat(NEW.供应商编号,NEW.供应商名,NEW.供应商地址,NEW.联系电话));--供应商修改触发器CREATETRIGGERtr_供应商_updateAFTERUPDATEON供应商FOREACHROWINSERTINTO日志VALUES(user(),now(),'UPDATE',CONCAT('修改前:',OLD.供应商编号,OLD.供应商名,OLD.供应商地址,OLD.联系电话));--供应商删除触发器CREATETRIGGERtr_供应商_deleteAFTERDELETEON供应商FOREACHROWINSERTINTO日志VALUES(user(),now(),'DELETE',concat(OLD.供应商编号,OLD.供应商名,OLD.供应商地址,OLD.联系电话));c.在供应商表中新增一条记录,并查看日志表结果。INSERTINTO供应商(供应商编号,供应商名,供应商地址,联系电话)values('S001','鸿运彩钢厂','黑龙江省哈尔滨市',);SELECT*FROM日志;图9-1显示供应商新增触发器触发结果修改供应商表供应商编号为'S001'的记录,将供应商地址修改为'黑龙江省齐齐哈尔市',联系电话修改为,并查看日志表结果。UPDATE供应商SET供应商地址='黑龙江省齐齐哈尔市',联系电话=WHERE供应商编号='S001';SELECT*FROM日志;图9-2显示供应商修改触发器触发结果删除供应商表供应商编号为'S001'的记录,并查看日志表结果。DELETEFROM供应商WHERE供应商编号='S001';SELECT*FROM日志;图9-3显示供应商删除触发器触发结果a.创建供应备份表,复制供应表的结构和数据。CREATETABLE供应备份select*from供应;b.创建供应新增触发器、供应商修改触发器、供应商删除触发器,实现将供应表信息同步到供应备份表。--供应新增触发器CREATETRIGGERtr_供应_insertAFTERINSERTON供应FOREACHROWINSERTINTO供应备份VALUES(NEW.供应商编号,NEW.工程编号,NEW.零件编号,NEW.数量);--供应修改触发器CREATETRIGGERtr_供应_updateAFTERUPDATEON供应FOREACHROWUPDATE供应备份SET数量=NEW.数量WHERE供应商编号=NEW.供应商编号AND工程编号=NEW.工程编号AND零件编号=NEW.零件编号;--供应删除触发器CREATETRIGGERtr_供应_deleteAFTERDELETEON供应FOREACHROWDELETEFROM供应备份WHERE供应商编号=OLD.供应商编号AND工程编号=OLD.工程编号AND零件编号=OLD.零件编号;在供应表中新增两条记录,并查看供应备份表结果。INSERTINTO供应VALUES('S001','p001','g001',5),('S001','p001','g002',4);SELECT*FROM供应备份;图9-4显示供应新增触发器触发结果修改供应表供应商编号为'S001',工程编号为'p001',零件编号为'g001'的记录,将数量修改为10,并查看供应备份表结果。UPDATE供应SET数量=10WHERE供应商编号='s001'AND工程编号='p001'AND零件编号='g001';SELECT*FROM供应备份;图9-5显示供应修改触发器触发结果删除供应表供应商编号为'S001',工程编号为'p001',零件编号为'g001'的记录,并查看供应备份表结果。DELETEFROM供应WHERE供应商编号='s001'AND工程编号='p001'AND零件编号='g001';SELECT*FROM供应备份;图9-6显示供应删除触发器触发结果第10章存储过程和函数选择题B1-2.B1-3.A1-4.B1-5.D1-6.C1-7.A1-8.C1-8.D1-9.C简答题2-1答:存储过程是一组预先编译好用于完成特定功能的SQL语句集合,存储在数据库服务器端,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把这一组SQL语句全部执行。--创建存储过程CREATEPROCEDURE存储过程名([IN|OUT|INOUT参数名参数类型[,...]])[characteristics...]BEGIN存储过程主体;END--调用存储过程CALL存储过程名([参数值[,...]]);--删除存储过程DROPPROCEDURE[IFEXISTS]存储过程名;2-2答:存储函数是一种在数据库中定义、编译和保存的可重复执行的函数。它可以接受参数,并返回一个值作为结果。与存储过程相比,主要区别如下:返回结果:存储过程通常用于执行一系列的操作,返回结果灵活。而存储函数则必须返回一个结果值。使用方式:存储过程通过调用并执行的方式使用,而存储函数可以像普通函数一样在表达式中使用。参数传递:存储过程和存储函数都可以接受参数,但存储过程可以使用传入参数改变数据,而存储函数只能使用传入参数进行计算并返回结果。总之,存储过程和存储函数都是在数据库中定义的可重复执行的代码块,但存储过程主要用于执行操作而存储函数主要用于计算和返回结果。2-3答:可以使用ALTERPROCEDURE语句修改存储过程的某些特征。如果要修改存储过程的内容则需要通过删除原存储过程,再以相同的命名创建新的存储过程的方式来实现。2-4答:存储过程的参数有三类,分别为输入参数(IN)、输出参数(OUT)、输入输出参数(INTOU)。IN:当前参数为输入参数,存储过程只是读取这个参数的值。如果没有定义参数种类,默认为IN。OUT:当前参数为输出参数,该类新的参数由存储过程写入,调用这个存储过程的客户端或者应用程序可以读取这个参数返回的值。INOUT:同时具有IN参数和OUT参数的特性,在过程中可以读取和写入该类型的参数。上机操作答:创建存储过程total_proc,实现统计供应商、工程、零件总数功能。DELIMITER//CREATEPROCEDUREtotal_proc(OUTo_供应商_totalfloat,OUTo_工程_totalfloat,OUTo_零件_totalfloat)BEGINSELECTCOUNT(*)INTOo_供应商_totalFROM供应商;SELECTCOUNT(*)INTOo_工程_totalFROM工程;SELECTCOUNT(*)INTOo_零件_totalFROM零件;END//DELIMITER;调用存储过程total_proc,并查看调用结果。CALLtotal_proc(@供应商总数,@工程总数,@零件总数);SELECT@供应商总数,@工程总数,@零件总数;图10-1显示存储过程total_proc调用结果新增存储函数total_func,实现统计给定零件在给定工程中的使用数量功能。DELIMITER//CREATEFUNCTIONtotal_func(i_零件编号char(10),i_工程编号char(10))RETURNSfloatDETERMINISTICBEGINRETURN(SELECTsum(数量)FROM供应WHERE零件编号=i_零件编号AND工程编号=i_工程编号);END//DELIMITER;调用存储过程total_proc,并查看调用结果。SELECTtotal_func('g001','p001');图10-2显示存储函数total_func调用结果删除以上存储过程total_proc和存储函数total_func。DROPPROCEDUREIFEXISTStotal_proc;DROPFUNCTIONIFEXISTStotal_func;图10-3显示删除存储过程total_proc和存储函数total_func后结果第11章用户管理选择题1-1.D1-2.A1-3.C1-4.C1-5.A1-6.B1-7.C1-8.B1-9.B1-10.B简答题2-1答:CREATEUSER用户名@主机名[IDENTIFIEDBY[PASSWORD]密码]DROPUSER用户名@主机名2-2答:GRANT权限(列名,...),...ON数据库名.表名TO用户名@主机名GRANT数据库权限,...ON*.*TO用户名@主机名2-3答:可以使用REVOKE语句来撤销MySQL用户对特定数据库的访问权限。例如:REVOKEALLPRIVILEGESONdatabase.*FROM'username'@'hostname';2-4答:可以使用GRANT语句和SHOWGRANTS语句组合来实现。先使用SHOWGRANTS语句生成授权语句,然后使用GRANT语句将这些权限授予给另一个用户。上机操作答:创建apply1、apply2和apply3这三个用户,并在user表中查询这些用户。CREATEUSERapply1@localhostIDENTIFIEDBY'12345',apply2@localhostIDENTIFIEDBY'12345',apply3@localhostIDENTIFIEDBY'12345';SELECTUser,HostFROMuserWHEREUser='apply1'orUser='apply2'orUser='apply3';图11-1显示创建用户apply1、apply2、apply3结果向用户apply1授权,并查看该用户权限。GRANTSELECTON供应.*TOapply1@localhostWITHGRANTOPTION;SHOWGRANTSFORapply1@localhost;图11-2显示用户apply1授权结果向用户apply2授权,并查看该用户权限。GRANTINSERT,DELETE,UPDATE(供应商地址,联系电话)ON供应.供应商TOapply2@localhost;GRANTINSERT,DELETE,UPDATE(地址)ON供应.工程TOapply2@localhost;GRANTINSERT,DELETEON供应.零件TOapply2@localhost;SHOWGRANTSFORapply2@localhost;图11-3显示用户apply2授权结果向用户apply3授权,并查看该用户权限。GRANTALLON供应.供应TOapply3@localhost;SHOWGRANTSFORapply3@localhost;图11-4显示用户apply3授权结果撤销用户apply3的所有权限,并查看该用户权限。REVOKEALL,GRANTOPTIONFROMapply3@localhost;SHOWGRANTSFORapply3@localhost;图11-5显示用户apply3撤销权限结果删除用户apply2,并查看apply1、apply2和apply3三个用户。DROPUSERapply2@localhost;SELECTUser,HostFROMuserWHEREUser='apply1'orUser='apply2'orUser='apply3';图11-6显示删除用户apply2结果第12章数据备份与还原1.选择题1-1.B1-2.A1-3.C1-4.B1-5.A2.简答题2-1答:mysqldump备份的文本文件实际上是数据库的一个副本,使用该文件不仅可以在MySQL中恢复数据库,而且通过对该文件的简单修改,使用该文件在SQLServer或者Sybase等其他数据库中恢复数据库。这在某种程度上实现了数据库之间的迁移。2-2答:根据数据库表的存储引擎的类型不同,备份表的方法也不一样。对于MyISAM类型的表,可以直接复制MySQL数据文件夹,复制数据文件夹时需要将MySQL服务停止,否则可能会出现异常。mysqldump命令是非常安全的备份方法,它既适合MyISAM类型的表,又适合InnoDB类型的表。第13章日志管理 1.选择题1-1.C1-2.A1-3.B1-4.A1-5.C 1-6.B1-7.D1-8.D1-9.B 2.简答题2-1.答:事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务具有4个特性:原子性,一致性、隔离性和持续性。2-2.答:当多个事务并发地存取数据库时就会产生同时读取或修改同一数据的情况,若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性,所以数据库管理系统必须提供并发控制机制。2-3.答:封锁就是事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后的事务就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象.2-4.答:基本的封锁有两种:排他锁和共享锁排他锁又称为写锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A.共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何的修改。第14章Java操作MySQL数据库上机操作:示例要求:连接MySQL数据库,基于Java语言,对供应数据库中的零件Item表、工程Project表、供应商Supplier表以及供应Supply表进行数据的增删改查操作。其实现过程如下所示:使用Java语言连接供应数据库;importjava.sql.*;

publicclassDBConnection{

//驱动

publicstaticfinalStringdriverName="com.mysql.cj.jdbc.Driver";

//数据库地址

publicstaticfinalStringurl="jdbc:mysql://localhost:3306/供应?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&allowPublicKeyRetrieval=true";

//数据库用户名

publicstaticfinalStringuser="root";

//数据库密码

publicstaticfinalStringpassword="password";

publicstaticConnectionconnection=null;

//获取数据库连接

publicstaticConnectiongetConnection()throwsSQLException{

try{

Class.forName(driverName);

connection=DriverManager.getConnection(url,user,password);

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}

returnconnection;

}

//释放数据库连接

publicstaticvoidclose(ResultSetrs,Statementst,Connectionconn){

try{

if(rs!=null){

rs.close();

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

try{

if(st!=null){

st.close();

}

}catch(SQLExceptione){

e.printStackTrace();

}finally{

if(conn!=null){

try{

conn.close();

}catch(SQLExceptione){

e.printStackTrace();

}

}

}

}

}

}创建工程Project类;查询工程Project表中的所有数据;向工程Project表中增加一行完整的数据行,各字段值为("p004","云上小区","吉林省长春市");在工程Project表中,修改工程编号为p004的数据行,将工程名更新为学校寝室楼改造,地址更改为黑龙江省哈尔滨市;查询工程编号为p004的所有数据;在工程Project表中,删除工程编号为p004的数据行;importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.ArrayList;

//工程类

classProject{

privateStringno;

privateStringname;

privateStringaddress;

publicProject(){

}

publicProject(Stringno,Stringname,Stringaddress){

this.no=no;

=name;

this.address=address;

}

@Override

publicStringtoString(){

return"Project{"+

"no='"+no+'\''+

",name='"+name+'\''+

",address='"+address+'\''+

'}';

}

publicStringgetAddress(){

returnaddress;

}

publicvoidsetAddress(Stringaddress){

this.address=address;

}

publicStringgetNo(){

returnno;

}

publicvoidsetNo(Stringno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

=name;

}

}//工程Project表增删改查

publicclassProjectDao{

//添加

publicstaticvoidadd(Projectp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="insertinto`工程`values('"+p.getNo()+"'"

+",?"

+",?"

+")";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getAddress());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//修改

publicstaticvoidupdate(Projectp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="update`工程`set"+

"`工程名`=?"+

",`地址`=?"+

"where`工程编号`='"+p.getNo()+"'";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getAddress());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//删除

publicstaticvoiddelete(Stringno){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="deletefrom`工程`where`工程编号`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,no);

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//获取全部列表

publicstaticArrayList<Project>getList(){

ArrayList<Project>list=newArrayList<Project>();

try{

Connectioncon=DBConnection.getConnection();

Stringsql="select*from`工程`";

PreparedStatementps=con.prepareStatement(sql);

ResultSetrs=ps.executeQuery();

while(rs.next()){

Projectp=newProject();

p.setNo(rs.getString(1));

p.setName(rs.getString(2));

p.setAddress(rs.getString(3));

list.add(p);

}

DBConnection.close(rs,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

returnlist;

}

//按编号查询

publicstaticProjectfindNo(Stringfind){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="select*from`工程`where`工程编号`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,find);

ResultSetrs=ps.executeQuery();

if(rs.next()){

Projectp=newProject();

p.setNo(rs.getString(1));

p.setName(rs.getString(2));

p.setAddress(rs.getString(3));

returnp;

}

DBConnection.close(rs,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

returnnull;

}

//测试

publicstaticvoidtest(){

Projectp=newProject("p004","云上小区","吉林省长春市");

System.out.println("测试工程增删改查");

System.out.println("\n查询全部");

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n增加工程后,查询全部");

add(p);

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n修改工程后,查询全部");

p.setName("学校寝室楼改造");

p.setAddress("黑龙江省哈尔滨市");

update(p);

for(ProjectProject:getList()){

System.out.println(Project);

}

System.out.println("\n查询工程号"+p.getNo());

System.out.println(findNo(p.getNo()));

System.out.println("\n删除工程后,查询全部");

delete(p.getNo());

for(ProjectProject:getList()){

System.out.println(Project);

}

}

}执行结果如图所示:创建零件Item类。查询零件Item表中的所有数据;向零件Item表中插入一行完整的数据行,各字段值为("g008","彩钢房","蓝色","二层蓝色彩钢房");在零件Item表中,修改零件编号为g008的数据行,将零件名称更新为土石混合料,颜色更新为白色;查询零件Item表中,零件编号为g008的全部信息;删除零件Item表中,零件编号为g008的数据行。importjava.sql.Connection;

importjava.sql.PreparedStatement;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.util.ArrayList;

//零件类

classItem{

privateStringno;

privateStringname;

privateStringcolor;

privateStringbrief;

publicItem(){

}

publicStringgetBrief(){

returnbrief;

}

publicvoidsetBrief(Stringbrief){

this.brief=brief;

}

publicItem(Stringno,Stringname,Stringcolor,Stringbrief){

this.no=no;

=name;

this.color=color;

this.brief=brief;

}

@Override

publicStringtoString(){

return"Item{"+

"no='"+no+'\''+

",name='"+name+'\''+

",color='"+color+'\''+

",brief='"+brief+'\''+

'}';

}

publicStringgetColor(){

returncolor;

}

publicvoidsetColor(Stringcolor){

this.color=color;

}

publicStringgetNo(){

returnno;

}

publicvoidsetNo(Stringno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

=name;

}

}

//jdbc增删改查

publicclassItemDao{

//添加

publicstaticvoidadd(Itemp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="insertinto`零件`values('"+p.getNo()+"'"

+",?"

+",?"

+",?"

+")";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getColor());

ps.setString(3,p.getBrief());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//修改

publicstaticvoidupdate(Itemp){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="update`零件`set"+

"`零件名`=?"+

",`颜色`=?"+

",`简介`=?"+

"where`零件编号`='"+p.getNo()+"'";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,p.getName());

ps.setString(2,p.getColor());

ps.setString(3,p.getBrief());

ps.executeUpdate();

DBConnection.close(null,ps,con);

}catch(SQLExceptione){

e.printStackTrace();

}

}

//删除

publicstaticvoiddelete(Stringno){

try{

Connectioncon=DBConnection.getConnection();

Stringsql="deletefrom`零件`where`零件编号`=?";

PreparedStatementps=con.prepareStatement(sql);

ps.setString(1,no);

ps.ex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论