MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案_第1页
MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案_第2页
MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案_第3页
MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案_第4页
MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案_第5页
已阅读5页,还剩68页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

MySQL数据库基础与实例教程第2版微课版孔祥盛习题答案第1章数据库设计概述1.数据库管理系统中常用的数学模型有哪些?数据库管理系统中常用的数学模型主要有4种,具体如下:1.层次模型:以树形结构组织数据,数据之间呈现上下级的层次关系,每个节点只有一个父节点(根节点除外),适用于表示具有明显层次结构的数据场景。2.网状模型:以图结构组织数据,节点之间可以存在多个关联关系,突破了层次模型“一个节点一个父节点”的限制,能更灵活地表示复杂数据关联。3.关系模型:以二维表(关系)为核心组织数据,通过表中的行(记录)和列(字段)存储数据,表与表之间通过关键字建立关联。它是目前数据库管理系统的主流模型,绝大多数主流数据库(如MySQL、Oracle等)均基于此模型。4.面向对象模型:结合面向对象编程思想,将数据与操作数据的方法封装为对象,支持类、继承、多态等特性,适用于处理复杂的对象化数据场景。2.您听说过的关系数据库管理系统有哪些?MySQL有哪些优点?(1)常见的关系数据库管理系统主流的关系数据库管理系统多源自欧美厂商,具体包括:美国微软公司的SQLServer、美国IBM公司的DB2和Informix、德国SAP公司的Sybase、美国甲骨文公司的Oracle,以及开源免费的MySQL。(2)MySQL的优点1.成本优势显著:开源、免费,无需支付高昂的商业授权费用,大幅降低个人学习和企业商用的成本。2.易用性强:安装流程简单,配置门槛低,即使是初学者也能快速上手搭建和使用。3.性能高效:针对中小规模数据场景优化良好,查询、插入、更新等操作响应速度快,能满足多数应用的性能需求。4.功能齐全:支持SQL标准语法,具备创建数据库、表、索引、视图、存储过程、触发器等完整的数据库功能,可覆盖从简单查询到复杂业务逻辑实现的需求。5.兼容性与扩展性好:支持多种操作系统(Windows、Linux、Mac等),可与Java、Python、PHP等主流编程语言无缝对接,且能通过集群、分区等技术扩展处理能力。6.应用广泛,生态成熟:被誉为“世界上最受欢迎的开源数据库”,微信、淘宝、新浪微博等大型平台均将部分业务迁移至MySQL,社区活跃,问题解决方案丰富。3.通过本章知识的讲解,SQL与程序设计语言有什么关系?您所知道的数据库编码规范有哪些?(1)SQL与程序设计语言的关系1.SQL是操作关系数据库的标准语言,定义了数据库的创建、查询、更新、删除等操作的语法规范;程序设计语言(如Java、Python、PHP等)是用于构建应用程序的语言,负责实现用户交互、业务逻辑控制等功能。2.两者是“协作关系”:程序设计语言无法直接操作数据库数据,需通过在代码中嵌入SQL语句,或调用数据库驱动执行SQL,实现对数据库的访问(如用户登录时,程序通过SQL查询用户表验证账号密码)。3.核心区别:SQL并非功能完善的程序设计语言,无法构建用户界面、实现复杂的算法逻辑;程序设计语言则不具备直接操作数据库的原生能力,需依赖SQL作为数据交互的“桥梁”。(2)常见的数据库编码规范1.命名规则:①以标准英文命名,杜绝拼音或拼音英文混杂,采用语义化命名(如学生表用student,而非xuesheng);②多单词组合时,可采用“单词全小写+下划线分隔”(推荐,如student_no)或驼峰标记法(如studentNo);③数据库对象加专属后缀(自定义函数_fun、存储过程_proc、视图_view、触发器_trigger、索引_index、外键_fk);④避免使用关键字(如user、table,用户表可用users替代)。2.注释规范:为SQL代码添加注释(单行、多行或内联注释),说明代码功能、设计思路,增强可读性和可维护性,方便他人和未来的自己理解代码。3.书写规范:begin...end语句块内首行缩进4个空格或1个Tab,同一语句块缩进级别一致;SQL关键字不区分大小写,但为了可读性,建议统一书写为小写(如delete、from)。4.大小写规范:数据库名、表名的大小写需严格统一,避免因操作系统差异(Windows大小写不敏感、Linux大小写敏感)导致移植问题。4.通过本章的学习,您觉得数据库表与电子表格(如Excel)有哪些区别?数据库表与电子表格(如Excel)在外观上均为“行列表格”,但核心逻辑和功能差异显著,具体区别如下:1.单元格合并:电子表格支持合并单元格(如合并表头单元格);数据库表不支持,每个单元格独立存储数据,确保数据结构的规范性。2.列名唯一性:电子表格的列名可重复(如同一表格中出现两个“姓名”列);数据库表的列名(字段名)必须唯一,否则无法创建表。3.数据类型一致性:电子表格同一列可存储不同类型数据(如一列中同时有数字、文本);数据库表同一列必须存储同一种数据类型(如学号列统一为字符串类型),以提升查询效率和数据规范性。4.记录唯一性:电子表格允许重复记录;数据库表不允许,需通过主键唯一标识每一条记录,确保数据不重复。5.索引支持:电子表格无“索引”概念,查询大量数据时效率极低;数据库表支持索引(至少有一个主键索引),可大幅提升查询速度。6.并发操作:电子表格不支持多用户并发写操作(多人同时编辑易导致数据冲突);数据库表支持多用户并发操作,通过事务、锁机制保障数据一致性。5.罗列“选课系统”需要实现哪些功能。依据自己所掌握的知识,描述如何使用数据库技术实现“选课系统”中的这些功能。(1)选课系统核心功能1.游客功能:模糊查询已审核课程;注册成为学生或教师。2.教师功能:登录系统;申报选修课程(填写课程名、容量等信息);查看本人申报课程的学生列表。3.学生功能:登录系统;从已审核课程中选课(限制最多选2门);查看个人选课信息;课程被删除后可重新选课。4.管理员功能:审核课程;添加班级信息(班级名不重复);批量重置师生密码;删除选修人数少于30人的课程;查看所有课程的学生列表。5.系统规则控制:教师仅能申报1门课程;课程容量限制为60/150/230(对应教室座位数);自动登记选课/调课时间;避免课程最后一个席位被多人抢占。(2)数据库技术实现方案1.数据存储:设计5张核心表(teacher、course、student、classes、choose),分别存储教师、课程、学生、班级、选课信息,通过字段对应实体属性(如course表用course_name存储课程名)。2.身份验证:师生登录时,程序通过SQL的select语句查询对应表(如student表),匹配学号/工号和密码,验证通过则允许登录;通过视图或存储过程避免SQL注入。3.功能规则控制:①教师限报1门课程:在course表的teacher_no字段添加唯一约束,确保一个工号仅对应一门课程;②学生限选2门课程:通过触发器统计学生选课数量,超过2门则拒绝插入;③课程容量限制:用触发器模拟检查约束,确保capacity字段值为60/150/230;④班级名不重复:在classes表的class_name字段添加唯一约束。4.数据查询与统计:①游客查询课程:用select语句结合where条件(status='已审核')实现模糊查询;②统计课程剩余名额:通过子查询统计选课人数,用课程容量减去选课人数得出结果;③查看学生列表:用join语句关联student表和choose表,筛选对应课程的学生信息。5.数据一致性保障:①自动登记时间:在choose表的create_time(选课时间)、update_time(调课时间)字段设置默认值为当前时间;②课程删除后学生重选:删除course表记录时,通过外键级联删除choose表中对应课程的选课记录,释放学生选课名额;③并发控制:用事务和锁机制避免课程最后一个席位被多人抢占。6.如何理解“E-R图中实体间的关系是双向的”?能不能举个例子?(1)核心理解E-R图中实体间的关系并非“单向关联”,而是“双向交互”的,即两个实体之间的关联需从“双方视角”分别描述,最终结合形成完整的关系定义。设计物理数据模型时,需要基于这种双向性选择更合理的关联方式(如让“多方”记住“一方”)。(2)举例说明以“班级”和“学生”实体为例:1.从“班级→学生”的视角:一个班级可以包含若干名学生(关联数目为“多”),描述的是班级对学生的“一对多”单向关系。2.从“学生→班级”的视角:一名学生只能属于一个班级(关联数目为“一”),描述的是学生对班级的“一对一”单向关系。3.双向关系整合:两个单向关系结合,最终确定“班级”与“学生”实体间的关系是“一对多(1∶m)”。这种双向性的实际意义在于,物理建模时选择“让学生表记录所属班级的class_no(外键)”,而非“让班级表记录所有学生的学号”,更符合数据存储的合理性(类似“学生记住校长易,校长记住所有学生难”)。7.在E-R图中,什么是实体?什么是属性?什么是关系?什么是基数?关系分几种?什么是关联?1.实体:表示现实世界中具有相同属性的“事物集合”(而非单个具体事物),是E-R图的核心要素之一,用矩形表示。例如选课系统中的“学生”“教师”“课程”“班级”均为实体,代表一类事物的统称。2.属性:表示实体的某种特征,或实体间关系的特征,用椭圆(Chen方法)或置于实体矩形内部(Crow'sfoot方法)表示,每个属性由属性名唯一标记。例如课程实体的“课程名”“容量”“状态”均为属性。3.关系:表示实体间的联系,用线段(Crow'sfoot方法)或菱形(Chen方法)表示,且关系具有双向性。例如“教师”与“课程”的“申报”关系、“学生”与“课程”的“选修”关系。4.基数:表示一个实体到另一个实体的关联数目(针对关系的某个方向),可表示为取值范围或具体数值。基数分为“强制关系”(最小值为1,用“|”表示,对应非空约束)和“可选关系”(最小值为0,用“O”表示,对应字段可空)。例如课程必须由教师申报(课程→教师为强制关系),教师未必申报课程(教师→课程为可选关系)。5.关系的种类:基于基数和双向性,分为3类:①一对一(1∶1):双方单向关系均为“一”(如教师与课程,一名教师限报1门,一门课程限1名教师申报);②一对多(1∶m):一方单向关系为“一”,另一方为“多”(如班级与学生);③多对多(m∶n):双方单向关系均为“多”(如学生与课程,一名学生可选多门,一门课程可被多名学生选)。6.关联:用于表示存在自身属性的多对多关系,本质是一个“关系实体”,可存储关系的额外信息(如时间、状态)。例如学生与课程的选修关系存在“成绩”“选课时间”等属性,需用“选修关联”表示,对应物理模型中的choose表。8.使用绘图工具绘制选课系统的E-R图。(1)绘图工具选择推荐使用PowerDesigner(专业建模工具,支持正向/逆向工程),也可使用Visio、在线绘图工具(如ProcessOn)或Word绘图工具。以下基于PowerDesigner的Crow'sfoot方法描述绘制要点。(2)E-R图核心要素实体及属性:①教师(teacher):工号(teacher_no)、姓名(teacher_name)、联系方式(teacher_contact);②课程(course):课号(course_no)、课程名(course_name)、容量(capacity)、课程描述(description)、状态(status);③学生(student):学号(student_no)、姓名(student_name)、联系方式(student_contact);④班级(classes):班级号(class_no)、班级名(class_name)、所属院系(department_name)。关联及属性:选修关联(choose):成绩(score)、选课时间(create_time)、调课时间(update_time)。实体间关系:①教师与课程:1∶1(教师申报课程,course表的teacher_no为外键+唯一约束);②班级与学生:1∶m(学生属于班级,student表的class_no为外键);③学生与课程:m∶n(通过选修关联连接,choose表的student_no和course_no为外键)。(3)绘制步骤打开PowerDesigner,新建“ConceptualDataModel”。创建4个实体,分别填写实体名和对应属性,设置主键(如teacher的teacher_no)。创建“选修关联”,添加对应属性。连接实体与关系/关联,设置关系类型(1∶1、1∶m、m∶n)和基数(强制/可选)。调整布局,确保图形简洁清晰,保存为PDF或图片格式。9.数据库的设计步骤是什么?为每个表定义一个主键有技巧可循吗?主键与关键字有什么关系?(1)数据库的设计步骤核心分为3个阶段,具体步骤如下:概念数据模型(CDM)设计:①需求分析:明确系统功能和问题域(如选课系统的师生操作、规则限制);②提炼实体、属性和关系;③绘制E-R图(核心产出物,决定数据库质量)。物理数据模型(PDM)设计:①选择数据库管理系统(如MySQL);②将E-R图转换为表结构(实体→表、属性→字段);③定义主键、外键;④选择字段数据类型;⑤添加约束;⑥设计索引;⑦用规范化理论评价并优化表结构。数据库实施:通过SQL脚本创建数据库、表、索引等对象,部署业务逻辑(存储过程、触发器),测试数据一致性和功能可用性。(2)定义主键的技巧技巧1:主键字段长度越短越好。优先选择短字段(如学号、工号)作为主键,避免用长文本(如班级名“2024数据科学与大数据技术1班”),减少存储开销和管理难度。技巧2:尽量避免复合主键。复合主键(多字段组合)会增加表维护难度(如更新、删除操作复杂),若无合适单字段主键,参考技巧3。技巧3:无合适字段时,添加“无意义字段”作为主键。例如班级表添加class_no、课程表添加course_no作为主键,优点:①避免复合主键,符合2NF;②减少主键数据因业务变化被修改(如课程名修改不会影响主键)。技巧4:主键值自动生成。由数据库(如MySQL的auto_increment)或应用程序自动生成主键值,避免手工录入导致的错误(如重复、空缺)。(3)主键与关键字的关系关键字(键):能唯一标识表中一条记录的字段或字段组合,核心要求是“非空(notnull)+唯一(unique)”。一个表可以有多个关键字(如学生表的学号、身份证号均可作为关键字)。主键:是从表的多个关键字中“选中的一个核心关键字”,用于作为表的主要标识。一个表有且仅有一个主键,且继承关键字“非空+唯一”的特性。核心关系:主键属于关键字的子集,所有主键都是关键字,但并非所有关键字都是主键。例如学生表中,学号是主键,身份证号是关键字但非主键。10.在数据库设计过程中,数据库表如何表示E-R图中的1∶m、1∶1、m∶n关系?表示一对多(1∶m)关系:①核心逻辑:让“多方”记住“一方”,通过外键维持关系;②具体操作:将“一方”表的主键添加到“多方”表中,作为“多方”表的外键。例如班级(一方)与学生(多方),将班级表的主键class_no添加到学生表中作为外键,学生表通过class_no关联所属班级。表示一对一(1∶1)关系:①核心逻辑:基于一对多关系的基础,额外向外键添加“唯一性约束(unique)”,限制外键值不可重复;②具体操作:选择“被动方”表添加外键(需结合业务逻辑,选择“必须关联”的一方作为被动方)。例如教师与课程(1∶1),课程必须由教师申报(课程为被动方),将教师表的主键teacher_no添加到课程表中作为外键,并添加唯一约束,确保一个教师仅对应一门课程。表示多对多(m∶n)关系:①核心逻辑:创建“中间表”(对应E-R图的关联),将两个“多方”表的主键均添加到中间表中作为外键,由中间表维持多对多关系;②具体操作:中间表的外键组合唯一标识一条关联记录,若需存储关系属性,可在中间表中添加对应字段。例如学生与课程(m∶n),创建choose中间表,添加student_no(关联学生表主键)和course_no(关联课程表主键)作为外键,同时添加score、create_time等属性字段。11.在数据库管理系统中,您所熟知的数据类型有哪些?每一种数据类型能不能各列举一些例子?数据库管理系统中常用的数据类型分为3大类,具体如下:数值类型:用于存储可参与算术运算的数值,分为整数类型和小数类型。①整数类型:MySQL中的int(如学号1001、工号2024001)、tinyint(如性别编码1=男、2=女);②小数类型:精确小数decimal(如成绩88.5、工资5000.00)、浮点数float/double(如商品价格99.99)。字符串类型:用于存储文本数据,分为定长和变长。①定长字符串char(如性别“男”“女”,长度固定);②变长字符串varchar(如姓名“张三”、课程名“Java语言程序设计”,长度随内容变化);③长文本text(如课程详细描述、学生备注信息)。日期类型:用于存储时间相关数据,本质是时间戳(可参与简单加减运算)。①日期类型date(如出生日期“2000-01-01”,格式YYYY-MM-DD);②日期时间类型datetime(如选课时间“2024-09-0108:30:00”,格式YYYY-MM-DDhh:ii:ss);③时间戳timestamp(自动记录数据插入/更新时间,如create_time)。补充说明:部分数据外观为数值,但不参与算术运算(如手机号码、身份证号),建议存储为字符串类型(如varchar(11)存储手机号)。12.您所熟知的约束条件有哪些?MySQL支持哪些约束条件?(1)常见的约束条件(SQL标准定义)主键约束(primarykeyconstraint):确保表中记录唯一,一个表有且仅有一个主键,主键字段非空且唯一。非空约束(notnullconstraint):强制字段必须输入有效值,不允许为空(null)。检查约束(checkconstraint):检查字段输入值是否符合指定条件(如成绩0-100、课程容量60/150/230)。默认值约束(defaultconstraint):插入记录时,若未指定字段值,自动填充默认值(如课程状态默认“未审核”)。唯一性约束(uniqueconstraint):确保字段或字段组合的值不重复(可空,一个表可多个)。外键约束(foreignkeyconstraint):维持两张表(父表、子表)的参照完整性,子表外键值需匹配父表主键值或为空。(2)MySQL支持的约束条件MySQL不支持SQL标准的“检查约束”,仅支持其余5种约束:主键约束、非空约束、默认值约束、唯一性约束、外键约束。对于检查约束的需求,需通过触发器模拟实现(如限制课程容量的取值范围)。13.选课系统有几个表?每个表有哪些字段?每个字段的数据类型是什么?哪些字段应该设置约束?应该设置何种约束?(1)选课系统的表结构(共5张表)以下基于MySQL环境设计,字段数据类型结合业务场景选择,约束基于功能需求设置:表1:教师表(teacher)字段及数据类型:①teacher_no(varchar(20)):工号;②teacher_name(varchar(20)):姓名;③teacher_contact(varchar(20)):联系方式。约束设置:①teacher_no:主键约束(唯一标识教师)、非空约束;②teacher_name:非空约束(教师必须有姓名);③teacher_contact:无强制约束(允许为空)。表2:班级表(classes)字段及数据类型:①class_no(varchar(20)):班级号;②class_name(varchar(50)):班级名;③department_name(varchar(50)):所属院系。约束设置:①class_no:主键约束、非空约束;②class_name:非空约束、唯一性约束(班级名不可重复);③department_name:非空约束(班级必须归属院系)。表3:学生表(student)字段及数据类型:①student_no(varchar(20)):学号;②student_name(varchar(20)):姓名;③student_contact(varchar(20)):联系方式;④class_no(varchar(20)):所属班级号(外键)。约束设置:①student_no:主键约束、非空约束;②student_name:非空约束;③class_no:外键约束(参照classes表的class_no)、非空约束(学生必须归属班级)。表4:课程表(course)字段及数据类型:①course_no(varchar(20)):课号;②course_name(varchar(50)):课程名;③capacity(int):容量;④description(text):课程描述;⑤status(varchar(20)):状态(未审核/已审核);⑥teacher_no(varchar(20)):任课教师工号(外键)。约束设置:①course_no:主键约束、非空约束;②course_name:非空约束;③capacity:非空约束、默认值约束(默认60);④status:非空约束、默认值约束(默认“未审核”);⑤teacher_no:外键约束(参照teacher表的teacher_no)、非空约束、唯一性约束(实现教师与课程1∶1关系)。表5:选课表(choose)字段及数据类型:①choose_no(int):选课记录号(主键);②student_no(varchar(20)):学号(外键);③course_no(varchar(20)):课号(外键);④score(int):成绩;⑤create_time(datetime):选课时间;⑥update_time(datetime):调课时间。约束设置:①choose_no:主键约束、非空约束、自增约束(auto_increment);②student_no:外键约束(参照student表的student_no)、非空约束;③course_no:外键约束(参照course表的course_no)、非空约束;④(student_no,course_no):唯一性约束(避免学生重复选同一门课);⑤create_time:非空约束、默认值约束(默认当前时间);⑥score:默认值约束(默认null,未考试时无成绩)。14.MySQL支持检查约束吗?如何实现MySQL的检查约束?(1)MySQL对检查约束的支持情况MySQL不支持SQL标准的“检查约束(checkconstraint)”。虽然MySQL8.0+版本在语法上允许书写check约束,但仅作为“语法兼容”,不会实际生效(即输入不符合条件的数据仍能插入)。(2)MySQL中实现检查约束的方案:触发器核心思路:创建触发器,在插入(insert)或更新(update)数据时,检查字段值是否符合条件;若不符合,触发错误并拒绝操作。以下以“限制课程容量为60/150/230”为例,演示实现步骤:创建触发器(插入数据时检查):创建触发器(更新数据时检查):效果说明:当向course表插入或更新capacity字段时,若值不是60、150、230,触发器会抛出错误,拒绝操作,从而模拟实现检查约束的功能。15.什么是1NF、2NF、3NF?什么是部分函数依赖、传递函数依赖?存在部分函数依赖、传递函数依赖的表结构会引发哪些问题?(1)1NF、2NF、3NF的定义(范式是累积的,符合高范式必符合低范式)1NF(第一范式):最基础范式,要求:①无合并单元格;②表有且仅有一个主键(无重复记录);③无重复列名。几乎所有关系数据库管理系统都强制表结构符合1NF(否则无法创建表)。2NF(第二范式):在1NF基础上,要求“每个非关键字字段完全函数依赖于主键”,即无“部分函数依赖”。3NF(第三范式):在1NF、2NF基础上,要求“无传递函数依赖”,即非关键字字段不依赖于其他非关键字字段。(2)部分函数依赖与传递函数依赖的定义部分函数依赖:若字段Y函数依赖于主键X(X→Y),但Y也可由X的某个真子集X'决定(X'→Y),则Y部分依赖于X。例如选课表主键为(student_no,course_no),学生姓名仅由student_no决定(与course_no无关),则(student_no,course_no)→student_name为部分函数依赖。传递函数依赖:若字段Z依赖于字段Y(Y→Z),字段Y依赖于主键X(X→Y),且Z不属于X或Y,则Z传递依赖于X。例如学生表主键为student_no,student_no→居住地,居住地→邮编,则student_no→邮编为传递函数依赖。(3)部分/传递函数依赖引发的问题数据冗余:重复存储相同数据(如部分依赖中,学生选多门课则姓名重复存储;传递依赖中,同一居住地学生则邮编重复存储)。更新异常:修改数据时需更新所有关联记录,漏改则导致数据不一致(如修改学生居住地后,需更新所有选课记录中的邮编,漏改则出现同一学生多个邮编)。插入异常:无法插入“无关联主键”的数据(如传递依赖中,新增居住地时,因无对应学生(主键)而无法插入邮编信息)。删除异常:删除主数据时,意外删除关联的附属数据(如删除学生所有选课记录时,同时删除了学生姓名、居住地等基础信息)。16.如果某数据库开发人员将学生表设计为如下表结构,请用数据库规范化理论解释该表是否符合3NF的要求?(student_no,student_no,student_name,student_contact,class_no,department_name)该表结构不符合3NF要求,甚至不符合1NF要求,具体分析如下:第一步:判断是否符合1NF。1NF要求“无重复列名”,该表结构中出现两个“student_no”列(重复列名),直接违反1NF。而范式是累积的,不符合1NF则必然不符合2NF和3NF。第二步:假设修正重复列名(保留一个student_no作为主键),进一步分析2NF和3NF。修正后表结构为(student_no,student_name,student_contact,class_no,department_name):①无部分函数依赖(主键为单字段,不存在“主键子集决定非关键字字段”的情况),符合2NF;②存在传递函数依赖:student_no→class_no(主键→班级号),class_no→department_name(班级→院系),且department_name不属于student_no或class_no,因此student_no→department_name为传递函数依赖,违反3NF要求。结论:原始表因重复列名违反1NF,修正后仍因传递函数依赖违反3NF,最终不符合3NF要求。17.受教室座位数的限制,每一门课程设置了容量,学生选课时,每门课程的“剩余名额”时刻在发生变化,如何记录每门课程还有多少“剩余名额”?有哪些设计方案?这些设计方案有什么特点?(1)核心设计方案(共2种)方案1:向course表添加“剩余名额”冗余字段(available)表结构调整:course表新增available字段(int类型),初始值设为capacity(课程容量),即available=capacity。名额维护逻辑:学生选课则available减1,退课则available加1,调课则对应课程available分别加减1(需通过应用程序或触发器维护)。方案特点:①优点:检索效率极高,查询剩余名额时直接查询available字段(无需统计计算),适合高并发查询场景(如大量学生同时查看课程名额);②缺点:维护成本高,需额外编写代码(应用程序/触发器)确保available+已选人数=capacity,否则出现数据不一致;高并发更新(如多人同时选课)时易出现名额统计错误(需结合事务、锁机制优化)。方案2:不新增字段,通过实时计算获取剩余名额核心逻辑:剩余名额=课程容量(capacity)-已选学生人数(通过choose表统计对应course_no的记录数)。查询SQL示例:selectc.course_no,c.course_name,c.capacity,(c.capacity-count(ch.student_no))asavailablefromcoursecleftjoinchoosechonc.course_no=ch.course_nogroupbyc.course_no;方案特点:①优点:无数据冗余,无需维护额外字段,天然避免数据不一致问题;更新效率高(选课/退课仅需操作choose表,无需修改course表),适合高并发更新场景;②缺点:检索效率低,每次查询需关联course和choose表并统计计算,数据量较大时(如千门课程、万名学生)查询速度慢。(2)方案选择建议无绝对“最优方案”,需结合业务场景选择:①若系统以“查询为主”(如选课初期学生集中查看名额),选方案1,搭配触发器、事务保障数据一致性;②若系统以“更新为主”(如选课高峰期大量学生同时选课、退课),选方案2,可通过索引优化join和统计效率;③折中方案:非高峰时段用方案2,高峰时段用方案1(通过定时任务同步available字段值),平衡检索和更新效率。

MySQL第2章习题答案1.通过本章的学习,您了解的MySQL特点有哪些?(1)开源免费,易于获取和使用,降低开发与运维成本;(2)跨平台性,支持Windows、Linux、macOS等多种操作系统;(3)支持多种存储引擎(如InnoDB、MyISAM等),可根据业务场景灵活选择;(4)拥有核心配置文件(Windows下为my.ini,Linux/macOS下为f),可通过配置参数自定义服务器和客户机运行规则;(5)支持多种字符集(如gb2312、gbk、utf8mb4、big5等),能适配不同语言的存储需求,可通过配置避免字符乱码;(6)提供完善的注释机制(单行、多行、内联注释),便于SQL代码的维护和理解;(7)支持SQL脚本文件批量执行SQL语句,提升开发效率;(8)拥有全局系统变量和会话系统变量,可通过配置或命令调整服务器和会话的运行状态;(9)支持共享表空间和独享表空间两种存储方式,适配不同的存储需求;(10)自带系统数据库,用于存储账户信息、权限、性能数据等核心系统数据,保障服务器正常运行。2.什么是MySQL客户机?什么是MySQL会话?简单描述MySQL的使用流程。(1)MySQL客户机:是与MySQL服务器进行交互的工具/程序,用于向服务器发送SQL命令(如查询、增删改等)并接收执行结果。常见形式包括CMD命令提示符窗口(执行mysql.exe)、Navicat等可视化工具。其特征是以“mysql>”作为命令提示符,以“;”或“\g”作为命令结束标记。(2)MySQL会话:指MySQL客户机成功连接MySQL服务器后,两者之间建立的交互链路。每个客户机连接都会产生独立的会话,会话系统变量记录了当前会话的状态,且会话间的配置(如会话变量修改)互不影响。(3)MySQL使用流程:①启动MySQL服务:通过CMD执行“mysqld”命令,或通过Windows系统服务启动;②打开MySQL客户机并登录:通过CMD执行“mysql-u用户名-p”命令,输入密码后登录服务器;③执行SQL操作:在客户机中输入SQL命令(如查看数据库、创建表、增删改查记录等);④关闭MySQL客户机:使用“Ctrl+z”组合键(Windows)退出客户机;⑤停止MySQL服务:关闭启动服务的CMD窗口,或通过“netstopmysql”命令、Windows系统服务停止。3.一台主机可以安装多种MySQL客户机程序,每一种MySQL客户机程序可以同时打开多个MySQL客户机。搜索常用的MySQL客户机工具有哪些?常用MySQL客户机工具包括:(1)MySQL自带CMD客户端:通过MySQL安装目录下的mysql.exe启动,无图形界面,依赖命令行操作;(2)Navicat:可视化图形界面工具,支持Windows、macOS等系统,功能强大,可便捷实现数据库管理、表设计、SQL编辑与执行等操作;(3)SQLyog:轻量级可视化工具,占用资源少,操作简单,适合中小型项目的数据库管理;(4)DataGrip:JetBrains旗下的专业数据库工具,支持多种数据库类型,具备智能代码提示、语法检查等功能,适合开发人员使用;(5)PhpMyAdmin:基于Web的MySQL管理工具,无需安装客户端,通过浏览器即可操作,适合远程管理数据库。4.MySQL服务、MySQL服务进程、MySQL服务器分别是什么?什么是端口号?端口号有什么作用?(1)MySQL服务:指MySQL数据库的后台服务程序,用于监听客户端连接、处理SQL请求、管理数据存储等核心功能,是MySQL运行的基础;(2)MySQL服务进程:MySQL服务启动后在操作系统中生成的进程(Windows下为mysqld.exe),包括主进程(管理整个数据库)和子进程(处理客户端请求),进程运行期间服务才能正常提供服务;(3)MySQL服务器:广义上指运行MySQL服务的物理主机或虚拟主机,狭义上指MySQL服务程序及其对应的进程、配置文件、数据文件等的集合;(4)端口号:是操作系统分配给不同服务的数字标识(范围0-65535),用于区分同一主机上的不同服务;(5)端口号的作用:MySQL服务默认使用3306端口号,客户端连接时需指定端口号(默认可省略),确保客户端请求能准确传递到MySQL服务进程,避免与主机上其他服务(如HTTP服务的80端口)混淆。5.请列举my.ini配置文件中常用的参数选项组以及参数信息。my.ini是Windows下MySQL的核心配置文件,常用参数选项组及参数如下:(1)[mysql]参数选项组(作用于MySQL客户机程序mysql.exe):①port:指定客户机默认连接的服务器端口号(默认3306);②no_beep:客户机中输入错误SQL命令时,不发出报警声;③default_character_set:配置客户机连接服务器的默认字符集(如utf8mb4),影响character_set_client、character_set_connection、character_set_results三个会话变量;(2)[mysqld]参数选项组(作用于MySQL服务器程序mysqld.exe):①basedir:指定MySQL的安装目录(如“D:/mysql-9.2.0-winx64”);②datadir:指定MySQL的数据目录(用于存储数据库文件、日志文件等,如“D:/mysql-9.2.0-winx64/data”);③port:指定服务器监听的端口号(默认3306);④character_set_server:指定服务器的默认字符集(如utf8mb4),影响全局字符集变量,进而影响新建数据库和表的默认字符集;⑤innodb_file_per_table:控制InnoDB表的表空间模式(ON为独享表空间,OFF为共享表空间,MySQL5.6.6后默认ON)。6.启动MySQL服务的方法有哪些?停止MySQL服务的方法有哪些?(一)启动MySQL服务的方法:(1)CMD命令行启动:进入MySQL安装目录的bin目录,在地址栏输入CMD,执行“mysqld”命令,光标闪烁即表示启动成功;(2)Windows系统服务启动:通过“Win+R”打开运行窗口,输入“control”打开控制面板,依次进入“管理工具→服务”,找到MySQL服务,点击“启动”;(3)CMD命令启动系统服务:以管理员身份打开CMD,执行“netstartmysql”命令。(二)停止MySQL服务的方法:(1)关闭启动服务的CMD窗口:直接关闭执行“mysqld”命令的CMD窗口;(2)CMD命令停止服务:在CMD中按“Ctrl+C”组合键,或执行“netstopmysql”命令;(3)Windows系统服务停止:进入“服务”窗口,找到MySQL服务,点击“停止”。7.MySQL客户机连接MySQL服务器时,需提供哪些信息?客户机连接服务器需提供5类核心“校验信息”(连接参数):(1)合法的登录主机:客户机所在IP需在服务器白名单中(远程连接时需配置),本地连接可忽略;(2)合法的账户名及密码:如root账户,是身份认证的核心,不可省略;(3)MySQL服务器主机名或IP地址:指定连接的目标服务器,本地连接可使用localhost(主机名)或(本机IP),默认可省略;(4)端口号:指定服务器的监听端口(默认3306),若服务器端口非默认则必须手动指定(注意区分“-p”(密码)和“-P”(端口));(5)连接字符集:若存在中文字符,需指定字符集(如utf8mb4),避免乱码,可通过“--default-character-set=utf8mb4”参数设置。8.字符、字符集、字符序分别是什么?字符序的命名规则是什么?(1)字符:人类语言最小的表义符号(如“A”“中”);(2)字符编码:为每个字符赋予的唯一数值(如“A”对应65);(3)字符集:“字符+字符编码”的集合(如{'A'<=>65,'中'<=>E4B8AD}),用于定义可存储的字符范围;(4)字符序:同一字符集内字符的比较规则,用于排序和等值判断,一个字符集可对应多个字符序,且唯一对应一种字符集;(5)字符序命名规则:①前缀:对应字符集名称(如utf8mb4、gbk);②中间部分:国家名、general或Unicode规范(如chinese、general、0900);③后缀:ci(大小写不敏感)、cs(大小写敏感)、bin(按二进制编码比较,大小写敏感)。示例:utf8mb4_0900_ai_ci(utf8mb4字符集、Unicode9.0规范、不区分音调、大小写不敏感)、gbk_bin(gbk字符集、二进制比较)。9.哪些字符集支持中文简体字符?哪些字符集支持中文繁体字符?哪些字符集支持多国文字?(1)支持中文简体字符的字符集:gb2312、gbk、utf8mb3、utf8mb4;(2)支持中文繁体字符的字符集:big5、utf8mb3、utf8mb4;(3)支持多国文字的字符集:utf8mb3、utf8mb4(万国码字符集,可存储中文、英文、阿拉伯文、俄罗斯文等,utf8mb4还支持emoji表情)。补充说明:gb2312是gbk的子集,仅支持常用中文简体;gbk支持中文简体、日文和韩文;big5仅支持中文繁体;latin1(西欧字符集)不支持中文。10.简述MySQL注释有几种,有什么区别和注意事项。MySQL支持3种注释,区别及注意事项如下:(1)单行注释(两种):①格式1:#注释内容(注释范围至行尾);②格式2:--注释内容(注意“--”后需加空格,注释范围至行尾);③区别:格式1简洁,格式2兼容标准SQL;(2)多行注释:①格式:/*注释内容*/(可跨多行,适用于长注释);②区别:可跨行吗,不影响单行代码的可读性;(3)内联注释:①格式:/*!注释内容*/(可跨多行,特殊之处是注释中的代码可能被执行);②区别:支持版本指定(如/*!90000+1*/表示仅MySQL9及以上版本执行“+1”),兼容其他数据库(其他数据库视为普通注释);(4)注意事项:①单行注释的“--”后必须加空格,否则语法错误;②内联注释属于命令,需以“;”结束;③注释不可嵌套(如多行注释内不能再包含/**/)。11.MySQL系统数据库有哪些?这些系统数据库有什么作用?MySQL自带4个核心系统数据库,作用如下:(1)mysql:存储MySQL账户信息(用户名、密码)、访问权限等,用于身份认证和权限验证,防止非法越权操作;(2)performance_schema:存储服务器性能相关数据(如进程状态、资源占用),帮助DBA定位性能瓶颈;(3)information_schema:存储数据库对象的元数据(如数据库名、表名、字段类型、索引信息等),相当于“数据字典”,用于查询数据库对象结构;(4)sys:以视图形式整合performance_schema和information_schema的数据,简化性能分析和元数据查询,面向开发人员和DBA。注意:系统数据库由MySQL自动维护,普通用户禁止手动修改,否则可能导致服务器异常。12.如果仅需要在数据库中存储中文简体字符,那么如何设置MySQL字符集?仅存储中文简体字符时,推荐使用gbk或utf8mb4字符集(gbk更节省空间,utf8mb4兼容更广),具体设置步骤如下:(1)修改my.ini配置文件(Windows):①[mysql]选项组添加:default_character_set="gbk"(或utf8mb4),确保客户机连接字符集适配;②[mysqld]选项组添加:character_set_server="gbk"(或utf8mb4),确保服务器默认字符集适配;③补充配置:basedir(安装目录)、datadir(数据目录)需正确配置;(2)重启MySQL服务:配置修改后需重启服务才能生效;(3)客户机连接设置:连接时指定字符集,如“mysql--default-character-set=gbk-uroot-p”;(4)新建数据库/表时设置:创建时显式指定字符集(可选,因配置已默认),示例:createdatabasetestcharset=gbk;createtablestudent(namechar(10))charset=gbk;注意:若后续可能存储多国文字或emoji,直接使用utf8mb4字符集,避免后续修改字符集的麻烦。13.编写一段SQL脚本文件,并运行该脚本文件中的代码。(1)SQL脚本文件内容(命名为init.sql,存储路径:D:/init.sql,无中文路径):sql

--初始化数据库(含姓名全拼标识,如zhangsan)

dropdatabaseifexiststest_zhangsan;--若数据库存在则删除

createdatabaseifnotexiststest_zhangsancharset=utf8mb4;--创建数据库,字符集utf8mb4

usetest_zhangsan;--打开数据库

--创建表(含姓名全拼标识)

createtablestudent_zhangsan(

idint,

namechar(20),

genderchar(2),

birthdaydate

)engine=InnoDBcharset=utf8mb4;--存储引擎InnoDB,字符集utf8mb4

--插入测试数据(含姓名最后一个字符“三”)

insertintostudent_zhangsanvalues(1,'张三','男','2000-01-01');

insertintostudent_zhangsanvalues(2,'李四','女','2000-02-02');

--查询表记录

select*fromstudent_zhangsan;

--修改表记录

updatestudent_zhangsansetgender='男'wherename='李四';

--再次查询验证修改结果

select*fromstudent_zhangsan;(2)运行脚本文件的步骤:①准备工作:确保MySQL服务已启动,脚本文件路径无中文;②打开客户机:以管理员身份进入MySQL的bin目录,打开CMD,执行“mysql--default-character-set=utf8mb4-uroot-p”,输入密码登录;③运行脚本:在客户机中执行命令“\.D:/init.sql”或“sourceD:/init.sql”(注意命令后不加“;”);(3)注意事项:若脚本含中文字符,需确保脚本文件编码(如UTF-8)与客户机连接字符集一致,避免乱码。14.您所熟知的存储引擎有哪些?MyISAM存储引擎与InnoDB存储引擎相比,您更喜欢哪一个?它们都有什么特点?(1)常见存储引擎:InnoDB、MyISAM、MEMORY、CSV、ARCHIVE等(MySQL支持多种,可通过“showengines;”查看);(2)偏好选择:更偏好InnoDB(适用于绝大多数业务场景,尤其是需要事务和并发控制的场景);(3)MyISAM与InnoDB的特点对比:①MyISAM特点:-不支持事务和外键约束,设计简单;-支持表级锁,并发性能较差(写操作会阻塞读操作);-存储文件分为MYD(数据文件)、MYI(索引文件)、SDI(元数据文件),易备份;-查询速度快,适合只读或读写频率低的场景(如静态网站数据);②InnoDB特点:-支持事务(ACID特性)、外键约束和行级锁,并发性能好;-支持共享表空间和独享表空间(默认独享,文件为.ibd);-具备崩溃恢复能力,数据安全性高;-支持MVCC(多版本并发控制),适合高并发读写场景(如电商、金融系统);-查询速度略低于MyISAM,但综合性能更优。15.创建student数据库,并在该数据库中创建student表,用于保存您的个人信息(如姓名、性别、身份证号、出生日期等),并完成下列操作或问题。(1)上述的student表有没有出现数据冗余现象?(提示:性别和出生日期可以由身份证号推算得出)存在数据冗余。原因:身份证号中已包含性别(第17位:奇数为男,偶数为女)和出生日期(第7-14位)信息,若表中同时存储“性别”“出生日期”和“身份证号”字段,当身份证号确定时,性别和出生日期无需重复存储,重复存储的字段会导致数据冗余,增加存储成本且可能出现数据不一致(如身份证号修改后,性别未同步修改)。(2)student数据库目录存放在数据目录中,什么是根目录,什么是数据目录?①根目录:指MySQL的安装根目录,即解压或安装时指定的核心目录(如“D:/mysql-9.2.0-winx64”),包含bin(执行文件)、share(字符集文件)等子目录及my.ini配置文件;②数据目录:用于存储MySQL的所有数据文件(含系统数据库、用户数据库、日志文件等),默认位于根目录下的data子目录(可通过my.ini的datadir参数自定义,如“D:/mysql-9.2.0-winx64/data”);用户创建的student数据库目录(student文件夹)会直接存放在数据目录中,用于存储该数据库的表文件等。(3)使用哪个命令可以查看student数据库的字符集?命令:showcreatedatabasestudent;(执行后会显示数据库的创建语句,包含字符集信息,如“DEFAULTCHARSET=utf8mb4”)。(4)使用哪个命令可以查看student表的结构(字符集、字符序、存储引擎等信息)?(1)查看表结构概括信息(字段、类型等):descstudent;或describestudent;或showcolumnsfromstudent;(2)查看详细信息(含字符集、字符序、存储引擎):showcreatetablestudent;(执行结果会显示表的创建语句,包含engine(存储引擎)、charset(字符集)、collate(字符序)等信息)。(5)student数据库目录中存放了哪些文件?根目录中存放了哪些文件?①student数据库目录(数据目录下的student文件夹)中的文件(以InnoDB存储引擎为例):-若为MySQL8+/9+:student.ibd(独享表空间文件,存储表记录和索引)、student_xxx.sdi(SDI文件,存储表元数据);-若为MySQL5.7及以下:student.frm(表结构文件)、student.ibd(数据和索引文件);②MySQL根目录中的核心文件/目录:-目录:bin(执行文件,如mysqld.exe、mysql.exe)、data(默认数据目录)、share(字符集、帮助文档等);-文件:my.ini(配置文件)、README(说明文档)等。(6)将个人信息添加到student表中,并查询student表的所有记录。(1)创建数据库和表的SQL语句(含个人信息字段):sql

--创建student数据库(字符集utf8mb4)

createdatabaseifnotexistsstudentcharset=utf8mb4;

usestudent;

--创建student表

createtablestudent(

idintprimarykeyauto_increment,--主键自增

namechar(20)notnull,--姓名

genderchar(2),--性别

id_cardchar(18)uniquenotnull,--身份证号(唯一约束)

birthdaydate--出生日期

)engine=InnoDBcharset=utf8mb4;

--插入个人信息(示例数据)

insertintostudent(name,gender,id_card,birthday)

values('张三','男',,'2000-01-01');

--查询所有记录

select*fromstudent;(2)查询结果(示例):+----+--------+--------+--------------------+------------+|id|name|gender|id_card|birthday|+----+--------+--------+--------------------+------------+|1|张三|男2000-01-01|+----+--------+--------+--------------------+------------+(7)在上一步骤的查询结果中是否出现了乱码?如果出现了乱码,如何避免乱码问题的发生?如果没有出现乱码,经过哪些设置可以产生乱码?(1)默认无乱码(前提:按步骤12设置了字符集);(2)产生乱码的设置(破坏字符集一致性):①修改my.ini配置:将[mysqld]的character_set_server改为latin1,[mysql]的default_character_set改为gbk,重启服务;②客户机连接时指定错误字符集:执行“mysql--default-character-set=latin1-uroot-p”登录,插入中文数据后查询;③会话变量修改:登录后执行“setcharacter_set_results=gbk;”(假设表字符集为utf8mb4),再查询中文数据;(3)避免乱码的核心步骤:①配置my.ini:[mysqld]和[mysql]的字符集统一为utf8mb4(或gbk);②客户机连接字符集与配置一致:使用“--default-character-set=utf8mb4”;③数据库/表创建时显式指定字符集:确保与配置一致;④若使用CMD客户机,执行“chcp65001”切换为UTF-8编码。(8)您的个人信息存放到了哪个表空间文件中?个人信息存储在InnoDB的独享表空间文件中,路径为“MySQL数据目录/student/student.ibd”。原因:MySQL5.6.6后默认开启独享表空间(innodb_file_per_table=ON),新建的InnoDB表会生成独立的.ibd文件,专门存储该表的数据和索引;若关闭独享表空间(设置为OFF),则存储在共享表空间文件ibdata1中(位于数据目录根目录)。(9)如何修改student表的存储引擎?修改student表的存储引擎后,您的个人信息存放到了哪个文件中?(1)修改存储引擎的SQL命令(以InnoDB改为MyISAM为例):usestudent;--打开数据库altertablestudentengine=MyISAM;--修改为MyISAM引擎(2)修改后的数据存储文件:-若改为MyISAM:个人信息存储在student.MYD(数据文件)和student.MYI(索引文件)中(位于student数据库目录);-若改为InnoDB(从MyISAM改回):存储在student.ibd(独享表空间文件)中;注意:修改存储引擎会重构表结构和数据,海量数据场景下耗时较长,且MyISAM不支持事务和外键,需谨慎操作。(10)删除student表。SQL命令:usestudent;--打开数据库droptableifexistsstudent;--安全删除表(若存在则删除)说明:删除表后,对应的表文件(如.ibd、.MYD、.MYI等)会被自动删除,表数据和结构全部丢失,不可恢复。(11)删除student数据库。SQL命令:dropdatabaseifexistsstudent;--安全删除数据库(若存在则删除)说明:删除数据库后,对应的数据库目录(student文件夹)及所有表文件会被自动删除,整个数据库的所有数据全部丢失,不可恢复。16.您所熟知的系统变量有哪些?如何查看系统变量的值?如何修改系统变量的值?修改系统变量的值时,有哪些注意事项?(1)常见系统变量(按类型分类):①全局系统变量(影响所有会话):basedir(安装目录)、datadir(数据目录)、port(端口号)、character_set_server(服务器字符集)、innodb_file_per_table(表空间模式);②会话系统变量(仅影响当前会话):character_set_client(客户机字符集)、character_set_connection(连接字符集)、character_set_results(结果字符集)、autocommit(自动提交)、last_insert_id(最后插入ID);(2)查看系统变量的值:①查看所有全局变量:showglobalvariables;(global不可省略);②查看所有会话变量:showsessionvariables;或showvariables;(session可省略);③模糊查询变量(如字符集相关):showglobalvariableslike'%character%';(%为通配符);(3)修改系统变量的值:①修改全局变量(需权限,影响新会话):setglobal变量名=值;(如setglobalinnodb_file_per_table=OFF;);②修改会话变量(仅当前会话有效):setsession变量名=值;或set变量名=值;(如setcharacter_set_results=utf8mb4;);③持久化修改全局变量(MySQL8.0+):setpersist变量名=值;(修改后重启服务仍生效,会生成f文件);(4)注意事项:①全局变量修改后,对已存在的会话无效,仅影响新会话;②部分变量为“静态变量”(如log_bin、datadir、error_count),不可在线修改,需修改my.ini后重启服务;③修改全局变量需具备super权限(如root账户);④建议修改前备份配置文件,避免配置错误导致服务启动失败;⑤变量名大小写不敏感,但推荐小写(符合MySQL命名规范)。17.阅读MySQL官方文档/doc/refman/9.2/en/charset-connection.html,将其翻译成中文。(注:以下为文档核心内容的翻译,完整翻译需覆盖全文细节,此处提炼关键章节)标题:字符集与连接###1.连接字符集和排序规则当客户端连接MySQL服务器时,会涉及多个字符集和排序规则相关的系统变量,这些变量决定了客户端与服务器之间的字符编码转换逻辑。核心变量包括character_set_client、character_set_connection、character_set_results,以及对应的排序规则变量collation_connection等。###2.连接字符集的作用流程(1)客户端发送SQL语句时,使用character_set_client指定的字符集编码;(2)服务器接收SQL语句后,将其从character_set_client转换为character_set_connection指定的字符集;(3)服务器执行SQL语句时,若操作的数据库或表有明确的字符集,则使用该字符集(优先于connection字符集);(4)服务器将执行结果(如查询数据)从操作对象的字符集转换为character_set_results指定的字符集,再返回给客户端。###3.设置连接字符集的方法(1)通过配置文件:在my.ini的[mysql]选项组中设置default_character_set,统一指定客户端连接的字符集;(2)通过连接参数:客户端连接时使用--default-character-set参数(如mysql--default-character-set=utf8mb4-uroot-p);(3)通过SQL命令:连接后执行setnames字符集;(如setnamesutf8mb4),该命令会同时设置client、connection、results三个变量的字符集;(4)通过初始化命令:执行setcharacter_set_client=值;、setcharacter_set_connection=值;、setcharacter_set_results=值;,分别单独设置。###4.连接排序规则的设置连接排序规则由collation_connection变量控制,其默认值由character_set_connection的默认排序规则决定。可通过setcollation_connection=排序规则;(如setcollation_connection=utf8mb4_0900_ai_ci)手动修改,用于控制当前会话中字符比较和排序的规则。###5.常见问题与注意事项(1)若client、connection、results的字符集不一致,可能导致SQL语句中的中文字符解析错误或查询结果乱码;(2)setnames命令仅影响当前会话,重启客户端后失效;若需永久生效,需修改配置文件;(3)对于支持多字节字符的字符集(如utf8mb4),需确保客户端和服务器的字符集配置一致,避免因字节长度解析错误导致数据截断或乱码;(4)collation_connection仅影响当前会话的字符比较逻辑,不影响数据库或表的默认排序规则。

第3章习题答案习题1答案一、MySQL数据类型分类(参考3.1节):2.数值类型:包含整数类型(tinyint、smallint、mediumint、int、bigint)和小数类型(精确小数decimal、单精度浮点数float、双精度浮点数double);3.字符串类型:char(n)、varchar(n)、tinytext、text、mediumtext、longtext;4.日期类型:date(日期)、time(时间)、year(年份)、datetime(日期时间)、timestamp(时间戳);5.布尔类型:仅含true和false两个取值,大小写不敏感,显示时true转1、false转0;2.特殊说明:null严格来说是“空值/未知值”常量(非数据类型),但可适配所有数据类型,常被归为一类讨论。二、数据类型选择原则(参考3.1.7节):3.满足应用需求(取值范围、精度)的前提下,优先选“短”数据类型,减少存储和计算开销;4.主键优先选整数类型,避免字符串(整数处理开销小,检索效率高,如IP地址可通过函数转整数存储);5.不允许误差时用精确小数decimal(如财务计算),对精度要求低用float(如经纬度),需高精度大范围用double;6.存储日期时间优先用日期类型(本质是数值,支持运算),而非字符串类型;7.尽量避免字段取null,建议设非空约束(notnull),可用0、特殊值或空字符串替代(null会增加索引统计和查询优化难度)。习题2答案char(n)(定长字符串)与varchar(n)(变长字符串)的核心区别(参考3.1.3节):2.存储方式不同:char(n)固定占用n个字符的存储空间,无论实际存储内容长度;varchar(n)仅占用内容实际长度的存储空间(忽略额外开销);3.存储空间开销:例如存储单个“中”字,char(255)需占用255个字符空间,varchar(255)仅占用1个字符空间;4.n的最大值限制:char(n)的n最大值固定为255(与字符集无关);varchar(n)的n最大值与字符集相关(如gbk下最大32767,utf8下最大21845);2.适用场景:char(n)适合长度固定的字符串(如身份证号、手机号);varchar(n)适合长度不固定的字符串(如姓名、地址)。习题3答案一、对null的理解(参考3.1.6节):null表示“空值”“未知值”“值不确定”或“值不存在”,大小写不敏感。它不是数据类型,而是一种常量/约束,但可适配所有数据类型(即任何类型的字段都可取值为null)。核心特点是“不确定性”——任何数据与null进行算术、比较或逻辑运算,结果均为null。二、null的使用注意事项:3.null与null比较无意义:null=null和null!=null的结果均为null,需用isnull(判断是否为null)或isnotnull(判断是否非null)运算符;4.避免字段默认取null:含null的列难以查询优化,会增加索引统计复杂度,建议用非空约束(notnull)+替代值(0、空字符串等);5.注意约束兼容性:默认值约束字段可取值为null(录入null时会覆盖默认值),需明确业务是否允许字段为null;2.计算场景规避null:涉及统计(如sum、avg)或算术运算时,需先用ifnull()函数将null转换为有效数值(如ifnull(score,0)),避免结果异常。习题4答案一、选课系统5个表的表结构与父子关系(参考3.2、3.6节及温馨提示1):1.核心表结构(关键字段+约束):3.classes(班级表):主键class_no(自增整数),字段含className等,非空/唯一性约束;4.student(学生表):主键student_no(如11位字符),外键class_no(参照classes.class_no),字段含student_name(非空)等;5.teacher(教师表):主键teacher_no,字段含teacher_name(非空)、subject等;6.course(课程表):主键course_no,外键teacher_no(参照teacher.teacher_no),字段含course_name(唯一)、capacity(默认值等);7.choose(选课表):复合主键(student_no,course_no),外键student_no(参照student.student_no)、外键course_no(参照course.course_no),字段含score(无符号小数/整数)等。2.父子关系(外键参照决定):2.classes(父表)→student(子表):一个班级包含多个学生,删除/更新班级需考虑级联规则;3.te

温馨提示

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

评论

0/150

提交评论