MySQL基础教程.ppt

上传人:博****1 文档编号:575221849 上传时间:2024-08-17 格式:PPT 页数:716 大小:7.63MB
返回 下载 相关 举报
MySQL基础教程.ppt_第1页
第1页 / 共716页
MySQL基础教程.ppt_第2页
第2页 / 共716页
MySQL基础教程.ppt_第3页
第3页 / 共716页
MySQL基础教程.ppt_第4页
第4页 / 共716页
MySQL基础教程.ppt_第5页
第5页 / 共716页
点击查看更多>>
资源描述

《MySQL基础教程.ppt》由会员分享,可在线阅读,更多相关《MySQL基础教程.ppt(716页珍藏版)》请在金锄头文库上搜索。

1、MySQL基础教程基础教程适合新手,适合老手!适合新手,适合老手!孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之数据库设计概述数据库设计概述1 12 23 3 本章抛开本章抛开MySQLMySQL讲讲解关系数据库设计的解关系数据库设计的相关知识,以相关知识,以“选课选课系统系统”为例,讲解为例,讲解“选课系统选课系统”数据库的数据库的设计流程。设计流程。 4 4内容一览内容一览 数据库设计的相关知识数据库设计的相关知识数据库概述数据库概述 E-RE-R图图关系数据库设计关系数据库设计1 12 23 3 简单地说:数据简单地说:数据库(库(DatabaseData

2、base或或DBDB)是)是存储、管理数据的容器;存储、管理数据的容器; 严格地说:数据严格地说:数据库是库是“按照某种数据结构按照某种数据结构对数据进行组织、存储和对数据进行组织、存储和管理的容器管理的容器”。 总结:数据永远是总结:数据永远是数据库的核心。数据库的核心。关系数据库关系数据库关系数据库管理系统关系数据库管理系统结构化查询语言结构化查询语言SQLSQL1.1 1.1 数据库概述数据库概述 MySQL数据库基础与实例教程数据库基础与实例教程1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统 通过通过“数据库管理系统数据库管理系统”,数据库用,数据库用户可以轻松地实现数据

3、库容器中各种数据库户可以轻松地实现数据库容器中各种数据库对象的访问(增、删、改、查等操作),并对象的访问(增、删、改、查等操作),并可以轻松地完成数据库的维护工作(备份、可以轻松地完成数据库的维护工作(备份、恢复、修复等操作)恢复、修复等操作)MySQL数据库基础与实例教程数据库基础与实例教程 数据库用户无法直接通过操作系统获取数据库用户无法直接通过操作系统获取数据库文件中的具体内容;数据库文件中的具体内容; 数据库管理系统通过调用操作系统的进数据库管理系统通过调用操作系统的进程管理、内存管理、设备管理以及文件管理程管理、内存管理、设备管理以及文件管理等服务,为数据库用户提供管理、控制数据等服

4、务,为数据库用户提供管理、控制数据库容器中各种数据库对象、数据库文件的接库容器中各种数据库对象、数据库文件的接口。口。1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统添加标题添加标题添添加加标标题题层次模型层次模型面向对象模型面向对象模型网状模型网状模型关系模型关系模型数据库管理数据库管理系统常用的系统常用的数学模型数学模型 MySQL数据库基础与实例教程数据库基础与实例教程添加标题添加标题 基于基于“关系模型关系模型”的数据库管理系统称为关系数据库的数据库管理系统称为关系数据库管理系统(简称为管理系统(简称为RDBMSRDBMS)。随着关系数据库管理系统的)。随着关系数据库管理系

5、统的日臻完善,目前关系数据库管理系统已占据主导地位。日臻完善,目前关系数据库管理系统已占据主导地位。1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统https:/ 2月数据库流行度排行榜月数据库流行度排行榜截至目前,截至目前,MySQLMySQL已经成功逆袭!已经成功逆袭!1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统MySQL数据库基础与实例教程数据库基础与实例教程20142014年年3 3月数据库流行度排行榜月数据库流行度排行榜1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统MySQL数据库基础与实例教程数据库基础与实例教程20142014年年4 4月

6、数据库流行度排行榜月数据库流行度排行榜1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统MySQL数据库基础与实例教程数据库基础与实例教程开源开源MySQLMySQL源代源代码免费下载码免费下载简单简单MySQLMySQL体积体积小小,便于安,便于安装装MySQLMySQL性能性能足够与商业足够与商业数据库媲美数据库媲美功能强大功能强大MySQLMySQL提供提供的功能足够的功能足够与商业数据与商业数据库媲美库媲美逆逆袭袭原原因因性能优越性能优越1.1.1 1.1.1 关系数据库管理系统关系数据库管理系统MySQL数据库基础与实例教程数据库基础与实例教程 关系数据库中所谓的关系数据库

7、中所谓的“关系关系”,实质上是一,实质上是一张二维表。请看下面的课程表。张二维表。请看下面的课程表。字段名(列名)字段名(列名)第第1 1个字段(列)个字段(列)第第1 1条记录条记录第第2 2条记录条记录第第3 3条记录条记录第第4 4条记录条记录第第5 5条记录条记录第第3 3个字段(列)个字段(列)第第2 2个字段(列)个字段(列)第第4 4个字段(列)个字段(列)1.1.2 1.1.2 关系数据库关系数据库MySQL数据库基础与实例教程数据库基础与实例教程 作为数据库中最为重要的数据库对象,数据作为数据库中最为重要的数据库对象,数据库表的设计过程库表的设计过程并非一蹴而就并非一蹴而就,

8、上述课程表根本,上述课程表根本无法满足无法满足“选课系统选课系统”的功能需求。的功能需求。 事实上,数据库表的设计过程并非如此简单,事实上,数据库表的设计过程并非如此简单,本章的重点就是讨论如何设计结构良好的数据库本章的重点就是讨论如何设计结构良好的数据库表。表。1.1.2 1.1.2 关系数据库关系数据库MySQL数据库基础与实例教程数据库基础与实例教程 结构化查询语言(结构化查询语言(Structured Query Structured Query LanguageLanguage或简称为或简称为SQLSQL)是一种应用最为广泛的关)是一种应用最为广泛的关系数据库语言,该语言定义了操作关

9、系数据库的系数据库语言,该语言定义了操作关系数据库的标准语法,几乎所有的关系数据库管理系统都支标准语法,几乎所有的关系数据库管理系统都支持持SQLSQL。1.1.3 1.1.3 结构化查询语言结构化查询语言SQL SQL MySQL数据库基础与实例教程数据库基础与实例教程学习重点学习重点1 12 23 3 数据库设计是一个数据库设计是一个“系系统工程统工程”,要求数据库开发,要求数据库开发人员:人员: 熟悉熟悉“商业领域商业领域”的商的商业知识。业知识。 利用利用“管理学管理学”的知识的知识与其他开发人员进行有效沟与其他开发人员进行有效沟通。通。 掌握一些数据库设计辅掌握一些数据库设计辅助工具

10、。助工具。数据库设计辅助工具数据库设计辅助工具商业知识和沟通技能商业知识和沟通技能“选课系统选课系统”概述概述4 45 5定义问题域定义问题域编码规范编码规范1.2 1.2 数据库设计的相关知识数据库设计的相关知识MySQL数据库基础与实例教程数据库基础与实例教程 数据库技术解决的是数据库技术解决的是“商业领域商业领域”的的“商业问题商业问题”。 数据库开发人员有必要成为该数据库开发人员有必要成为该“商业领商业领域域”的专家,与其他开发人员(包括最终用的专家,与其他开发人员(包括最终用户)一起工作,继而使用数据库技术解决该户)一起工作,继而使用数据库技术解决该“商业领域商业领域”的的“商业问题

11、商业问题” 。1.2.1 1.2.1 商业知识和沟通技能商业知识和沟通技能MySQL数据库基础与实例教程数据库基础与实例教程1.2.2 1.2.2 数据库设计辅助工具数据库设计辅助工具工具工具模型模型技术技术业务模型业务模型面向对象分析和设计技术面向对象分析和设计技术结构化分析和设计技术结构化分析和设计技术软件测试技术软件测试技术关系数据库设计技术关系数据库设计技术 ErwinErwinPowerDesignerPowerDesignerRational RoseRational RoseVisio Visio VC+6.0VC+6.0Visual studioVisual studioEcl

12、ipseEclipseNetBeansNetBeans 单元测试工具单元测试工具功能测试工具功能测试工具性能测试性能测试 工具工具程序流程图程序流程图 DFD DFD 时序图时序图 状态图状态图CASECASE工具工具IDEIDE工具工具测试工具测试工具数据模型数据模型类图类图E-RE-R图图MySQL数据库基础与实例教程数据库基础与实例教程 限于篇幅,在不限于篇幅,在不影响影响“选课系统选课系统”核核心功能的基础上,适心功能的基础上,适当地对该系统进行当地对该系统进行“定制定制”、“扩展扩展”以以及及“瘦身瘦身”。 1.2.3 1.2.3 “选课系统选课系统”概述概述MySQL数据库基础与实

13、例教程数据库基础与实例教程 定义问题域是数定义问题域是数据库设计过程中重要据库设计过程中重要的活动,它的目标是的活动,它的目标是准确定义要解决的商准确定义要解决的商业问题。业问题。 “选课系统选课系统”亟亟需解决的需解决的“商业商业”问问题有哪些?题有哪些?1.2.4 1.2.4 定义问题域定义问题域MySQL数据库基础与实例教程数据库基础与实例教程 在编程的时候会考虑代码的可读性吗?你觉在编程的时候会考虑代码的可读性吗?你觉得代码可读性是需要考虑的问题吗?得代码可读性是需要考虑的问题吗?1. 1. 代码不仅要自己能读懂,还要别人也能看懂代码不仅要自己能读懂,还要别人也能看懂?2. 2. 尽量

14、做到可读,但时间紧任务重的时候就顾尽量做到可读,但时间紧任务重的时候就顾不上了?不上了?3. 3. 代码只要自己能读懂就可以了?代码只要自己能读懂就可以了?4. 4. 代码写完就完了,不用管以后是否能读懂?代码写完就完了,不用管以后是否能读懂?5. 5. 不知道,没有想过这个问题?不知道,没有想过这个问题?1.2.5 1.2.5 编码规范编码规范 请记住:尽最大请记住:尽最大努力把方便留给别努力把方便留给别人和将来的自己。人和将来的自己。 建议大家遵循本建议大家遵循本书罗列的常用编程书罗列的常用编程规范!规范!1 12 23 3关系关系实体和属性实体和属性E-RE-R图的设计原则图的设计原则

15、E-R图设计的质量直接决定了关系数据库设计的质量。 1.3 E-R1.3 E-R图图MySQL数据库基础与实例教程数据库基础与实例教程 实体不是某一个具实体不是某一个具体事物,而是某一种类体事物,而是某一种类别所有事物的统称。别所有事物的统称。 属性通常用于表示属性通常用于表示实体的某种特征,也可实体的某种特征,也可以使用属性表示实体间以使用属性表示实体间关系的特征关系的特征实体实体属性属性属性属性1.3.11.3.1 实体和属性实体和属性MySQL数据库基础与实例教程数据库基础与实例教程 E-R E-R图中的关系用于图中的关系用于表示实体间存在的联系,表示实体间存在的联系,在在E-RE-R图

16、中,实体间的关图中,实体间的关系通常使用一条线段表系通常使用一条线段表示。示。 E-R E-R图中实体间的关图中实体间的关系是双向的。系是双向的。关系关系关系关系1.3.21.3.2 关系关系MySQL数据库基础与实例教程数据库基础与实例教程 基数表示一个实体基数表示一个实体到另一个实体之间关联到另一个实体之间关联的数目,基数是针对关的数目,基数是针对关系之间的某个方向提出系之间的某个方向提出的概念,基数可以是一的概念,基数可以是一个取值范围,也可以是个取值范围,也可以是某个具体数值某个具体数值基数基数可选可选基数基数强制强制1.3.21.3.2 关系关系MySQL数据库基础与实例教程数据库基

17、础与实例教程 元表示关系所关联元表示关系所关联的实体个数的实体个数。二元关系二元关系二元关系二元关系一元关系一元关系1.3.21.3.2 关系关系MySQL数据库基础与实例教程数据库基础与实例教程 使用关联使用关联(AssociationAssociation)表示实体)表示实体间关系的间关系的属性。属性。关联关联关联关联1.3.21.3.2 关系关系MySQL数据库基础与实例教程数据库基础与实例教程1 12 23 3实体是一个单独的个体,不能存实体是一个单独的个体,不能存在于另一个实体中,成为另一个在于另一个实体中,成为另一个实体的属性。实体的属性。属性应该存在于、且只存在于某属性应该存在于

18、、且只存在于某一个地方(实体或者关联)。一个地方(实体或者关联)。同一个实体在同一个同一个实体在同一个E-RE-R图内,仅图内,仅出现一次。出现一次。 数据库开发人数据库开发人员通常采用员通常采用“一事一事一地一地”的原则从系的原则从系统的功能描述中抽统的功能描述中抽象出来象出来E-RE-R图。图。1.3.3 E-R1.3.3 E-R图的设计原则图的设计原则1 1为为E-RE-R图中的每个实体建立一张表。图中的每个实体建立一张表。2 2为每张表定义一个主键(如果需要,可以向表为每张表定义一个主键(如果需要,可以向表添加一个没有实际意义的字段作为该表的主键)添加一个没有实际意义的字段作为该表的主

19、键)3 3增加外键表示一对多关系。增加外键表示一对多关系。4 4建立新表表示多对多关系。建立新表表示多对多关系。5 5为字段选择合适的数据类型。为字段选择合适的数据类型。6 6定义约束条件(如果需要)。定义约束条件(如果需要)。7 7评价关系的质量,并进行必要的改进。评价关系的质量,并进行必要的改进。1.4 1.4 关系数据库设计关系数据库设计MySQL数据库基础与实例教程数据库基础与实例教程student(student(student_nostudent_no,student_name,student_contact,student_name,student_contact)course(

20、course(course_namecourse_name,up_limit,description,status,up_limit,description,status) )teacher(teacher(teacher_noteacher_no,teacher_name,teacher_contact,teacher_name,teacher_contact) )classes(classes(class_nameclass_name,department_name,department_name) )1.4.1 1.4.1 为每个实体建立一张数据库表为每个实体建立一张数据库表MySQL数

21、据库基础与实例教程数据库基础与实例教程关键字(关键字(keykey):用以唯一标识表中的每行记录。):用以唯一标识表中的每行记录。主键(主键(Primary KeyPrimary Key):在所有的关键字中选择一):在所有的关键字中选择一个关键字,作为该表的主关键字,简称主键。个关键字,作为该表的主关键字,简称主键。1.4.2 1.4.2 为每张表定义一个主键为每张表定义一个主键MySQL数据库基础与实例教程数据库基础与实例教程主键有以下两个特征:主键有以下两个特征: (1 1)表的主键可以是一个字段,也可以是多)表的主键可以是一个字段,也可以是多个字段的组合(这种情况称为复合主键)。个字段的

22、组合(这种情况称为复合主键)。 (2 2)表中主键的值具有唯一性且不能取空值)表中主键的值具有唯一性且不能取空值(NULLNULL);当表中的主键由多个字段构成时,);当表中的主键由多个字段构成时,每个字段的值都不能取每个字段的值都不能取NULLNULL。 主键设计技巧,请参看本书内容。主键设计技巧,请参看本书内容。1.4.2 1.4.2 为每张表定义一个主键为每张表定义一个主键MySQL数据库基础与实例教程数据库基础与实例教程student(student(student_nostudent_no,student_name,student_contact,student_name,stude

23、nt_contact)course(course(course_nocourse_no,course_name,up_limit,description,status,course_name,up_limit,description,status) )teacher(teacher(teacher_noteacher_no,teacher_name,teacher_contact,teacher_name,teacher_contact) )classes(classes(class_noclass_no,class_name,department_name,class_name,depart

24、ment_name) )1.4.2 1.4.2 为每张表定义一个主键为每张表定义一个主键MySQL数据库基础与实例教程数据库基础与实例教程 外键(外键(Foreign KeyForeign Key):如果表):如果表A A中的一个字中的一个字段段a a对应于表对应于表B B的主键的主键b b,则字段,则字段a a称为表称为表A A的外键,的外键,此时存储在表此时存储在表A A中字段中字段a a的值,要么是的值,要么是NULLNULL,要么,要么是来自于表是来自于表B B主键主键b b的值。的值。1.4.3 1.4.3 增加外键表示一对多关系增加外键表示一对多关系MySQL数据库基础与实例教程数

25、据库基础与实例教程 情形一:如果实体间的关系为一对多关系,情形一:如果实体间的关系为一对多关系,则需要将则需要将“一一”端实体的主键放到端实体的主键放到“多多”端实体端实体中,然后作为中,然后作为“多多”端实体的外键,通过该外键端实体的外键,通过该外键即可表示实体间的一对多关系。即可表示实体间的一对多关系。1.4.3 1.4.3 增加外键表示一对多关系增加外键表示一对多关系MySQL数据库基础与实例教程数据库基础与实例教程 让学生记住所在班级,让学生记住所在班级,远比班级远比班级“记住记住”所有学生所有学生容易的多容易的多 。1.4.3 1.4.3 增加外键表示一对多关系增加外键表示一对多关系

26、MySQL数据库基础与实例教程数据库基础与实例教程 情形二:实体间的一对一关系,可以看成一情形二:实体间的一对一关系,可以看成一种特殊的一对多关系:将种特殊的一对多关系:将“一一”端实体的主键放端实体的主键放到另到另“一一”端的实体中,并作为另端的实体中,并作为另“一一”端的实端的实体的外键,然后将外键定义为唯一性约束体的外键,然后将外键定义为唯一性约束(Unique ConstraintUnique Constraint)。)。1.4.3 1.4.3 增加外键表示一对多关系增加外键表示一对多关系MySQL数据库基础与实例教程数据库基础与实例教程PKPK1.4.3 1.4.3 增加外键表示一对

27、多关系增加外键表示一对多关系MySQL数据库基础与实例教程数据库基础与实例教程PKPK后的方案:后的方案:student(student(student_nostudent_no,student_name,student_name, ,student_contact,class_nostudent_contact,class_no) )course(course(course_nocourse_no,course_name,up_limit,course_name,up_limit, ,description,status,description,status,teacher_noteache

28、r_no) )teacher(teacher(teacher_noteacher_no,teacher_name,teacher_contact,teacher_name,teacher_contact) )classes(classes(class_noclass_no,class_name,department_name,class_name,department_name) )1.4.3 1.4.3 增加外键表示一对多关系增加外键表示一对多关系MySQL数据库基础与实例教程数据库基础与实例教程 情形三:如果两个实体间的关系为多对多关情形三:如果两个实体间的关系为多对多关系,则需要添加新表

29、表示该多对多关系,然后将系,则需要添加新表表示该多对多关系,然后将该关系涉及到的实体的该关系涉及到的实体的“主键主键”分别放入到新表分别放入到新表中(作为新表的外键),并将关系自身的属性放中(作为新表的外键),并将关系自身的属性放入到新表中作为新表的字段。入到新表中作为新表的字段。1.4.4 1.4.4 建立新表表示多对多关系建立新表表示多对多关系MySQL数据库基础与实例教程数据库基础与实例教程teacher(teacher_no,teacher_nameteacher(teacher_no,teacher_name, ,teacher_contactteacher_contact) )cl

30、asses(class_no,class_name,department_nameclasses(class_no,class_name,department_name) )course(course_no,course_name,up_limitcourse(course_no,course_name,up_limit, ,description,status,teacher_nodescription,status,teacher_no) )student(student_no,student_namestudent(student_no,student_name, ,student_co

31、ntact,class_nostudent_contact,class_no) )choose(choose_no,student_no,course_no,score,chochoose(choose_no,student_no,course_no,score,choose_timeose_time) )1.4.4 1.4.4 建立新表表示多对多关系建立新表表示多对多关系MySQL数据库基础与实例教程数据库基础与实例教程1.4.4 1.4.4 建立新表表示多对多关系建立新表表示多对多关系MySQL数据库基础与实例教程数据库基础与实例教程1.4.5 1.4.5 为字段选择合适的数据类型为字段选

32、择合适的数据类型MySQL数据库基础与实例教程数据库基础与实例教程常用的约束条件有常用的约束条件有6 6种:种: 主键(主键(Primary KeyPrimary Key)约束)约束 外键(外键(Foreign KeyForeign Key)约束)约束 唯一性(唯一性(UniqueUnique)约束)约束 默认值(默认值(DefaultDefault)约束)约束 非空(非空(Not NULLNot NULL)约束)约束 检查(检查(CheckCheck)约束。)约束。1.4.6 1.4.6 定义约束(定义约束(ConstraintConstraint)条件)条件MySQL数据库基础与实例教程数

33、据库基础与实例教程设计数据库时,有两个不争的事实。设计数据库时,有两个不争的事实。 数据库中冗余的数据需要额外的维护,因此数据库中冗余的数据需要额外的维护,因此质量好的一套表应该尽量质量好的一套表应该尽量“减少冗余数据减少冗余数据”。 数据库中经常发生变化的数据需要额外的维数据库中经常发生变化的数据需要额外的维护,因此质量好的一套表应该尽量护,因此质量好的一套表应该尽量“避免数据经避免数据经常发生变化常发生变化”。1.4.7 1.4.7 评价数据库表设计的质量评价数据库表设计的质量MySQL数据库基础与实例教程数据库基础与实例教程 冗余的数据需要额外的维护,并且容易导致冗余的数据需要额外的维护

34、,并且容易导致“数据不一致数据不一致”、“插入异常插入异常”以及以及“删除异常删除异常”等问题的发生。等问题的发生。1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程场景一:插入异常。场景一:插入异常。场景二:修改复杂。场景二:修改复杂。场景三:删除异常。场景三:删除异常。1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程 规范化是通过最小化数据冗余来提升数据库规范化是通过最小化数据冗余来提升数据库设计质量的过程,规范化是基于函数依赖以及一设计质量的过程,规范

35、化是基于函数依赖以及一系列范式定义的,最为常用的是第一范式系列范式定义的,最为常用的是第一范式(1NF1NF)、第二范式()、第二范式(2NF2NF)和第三范式)和第三范式(3NF3NF)。)。1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程 函数依赖:一张表内两个字段值之间的一一函数依赖:一张表内两个字段值之间的一一对应关系称为函数依赖。对应关系称为函数依赖。 第一范式:如果一张表内同类字段不重复出第一范式:如果一张表内同类字段不重复出现,该表就满足第一范式的要求。现,该表就满足第一范式的要求。1.4.8 1.4.8 使用

36、规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程第一范式第一范式1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程 第二范式:一张表在满足第一范式的基础上,第二范式:一张表在满足第一范式的基础上,如果每个如果每个“非关键字非关键字”字段字段“仅仅仅仅”函数依赖于函数依赖于主键,那么该表满足第二范式的要求。主键,那么该表满足第二范式的要求。1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程第二范式第二范式1.4.8 1.

37、4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程 第三范式:如果一张表满足第二范式的要求,第三范式:如果一张表满足第二范式的要求,并且不存在并且不存在“非关键字非关键字”字段函数依赖于任何其字段函数依赖于任何其他他“非关键字非关键字”字段,那么该表满足第三范式的字段,那么该表满足第三范式的要求。要求。1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与实例教程第三范式第三范式1.4.8 1.4.8 使用规范化减少数据冗余使用规范化减少数据冗余MySQL数据库基础与实例教程数据库基础与

38、实例教程 统计学生的个人资料时,如果读者是一名数统计学生的个人资料时,如果读者是一名数据库开发人员,应该让学生上报年龄信息,还是据库开发人员,应该让学生上报年龄信息,还是让学生上报出生日期?让学生上报出生日期? 如何确保每一门课程选报学生的人数,不超如何确保每一门课程选报学生的人数,不超过人数上限?过人数上限? 1.4.9 1.4.9 避免数据经常发生变化避免数据经常发生变化MySQL数据库基础与实例教程数据库基础与实例教程方案一:方案一:course(course_nocourse(course_no, , course_no,course_namecourse_no,course_name

39、, ,up_limit,description,status,teacher_noup_limit,description,status,teacher_no, , availableavailable) )方案二:数据库表无需进行任何更改。方案二:数据库表无需进行任何更改。 1.4.9 1.4.9 避免数据经常发生变化避免数据经常发生变化任务任务1 1:描述:描述“选课系统选课系统”的问题域。的问题域。任务任务2 2:将本书图:将本书图1-71-7中中“团购网站、顾客以团购网站、顾客以及房源之间的三元关系表示方法及房源之间的三元关系表示方法 ”E-RE-R图转化图转化为关系(模式)。为关系(

40、模式)。任务任务3 3:使用笔纸或者:使用笔纸或者wordword绘图工具,绘制绘图工具,绘制“选课系统选课系统”的的E-RE-R图。图。任务任务4 4:将:将“选课系统选课系统”的的E-RE-R图转化为关系图转化为关系(模式)。(模式)。任务布置任务布置Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之MySQLMySQL基础知识基础知识1 12 23 3 通过本章的学习,通过本章的学习,读者可以掌握一些常读者可以掌握一些常用的用的MySQL命令,从命令,从而对而对MySQL数据库进数据库进行一些简单的管理。行一些简单的管理。 本章知识点较为繁本章知识

41、点较为繁杂,希望保持一份儿杂,希望保持一份儿耐心。耐心。4 4字符集以及字符序设置字符集以及字符序设置MySQL概述概述MySQL数据库管理数据库管理MySQL表管理表管理5 5系统变量系统变量内容一览内容一览 1 12 23 3MySQL由瑞典由瑞典MySQL AB公司开发。公司开发。2008年年1月月MySQL被美国被美国的的SUN公司收购。公司收购。2009年年4月月SUN公司又被公司又被美国的甲骨文美国的甲骨文(Oracle)公司收购。)公司收购。MySQL服务的安装服务的安装MySQL的特点的特点MySQL服务的配置服务的配置45启动与停止启动与停止MySQL服务服务MySQL配置文

42、件配置文件2.1 2.1 MySQLMySQL概述概述 6 67 7MySQLMySQL由瑞典由瑞典MySQLMySQL AB AB公公司开发。司开发。20082008年年1 1月月MySQLMySQL被美国的被美国的SUNSUN公司收购。公司收购。20092009年年4 4月月SUNSUN公司又被美公司又被美国的甲骨文(国的甲骨文(OracleOracle)公)公司收购。司收购。连接连接MySQLMySQL服务器关系数据库服务器关系数据库MySQLMySQL客户机客户机2.1 2.1 MySQLMySQL概述概述 MySQL数据库基础与实例教程数据库基础与实例教程 MySQLMySQL是一个

43、单进程多线程、支持多用是一个单进程多线程、支持多用户、基于客户机户、基于客户机/ /服务器(服务器(Client/ServerClient/Server简简称称C/SC/S)的关系数据库管理系统)的关系数据库管理系统 。 性能高效性能高效 跨平台支持跨平台支持 简单易用简单易用 开源开源 支持多用户支持多用户2.1.1 2.1.1 MySQLMySQL特点特点MySQL数据库基础与实例教程数据库基础与实例教程MySQL的使用流程的使用流程2.1.1 2.1.1 MySQLMySQL特点特点MySQL数据库基础与实例教程数据库基础与实例教程MySQL其他概念(请参看本书内容):其他概念(请参看本

44、书内容): MySQL服务服务 MySQL服务实例服务实例 MySQL服务器服务器 端口号端口号2.1.1 2.1.1 MySQLMySQL特点特点MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL服务的安装(请参看本书内容)。服务的安装(请参看本书内容)。建议自学,并上机操作。建议自学,并上机操作。注意:本书使用的注意:本书使用的MySQLMySQL为为5.65.6版本。版本。可以到可以到本书指定的网址下载本书指定的网址下载MySQLMySQL图形化安装包图形化安装包mysql-5.6.5-m8-win32.msimysql-5.6.5-m8-win32.msi。 2.1

45、.2 2.1.2 MySQLMySQL服务的安装服务的安装MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL服务的配置(请参看本书内容)。服务的配置(请参看本书内容)。建议自学,并上机操作。建议自学,并上机操作。配置过程中的其他知识点:配置过程中的其他知识点: OLAP OLAP与与OLTPOLTP Enable Strict Mode Enable Strict Mode选项选项 字符集字符集/ /字符序字符序 MySQLMySQL超级管理员超级管理员rootroot账户账户 my.inimy.ini配置文件中配置文件中 2.1.3 2.1.3 MySQLMySQL服务的

46、配置服务的配置MySQL数据库基础与实例教程数据库基础与实例教程MySQL服务的启动与停止(请参看本书内容)服务的启动与停止(请参看本书内容)。建议自学,并上机操作。建议自学,并上机操作。2.1.4 2.1.4 启动与停止启动与停止MySQLMySQL服务服务MySQL数据库基础与实例教程数据库基础与实例教程my.ini配置文件包含了多种参数选项组,每个配置文件包含了多种参数选项组,每个参数选项组通过参数选项组通过“ ”指定,每个参数选项组可指定,每个参数选项组可以配置多个参数信息。通常情况下,每个参以配置多个参数信息。通常情况下,每个参数遵循数遵循“参数名参数名=参数值参数值”这种配置格式,

47、参数这种配置格式,参数名一般是小写字母,参数名大小写敏感。常名一般是小写字母,参数名大小写敏感。常用的参数选项组有用的参数选项组有“client”、“mysql”以及以及“mysqld”参数选项组参数选项组。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MySQL数据库基础与实例教程数据库基础与实例教程client参数选项组参数选项组: 配置了配置了MySQL自带的自带的MySQL5.6 命令行命令行窗口可以读取的参数信息窗口可以读取的参数信息。 常用的参数是常用的参数是port(默认值是(默认值是3306)。 修改该修改该port值会导致新打开的值会导致新打开的MySQL5.6

48、 命令行窗口无法连接命令行窗口无法连接MySQL服务器服务器。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MySQL数据库基础与实例教程数据库基础与实例教程mysql参数选项组参数选项组: 配置了配置了MySQL客户机程序客户机程序mysql.exe可以可以读取的参数信息读取的参数信息。 常用的参数有常用的参数有“prompt”、“default-character-set=gbk”。 修改修改 “mysql”参数选项组中的参数值,参数选项组中的参数值,将直接影响新打开的将直接影响新打开的MySQL客户机客户机。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MyS

49、QL数据库基础与实例教程数据库基础与实例教程mysqld参数选项组参数选项组: 配置了配置了MySQL服务程序服务程序mysqld.exe可以可以读取的参数信息,读取的参数信息,mysqld.exe启动时,将启动时,将mysqld参数选项组的参数信息加载到服务器参数选项组的参数信息加载到服务器内存,继而生成内存,继而生成MySQL服务实例服务实例。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MySQL数据库基础与实例教程数据库基础与实例教程mysqld参数选项组参数选项组: 常用的参数有常用的参数有“port”、“basedir”、“datadir”、“character-se

50、t-server”、“sql_mode”、“max_connections”以及以及“default_storage_engine”等等。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MySQL数据库基础与实例教程数据库基础与实例教程mysqld参数选项组参数选项组: 修改修改“mysqld”参数选项组的参数值,只参数选项组的参数值,只有重新启动有重新启动MySQL服务,将修改后的配置文服务,将修改后的配置文件参数信息加载到服务器内存后,新配置文件参数信息加载到服务器内存后,新配置文件才会在新的件才会在新的MySQL服务实例中生效服务实例中生效。 如果如果“mysqld”参数选项

51、组的参数信息出参数选项组的参数信息出现错误,将会导致现错误,将会导致MySQL服务无法启动服务无法启动。2.1.5 2.1.5 MySQLMySQL配置文件配置文件MySQL数据库基础与实例教程数据库基础与实例教程MySQL客户机客户机(本书使用前两个):本书使用前两个): MySQL5.6命令行窗口命令行窗口 CMD命令提示符窗口命令提示符窗口WEB浏览器(例如浏览器(例如phpMyAdmin)第三方客户机程序(例如第三方客户机程序(例如MySQL-Front、MySQLManagerforMySQL等)等)2.1.6 2.1.6 MySQLMySQL客户机客户机MySQL数据库基础与实例教

52、程数据库基础与实例教程phpMyAdmin2.1.6 2.1.6 MySQLMySQL客户机客户机MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL-Front-Front2.1.6 2.1.6 MySQLMySQL客户机客户机MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQLManager for Manager for MySQLMySQL2.1.6 2.1.6 MySQLMySQL客户机客户机MySQL数据库基础与实例教程数据库基础与实例教程2.1.6 2.1.6 MySQLMySQL客户机客户机HeidiSQLHeidiSQLMySQL数据库基础

53、与实例教程数据库基础与实例教程MySQL客户机客户机连接连接MySQL服务器服务器须提供:须提供: 合法的登录主机:解决合法的登录主机:解决“from”的问题的问题。 合法的账户名以及密码:解决合法的账户名以及密码:解决“who”的问题的问题。 MySQL服务器主机名(或服务器主机名(或IP地址):解决地址):解决“to”的问题的问题。端口号:解决端口号:解决“多卡多待多卡多待”的问题的问题。MySQL客户机与客户机与MySQL服务器是同一台主机时,服务器是同一台主机时,主机名可以使用主机名可以使用localhost(或者(或者127.0.0.1)。)。2.1.7 2.1.7 连接连接MySQ

54、LMySQL服务器服务器MySQL数据库基础与实例教程数据库基础与实例教程当当MySQL客户机与客户机与MySQL服务器是同一台主机服务器是同一台主机时,打开命令提示符窗口,输入时,打开命令提示符窗口,输入mysql -h 127.0.0.1 -P 3306 -u root proot或者或者mysql -h localhost -P 3306 -u root proot然后回车(注意然后回车(注意-p后面紧跟密码后面紧跟密码root),即可实),即可实现本地现本地MySQL客户机与本地客户机与本地MySQL服务器之间服务器之间的成功连接的成功连接。2.1.7 2.1.7 连接连接MySQLM

55、ySQL服务器服务器MySQL数据库基础与实例教程数据库基础与实例教程2.1.7 2.1.7 连接连接MySQLMySQL服务器服务器1 12 23 3 MySQLMySQL由瑞典由瑞典MySQLMySQL ABAB公司开发,默认情况下公司开发,默认情况下MySQLMySQL使用的是使用的是latin1latin1字字符集。符集。 由此可能导致由此可能导致MySQLMySQL数据库不够支持中文字符数据库不够支持中文字符串查询或者发生中文字符串查询或者发生中文字符串乱码等问题。串乱码等问题。 MySQLMySQL字符集与字符序字符集与字符序字符集及字符序概念字符集及字符序概念MySQLMySQL

56、的字符集的字符集转换过程程45MySQLMySQL字符集的字符集的设置置SQLSQL脚本文件脚本文件2.2 2.2 字符集以及字符序设置字符集以及字符序设置MySQL数据库基础与实例教程数据库基础与实例教程字符(字符(Character)是人类语言最小的表义符)是人类语言最小的表义符号,例如号,例如A、B等。给定一系列字符,对每个字等。给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这符赋予一个数值,用数值来代表对应的字符,这个数值就是字符的编码(个数值就是字符的编码(CharacterEncoding)。)。 给定一系列字符并赋予对应的编码后,所有这给定一系列字符并赋予对应的

57、编码后,所有这些些“字符和编码对字符和编码对”组成的集合就是字符集组成的集合就是字符集(Character Set)。2.2.1 2.2.1 字符集及字符序概念字符集及字符序概念MySQL数据库基础与实例教程数据库基础与实例教程2.2.1 2.2.1 字符集及字符序概念字符集及字符序概念MySQL数据库基础与实例教程数据库基础与实例教程字符序字符序(Collation)是指在同一字符集内字符之间是指在同一字符集内字符之间的比较规则。一个字符集包含多种字符序,每个字的比较规则。一个字符集包含多种字符序,每个字符序唯一对应一种字符集。符序唯一对应一种字符集。MySQL字符序命名规则是:以字符序对应

58、的字字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以符集名称开头,以国家名居中(或以general居中)居中),以,以ci、cs或或bin结尾。结尾。ci表示大小写不敏感,表示大小写不敏感,cs表示大小写敏感,表示大小写敏感,bin表示按二进制编码值比较。表示按二进制编码值比较。2.2.1 2.2.1 字符集及字符序概念字符集及字符序概念MySQL数据库基础与实例教程数据库基础与实例教程 使用使用MySQLMySQL命令命令show character set;show character set;即可查看当前即可查看当前MySQLMySQL服务实例支持的字符集、字符服务实例

59、支持的字符集、字符集默认的字符序以及字符集占用的最大字节长度等集默认的字符序以及字符集占用的最大字节长度等信息信息 latin1 latin1支持西欧字符、希腊字符等支持西欧字符、希腊字符等 gbkgbk支持中文简体字符支持中文简体字符 big5 big5支持中文繁体字符支持中文繁体字符 utf8 utf8几乎支持世界所有国家的字符。几乎支持世界所有国家的字符。2.2.2 2.2.2 MySQLMySQL字符集及字符序字符集及字符序MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令showvariableslikecharacter%;即可查看当前即可查看当前MySQ

60、L服务实例使用的字符集。服务实例使用的字符集。2.2.2 2.2.2 MySQLMySQL字符集及字符序字符集及字符序MySQL数据库基础与实例教程数据库基础与实例教程character_set_clientcharacter_set_client:MySQLMySQL客户机字符集。客户机字符集。 character_set_connectioncharacter_set_connection:数据通信链路字:数据通信链路字符集,当符集,当MySQLMySQL客户机向服务器发送请求时,请求客户机向服务器发送请求时,请求数据以该字符集进行编码。数据以该字符集进行编码。 character_set

61、_databasecharacter_set_database:数据库字符集。:数据库字符集。 character_set_filesystemcharacter_set_filesystem:MySQLMySQL服务器文服务器文件系统字符集,该值是固定的件系统字符集,该值是固定的binarybinary。2.2.2 2.2.2 MySQLMySQL字符集及字符序字符集及字符序MySQL数据库基础与实例教程数据库基础与实例教程character_set_results:结果集的字符集,:结果集的字符集,MySQL服务器向服务器向MySQL客户机返回执行结果时,客户机返回执行结果时,执行结果以该

62、字符集进行编码。执行结果以该字符集进行编码。character_set_server:MySQL服务实例字符服务实例字符集。集。character_set_system:元数据:元数据(字段名、表字段名、表名、数据库名等名、数据库名等)的字符集,默认值为的字符集,默认值为utf8。2.2.2 2.2.2 MySQLMySQL字符集及字符序字符集及字符序MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令“showcollation;”即可查看当即可查看当前前MySQL服务实例支持的字符序。服务实例支持的字符序。2.2.2 2.2.2 MySQLMySQL字符集及字符序字

63、符集及字符序MySQL数据库基础与实例教程数据库基础与实例教程2.2.3 2.2.3 MySQLMySQL字符集的转换过程字符集的转换过程MySQL数据库基础与实例教程数据库基础与实例教程方法方法1:修改:修改my.ini配置文件,可修改配置文件,可修改MySQL默认的字符集。默认的字符集。方法方法2:MySQL提供下列提供下列MySQL命令可以命令可以“临临时地时地”修改修改MySQL“当前会话的当前会话的”字符集以及字符字符集以及字符序。序。2.2.4 2.2.4 MySQLMySQL字符集的设置字符集的设置MySQL数据库基础与实例教程数据库基础与实例教程 set character_s

64、et_client = gbk; set character_set_connection = gbk; set character_set_database = gbk; set character_set_results = gbk; set character_set_server = gbk; set collation_connection = gbk_chinese_ci ; set collation_database = gbk_chinese_ci ; set collation_server = gbk_chinese_ci ;2.2.4 2.2.4 MySQLMySQL字

65、符集的设置字符集的设置MySQL数据库基础与实例教程数据库基础与实例教程 方法3:使用MySQL命令 “setnamesgbk;”可以“临时一次性地临时一次性地”设置character_set_client、character_set_connection以及character_set_results的字符集为gbk 方法4:连接MySQL服务器时指定字符集 mysql -default-character-set=字符集字符集 -h 服务器IP地址 -u 账户名 p密码2.2.4 2.2.4 MySQLMySQL字符集的设置字符集的设置MySQL数据库基础与实例教程数据库基础与实例教程SQL

66、基本的执行方法(两种):基本的执行方法(两种):.C:mysqlinit.sqlsourceC:mysqlinit.sql2.2.5 SQL2.2.5 SQL脚本文件脚本文件MySQL数据库基础与实例教程数据库基础与实例教程1 12 23 3数据库是存储数据库数据库是存储数据库对象的容器。对象的容器。MySQLMySQL数据数据库的管理主要包括数据库的管理主要包括数据库的创建、选择当前操库的创建、选择当前操作的数据库、显示数据作的数据库、显示数据库结构以及删除数据库库结构以及删除数据库等操作等操作 。查看数据库查看数据库创建数据库创建数据库显示数据库结构显示数据库结构4 45 5选择当前操作的

67、数据库选择当前操作的数据库删除数据库删除数据库2.3 2.3 MySQLMySQL数据库管理数据库管理MySQL数据库基础与实例教程数据库基础与实例教程 create database choose;create database choose;成功成功创建建choosechoose数据数据库后,后,数据库根目录下数据库根目录下会自动创建数据库目录。会自动创建数据库目录。2.3.1 2.3.1 创建数据库创建数据库MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQLMySQL命令命令show databases;show databases;即可查看即可查看MySQLMySQL

68、服务实服务实例上所有的数据库例上所有的数据库 2.3.2 2.3.2 查看数据库查看数据库MySQL数据库基础与实例教程数据库基础与实例教程 使用使用MySQLMySQL命令命令show create database choose;show create database choose;可以可以查看看choosechoose数据数据库的相关信息(例如的相关信息(例如MySQLMySQL版版本本IDID号、默号、默认字符集等信息)字符集等信息)。2.3.3 2.3.3 显示数据库结构显示数据库结构MySQL数据库基础与实例教程数据库基础与实例教程执行执行“use choose;use choo

69、se;”命令后,后续的命令后,后续的MySQLMySQL命令以及命令以及SQLSQL语句将自动操作语句将自动操作choosechoose数据库中所有数据库中所有数据库对象数据库对象。2.3.4 2.3.4 选择当前操作的数据库选择当前操作的数据库MySQL数据库基础与实例教程数据库基础与实例教程删除删除studentstudent数据库,使用数据库,使用SQLSQL语句语句drop database studentdrop database student;2.3.5 2.3.5 删除数据库删除数据库1 12 23 3表是数据库中最为重要表是数据库中最为重要的数据库对象的数据库对象 设置默认的

70、存储引擎设置默认的存储引擎MyISAM和和InnoDB存储引擎存储引擎创建数据库表创建数据库表4 45 5显示表结构显示表结构表记录的管理表记录的管理2.4 2.4 MySQLMySQL表管理表管理 6 67 7表是数据库中最为重要表是数据库中最为重要的数据库对象的数据库对象 删除表删除表InnoDB表空间表空间2.4 2.4 MySQLMySQL表管理表管理 MySQL数据库基础与实例教程数据库基础与实例教程 MySQLMySQL提供了插件式(提供了插件式(PluggablePluggable)的存)的存储引擎,存储引擎是基于表的,同一个数据储引擎,存储引擎是基于表的,同一个数据库,不同的表

71、,存储引擎可以不同。甚至同库,不同的表,存储引擎可以不同。甚至同一个数据库表,在不同的场合可以应用不同一个数据库表,在不同的场合可以应用不同的存储引擎。的存储引擎。 2.4.1 2.4.1 MyISAMMyISAM和和InnoDBInnoDB存储引擎存储引擎MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令“showengines;”,即,即可查看可查看MySQL服务实例支持的存储引擎。服务实例支持的存储引擎。2.4.1 2.4.1 MyISAMMyISAM和和InnoDBInnoDB存储引擎存储引擎MySQL数据库基础与实例教程数据库基础与实例教程1InnoDB存储

72、引擎的特点存储引擎的特点支持外键(支持外键(ForeignKey)支持事务(支持事务(Transaction):如果某张表主要):如果某张表主要提供提供OLTP支持,需要执行大量的增、删、改操作支持,需要执行大量的增、删、改操作(insert、delete、update语句),出于事务安语句),出于事务安全方面的考虑,全方面的考虑,InnoDB存储引擎是更好的选择。存储引擎是更好的选择。最新版本的最新版本的MySQL已经开始支持全文检索。已经开始支持全文检索。2.4.1 2.4.1 MyISAMMyISAM和和InnoDBInnoDB存储引擎存储引擎MySQL数据库基础与实例教程数据库基础与实

73、例教程2MyISAM存储引擎的特点存储引擎的特点MyISAM具有检查和修复表的大多数工具。具有检查和修复表的大多数工具。MyISAM表可以被压缩表可以被压缩MyISAM表最早支持全文索引表最早支持全文索引但但MyISAM表不支持事务表不支持事务但但MyISAM表不支持外键(表不支持外键(ForeignKey)。)。如如果果需需要要执执行行大大量量的的select语语句句,出出于于性性能能方方面面的考虑,的考虑,MyISAM存储引擎是更好的选择。存储引擎是更好的选择。2.4.1 2.4.1 MyISAMMyISAM和和InnoDBInnoDB存储引擎存储引擎MySQL数据库基础与实例教程数据库基

74、础与实例教程MySQL5.6默认的默认的存储引擎是默认的默认的存储引擎是InnoDB。使用使用MySQL命令命令setdefault_storage_engine=MyISAM;可以可以“临时地临时地”将将MySQL“当前会话的当前会话的”存储引存储引擎设置为擎设置为MyISAM,使用,使用MySQL命令命令“showengines;”可以查看当前可以查看当前MySQL服务实例默认的服务实例默认的存储引擎。存储引擎。2.4.2 2.4.2 设置默认的存储引擎设置默认的存储引擎MySQL数据库基础与实例教程数据库基础与实例教程使用使用SQL语句语句“createtable表名表名”即可创建即可创

75、建一个数据库表。例如:一个数据库表。例如:usechoose;setdefault_storage_engine=InnoDB;createtablemy_table(todaydatetime,namechar(20);2.4.3 2.4.3 创建数据库表创建数据库表MySQL数据库基础与实例教程数据库基础与实例教程成功创建成功创建InnoDB存储引擎的存储引擎的my_table表后,表后,MySQL服务实例会在数据库目录服务实例会在数据库目录choose中自动中自动创建一个名字为表名、后缀名为创建一个名字为表名、后缀名为frm的文件。的文件。my_table.frm。2.4.3 2.4.3

76、 创建数据库表创建数据库表MySQL数据库基础与实例教程数据库基础与实例教程将将my_table表的存储引擎修改为表的存储引擎修改为MyISAM。usechoose;altertablemy_tableengine=MyISAM;2.4.3 2.4.3 创建数据库表创建数据库表MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令“destable_name;”即可即可查看表名为查看表名为table_name的表结的表结构构。2.4.4 2.4.4 显示表结构显示表结构MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令“showcreatetab

77、letable_name;”,查看名为,查看名为table_name表的详细信表的详细信息。息。2.4.4 2.4.4 显示表结构显示表结构MySQL数据库基础与实例教程数据库基础与实例教程usechoose;insertintomy_tablevalues(now(),a);insertintomy_tablevalues(now(),a);insertintomy_tablevalues(now(),NULL);insertintomy_tablevalues(now(),);select*frommy_table; 2.4.5 2.4.5 表记录的管理表记录的管理MySQL数据库基础与实

78、例教程数据库基础与实例教程任务布置任务布置1:完成本书场景描述:完成本书场景描述1:MyISAM表记表记录的管理的任务要求。录的管理的任务要求。任务布置任务布置2:完成本书场景描述:完成本书场景描述2:InnoDB表记录表记录的管理的任务要求。的管理的任务要求。2.4.5 2.4.5 表记录的管理表记录的管理MySQL数据库基础与实例教程数据库基础与实例教程1.共享表空间:共享表空间:MySQL服务实例承载的所有数服务实例承载的所有数据库的所有据库的所有InnoDB表的数据信息、索引信息、各表的数据信息、索引信息、各种元数据信息以及事务的回滚(种元数据信息以及事务的回滚(UNDO)信息,)信息

79、,全部存放在共享表空间文件中。全部存放在共享表空间文件中。默认情况下该文件位于数据库根目录下,文件默认情况下该文件位于数据库根目录下,文件名是名是ibdata1,且文件的初始大小为,且文件的初始大小为10M。可以使。可以使用用MySQL命令命令“showvariableslikeinnodb_data_file_path;”查看该文件的的属性。查看该文件的的属性。 2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程数据库基础与实例教程2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程数据库基础与实例教程2.独享表空

80、间:独享表空间:如果将全局系统变量如果将全局系统变量innodb_file_per_table的值设置为的值设置为ON(innodb_file_per_table的默认值为的默认值为OFF),那),那么之后再创建么之后再创建InnoDB存储引擎的新表,这些表的存储引擎的新表,这些表的数据信息、索引信息都将保存到独享表空间文件。数据信息、索引信息都将保存到独享表空间文件。2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程数据库基础与实例教程独享表空独享表空间的设置间的设置2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例

81、教程数据库基础与实例教程usechoose;altertablemy_tableengine=InnoDB;createtablesecond_table(todaydatetime,namechar(20);2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程数据库基础与实例教程2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置3:完成本书场景描述:完成本书场景描述3的任务要求。的任务要求。2.4.6 2.4.6 InnoDBInnoDB表空间表空间MySQL数据库基础与实例教程

82、数据库基础与实例教程使用使用SQL语句语句droptabletable_name;即可删除名为即可删除名为table_name的表。的表。删除表后,删除表后,MySQL服务实例会自动删除该表结服务实例会自动删除该表结构定义文件(例如构定义文件(例如second_table.frm文件),以文件),以及数据、索引信息。该命令慎用!及数据、索引信息。该命令慎用! 2.4.7 2.4.7 删除表删除表1 12 23 3MySQL数据库中,变数据库中,变量分为系统变量(以量分为系统变量(以开头)以及用户开头)以及用户自定义变量(以自定义变量(以开开头)。头)。查看系统变量的值查看系统变量的值全局系统变

83、量与会话系统变量全局系统变量与会话系统变量设置系统变量的值设置系统变量的值2.5 2.5 系统变量系统变量MySQL数据库基础与实例教程数据库基础与实例教程每一个每一个MySQL客户机成功连接客户机成功连接MySQL服服务器后,都会产生与之对应的会话。务器后,都会产生与之对应的会话。会话期间,会话期间,MySQL服务实例会在服务实例会在MySQL服务器内存中生成与该会话对应的会话系统服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系变量,这些会话系统变量的初始值是全局系统变量值的拷贝。统变量值的拷贝。 2.5.1 2.5.1 全局系统变量与会话系统变量全局系统变量与会

84、话系统变量MySQL数据库基础与实例教程数据库基础与实例教程由于各会话在会话期间所做的操作不尽相由于各会话在会话期间所做的操作不尽相同,为了标记各个会话,会话系统变量又新同,为了标记各个会话,会话系统变量又新增了增了12个变量。个变量。2.5.1 2.5.1 全局系统变量与会话系统变量全局系统变量与会话系统变量MySQL数据库基础与实例教程数据库基础与实例教程2.5.1 2.5.1 全局系统变量与会话系统变量全局系统变量与会话系统变量MySQL数据库基础与实例教程数据库基础与实例教程使用使用“show global variables;show global variables;”命令即命令即

85、可查看可查看MySQLMySQL服务器内存中所有的全局系统变服务器内存中所有的全局系统变量信息(有量信息(有393393项之多)。项之多)。 使用使用“show session variables;show session variables;”命令命令即可查看与当前会话相关的所有会话系统变即可查看与当前会话相关的所有会话系统变量以及所有的全局系统变量(有量以及所有的全局系统变量(有405405项之多),项之多),此处此处sessionsession关键字可以省略。关键字可以省略。 2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程MyS

86、QLMySQL中有一些系统变量仅仅是全局系统变量,中有一些系统变量仅仅是全局系统变量,例如例如 innodb_data_file_pathinnodb_data_file_path。 show global variables like show global variables like innodb_data_file_pathinnodb_data_file_path; show session variables like show session variables like innodb_data_file_pathinnodb_data_file_path; show varia

87、bles like show variables like innodb_data_file_pathinnodb_data_file_path;2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL中有一些系统变量仅仅是会话系统变量,中有一些系统变量仅仅是会话系统变量,例如例如MySQLMySQL连接连接IDID会话系统变量会话系统变量pseudo_thread_idpseudo_thread_id。 show session variables like show session variables like pseu

88、do_thread_idpseudo_thread_id; show variables like show variables like pseudo_thread_idpseudo_thread_id;2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程 MySQLMySQL中中有有一一些些系系统统变变量量既既是是全全局局系系统统变变量量,又又 是是 会会 话话 系系 统统 变变 量量 , 例例 如如 系系 统统 变变 量量character_set_clientcharacter_set_client 既既是是全全局局系系统统变变量量

89、,又又是是会话系统变量。会话系统变量。2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程此时查看会话系统变量的方法:此时查看会话系统变量的方法: show show session session variables variables like like character_set_clientcharacter_set_client; show show variables variables like like character_set_clientcharacter_set_client; 此时查看全局系统变量的方法:此时查看全

90、局系统变量的方法: show show global global variables variables like like character_set_clientcharacter_set_client;2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程作作为为MySQLMySQL编编码码规规范范,MySQLMySQL中中的的系系统统变变量量以以两两个个“ ”开头。开头。 global global仅仅用于标记全局系统变量;仅仅用于标记全局系统变量; session session仅仅用于标记会话系统变量;仅仅用于标记会话系统变量;

91、 首首先先标标记记会会话话系系统统变变量量,如如果果会会话话系系统统变量不存在,则标记全局系统变量。变量不存在,则标记全局系统变量。 2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置4 4:完成本书场景描述:完成本书场景描述4 4的任务要求。的任务要求。2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程方法一:修改方法一:修改MySQLMySQL源代码,然后对源代码,然后对MySQLMySQL源代码源代码重新编译(该方法适用于重新编译(该方法适用于MySQLMySQ

92、L高级用户,这里不高级用户,这里不作阐述)。作阐述)。方法二:最为简单的方法是通过修改方法二:最为简单的方法是通过修改MySQLMySQL配置文配置文件,继而修改件,继而修改MySQLMySQL系统变量的值(系统变量的值(faifai方法需要方法需要重启重启MySQLMySQL服务)。服务)。方法三:在方法三:在MySQLMySQL服务运行期间,使用服务运行期间,使用“setset”命命令重新设置系统变量的值。令重新设置系统变量的值。 2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程 设置全局系统变量的值的方法:设置全局系统变量的值的方

93、法: set set global.innodb_file_per_tableglobal.innodb_file_per_table = = default;default; set set global.innodb_file_per_tableglobal.innodb_file_per_table = = ON;ON; set global set global innodb_file_per_tableinnodb_file_per_table = ON; = ON;2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教程数据库基础与实例教程设置会话系统

94、变量的值的方法:设置会话系统变量的值的方法: set set session.pseudo_thread_idsession.pseudo_thread_id = 5; = 5; set session set session pseudo_thread_idpseudo_thread_id = 5; = 5; set set pseudo_thread_idpseudo_thread_id = 5; = 5; set set pseudo_thread_idpseudo_thread_id = 5; = 5;2.5.2 2.5.2 查看系统变量的值查看系统变量的值MySQL数据库基础与实例教

95、程数据库基础与实例教程MySQLMySQL中还有一些特殊的全局系统变量(例如中还有一些特殊的全局系统变量(例如log_binlog_bin、tmpdirtmpdir、versionversion、datadirdatadir),在),在MySQLMySQL服务实例运行期间它们的值不能动态修改,服务实例运行期间它们的值不能动态修改,不能使用不能使用“setset”命令进行重新设置,这种变量称命令进行重新设置,这种变量称为静态变量。为静态变量。 数据库管理员可以使用方法一或者方法二对数据库管理员可以使用方法一或者方法二对静态变量的值重新设置。静态变量的值重新设置。 2.5.2 2.5.2 查看系统

96、变量的值查看系统变量的值步骤步骤1:准备工作:准备工作方法一:停止方法一:停止MySQL服务服务方方法法二二:使使用用MySQL命命令令“flushtableswithreadlock;”将将服服务务器器内内存存中中的的数数据据“刷刷新新”到到数数据据库库文文件件中中,同同时时锁锁定定所所有有表表,以以保保证证备备份份期期间间不会有新的数据写入不会有新的数据写入。2.6 2.6 MySQLMySQL数据库备份和恢复数据库备份和恢复步骤步骤2:备份文件的选取:备份文件的选取如果数据库中全部是如果数据库中全部是MyISAM存储引擎的表,最存储引擎的表,最为简单的数据库备份方法就是直接为简单的数据库

97、备份方法就是直接“备份备份”整个整个数据库目录。数据库目录。如果某个数据库中还存在如果某个数据库中还存在InnoDB存储引擎的表,存储引擎的表,此时不仅需要此时不仅需要“备份备份”整个数据库目录,还需要整个数据库目录,还需要备份备份ibdata1表空间文件以及重做日志文件表空间文件以及重做日志文件ib_logfile0与与ib_logfile1。2.6 2.6 MySQLMySQL数据库备份和恢复数据库备份和恢复步骤步骤2:备份文件的选取:备份文件的选取数据库备份时,建议将数据库备份时,建议将MySQL配置文件(例如配置文件(例如my.ini配置文件)一并进行备份。配置文件)一并进行备份。2.

98、6 2.6 MySQLMySQL数据库备份和恢复数据库备份和恢复步骤步骤3:数据库恢复:数据库恢复首先停止首先停止MySQL服务;然后将整个数据库目录、服务;然后将整个数据库目录、MySQL配置文件(例如配置文件(例如my.ini配置文件)、配置文件)、ibdata1共享表空间文件以及重做日志文件共享表空间文件以及重做日志文件ib_logfile0与与ib_logfile1复制到新复制到新MySQL服务器服务器对应的路径,即可恢复数据库中的数据。对应的路径,即可恢复数据库中的数据。2.6 2.6 MySQLMySQL数据库备份和恢复数据库备份和恢复Thanks孔祥盛孔祥盛MySQLMySQL数

99、据库基础与实例教程数据库基础与实例教程 之之MySQLMySQL表结构的管理表结构的管理1 12 23 3本章详细讲解本章详细讲解“选课系统选课系统”数据库数据库各个表的实施过程,各个表的实施过程,通过本章的学习,通过本章的学习,读者可以掌握表结读者可以掌握表结构管理的相关知识。构管理的相关知识。 4 4创建表建表MySQL数据类型数据类型修改修改表表结构构删除表除表5 5索引索引内容一览内容一览 1 12 23 3MySQL提供的数据提供的数据类型包括数值类型类型包括数值类型(整数类型和小数类(整数类型和小数类型)、字符串类型、型)、字符串类型、日期类型、复合类型日期类型、复合类型(复合类型

100、包括(复合类型包括enum类型和类型和set类型)类型)以及二进制类型以及二进制类型 。MySQL小数小数类型型MySQL整数整数类型型MySQL字符串字符串类型型45MySQL日期日期类型型MySQL复合复合类型型3.1 3.1 MySQLMySQL数据类型数据类型 6 67 7为字段字段选择合适的数据合适的数据类型型MySQL二二进制制类型型MySQL提供的数据提供的数据类型包括数值类型类型包括数值类型(整数类型和小数类(整数类型和小数类型)、字符串类型、型)、字符串类型、日期类型、复合类型日期类型、复合类型(复合类型包括(复合类型包括enum类型和类型和set类型)类型)以及二进制类型以

101、及二进制类型 。3.1 3.1 MySQLMySQL数据类型数据类型 MySQL数据库基础与实例教程数据库基础与实例教程3.1.1 3.1.1 MySQLMySQL整数整数类型型MySQL数据库基础与实例教程数据库基础与实例教程整数类型的数,默认情况下既可以表示正整数类型的数,默认情况下既可以表示正整数又可以表示负整数(此时称为有符号数)整数又可以表示负整数(此时称为有符号数)。如果只希望表示零和正整数,可以使用无。如果只希望表示零和正整数,可以使用无符号关键字符号关键字“unsigned”对整数类型进行修对整数类型进行修饰(此时称为无符号整数)。饰(此时称为无符号整数)。 例如:score

102、tinyint unsigned3.1.1 3.1.1 MySQLMySQL整数整数类型型MySQL数据库基础与实例教程数据库基础与实例教程3.1.1 3.1.1 MySQLMySQL整数整数类型型MySQL数据库基础与实例教程数据库基础与实例教程3.1.2 3.1.2 MySQLMySQL小数小数类型型MySQL数据库基础与实例教程数据库基础与实例教程decimal(length,precision)用于表示精度确定用于表示精度确定(小数点后数字的位数确定)的小数类型,(小数点后数字的位数确定)的小数类型,length决定了该小数的最大位数,决定了该小数的最大位数,precision用于设置

103、精度用于设置精度(小数点后数字的位数)。(小数点后数字的位数)。例如:例如:decimal(5,2)表示小数取值范围:表示小数取值范围:999.99999.99decimal(5,0)表示表示: -9999999999的整数。的整数。3.1.2 3.1.2 MySQLMySQL小数小数类型型MySQL数据库基础与实例教程数据库基础与实例教程3.1.2 3.1.2 MySQLMySQL小数小数类型型MySQL数据库基础与实例教程数据库基础与实例教程字符串类型的数据外观字符串类型的数据外观上使用单引号括起来,例上使用单引号括起来,例如学生姓名如学生姓名张三张三、课程名、课程名java程序设计程序设

104、计等。等。3.1.3 3.1.3 MySQLMySQL字符串字符串MySQL数据库基础与实例教程数据库基础与实例教程char()与与varchar():例如例如对于于简体中文字符集体中文字符集gbk的字符串而言,的字符串而言,varchar(255)表示可以存表示可以存储255个个汉字,而每个字,而每个汉字占用两个字字占用两个字节的存的存储空空间。假如。假如这个字符串个字符串没有那么多没有那么多汉字,例如字,例如仅仅包含一个包含一个中中字,那字,那么么varchar(255)仅仅占用占用1个字符(两个字个字符(两个字节)的的储存空存空间;而;而char(255)则必必须占用占用255个字符个字

105、符长度的存度的存储空空间,哪怕里面只存,哪怕里面只存储一个一个汉字。字。3.1.3 3.1.3 MySQLMySQL字符串字符串类型型MySQL数据库基础与实例教程数据库基础与实例教程date表示日期,默认格式为表示日期,默认格式为YYYY-MM-DD;time表示时间,格式为表示时间,格式为HH:ii:ss;year表示年份;表示年份;datetime与与timestamp是日期和时间的混合类是日期和时间的混合类型,格式为型,格式为YYYY-MM-DDHH:ii:ss3.1.4 3.1.4 MySQLMySQL日期日期类型型MySQL数据库基础与实例教程数据库基础与实例教程datetime与

106、与timestamp都是日期和时间的都是日期和时间的混合类型,区别在于:混合类型,区别在于:表示的取值范围不同,表示的取值范围不同,datetime的取值范的取值范围远远大于围远远大于timestamp的取值范围。的取值范围。将将NULL插入插入timestamp字段后,该字段的字段后,该字段的值实际上是值实际上是MySQL服务器当前的日期和时间。服务器当前的日期和时间。同一个同一个timestamp类型的日期或时间,不类型的日期或时间,不同的时区,显示结果不同。同的时区,显示结果不同。 3.1.4 3.1.4 MySQLMySQL日期日期类型型MySQL数据库基础与实例教程数据库基础与实例教

107、程任务布置任务布置1:理解:理解datetime与与timestamp之间之间的区别。的区别。上机操作,完成本书上机操作,完成本书场景描述场景描述1以及以及场景描述场景描述2的任务要求,理解的任务要求,理解datetime与与timestamp之之间的区别。间的区别。学会使用学会使用now()函数。函数。注意:注意:now()函数用于获得函数用于获得MySQL服务器的服务器的当前时间,该时间与时区的设置密切相关。当前时间,该时间与时区的设置密切相关。 3.1.4 3.1.4 MySQLMySQL日期日期类型型MySQL数据库基础与实例教程数据库基础与实例教程MySQL支持两种复合数据类型:支持

108、两种复合数据类型:enum枚枚举类型和举类型和set集合类型。集合类型。enum类型的字段类似于单选按钮的功能,类型的字段类似于单选按钮的功能,一个一个enum类型的数据最多可以包含类型的数据最多可以包含65535个个元素。元素。set类型的字段类似于复选框的功能,一个类型的字段类似于复选框的功能,一个set类型的数据最多可以包含类型的数据最多可以包含64个元素。个元素。3.1.5 3.1.5 MySQLMySQL复合复合类型型MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置2:上机操作,完成本书场景描述:上机操作,完成本书场景描述3的任务要求,理解复合类型的用法。的任务要求

109、,理解复合类型的用法。注意:注意:MySQL模式对复合类型数据的影响。模式对复合类型数据的影响。3.1.5 3.1.5 MySQLMySQL复合复合类型型MySQL数据库基础与实例教程数据库基础与实例教程二进制类型的字段主要用于存储由二进制类型的字段主要用于存储由0和和1组成的字符串,因此从某种意义上将,二进组成的字符串,因此从某种意义上将,二进制类型的数据是一种特殊格式的字符串。制类型的数据是一种特殊格式的字符串。二进制类型与字符串类型的区别在于:字符二进制类型与字符串类型的区别在于:字符串类型的数据按字符为单位进行存储,因此串类型的数据按字符为单位进行存储,因此存在多种字符集、多种字符序;

110、而二进制类存在多种字符集、多种字符序;而二进制类型的数据按字节为单位进行存储,仅存在二型的数据按字节为单位进行存储,仅存在二进制字符集进制字符集binary。 3.1.6 3.1.6 MySQLMySQL二二进制制类型型MySQL数据库基础与实例教程数据库基础与实例教程3.1.6 3.1.6 MySQLMySQL二二进制制类型型MySQL数据库基础与实例教程数据库基础与实例教程选择合适的数据类型选择合适的数据类型,不仅可以不仅可以节省储存节省储存空间,还可以有效地提升数据的计算性能。空间,还可以有效地提升数据的计算性能。(1)在符合应用要求(取值范围、精度)的)在符合应用要求(取值范围、精度)

111、的前提下,尽量使用前提下,尽量使用“短短”数据类型数据类型(2)数据类型越简单越好)数据类型越简单越好(3)在)在MySQL中,应该用内置的日期和时中,应该用内置的日期和时间数据类型,而不是用字符串来存储日期和间数据类型,而不是用字符串来存储日期和时间。时间。3.1.7 3.1.7 选择合适的数据合适的数据类型型MySQL数据库基础与实例教程数据库基础与实例教程(4)尽量采用精确小数类型(例如)尽量采用精确小数类型(例如decimal),而不采用浮点数类型。使用精确),而不采用浮点数类型。使用精确小数类型不仅能够保证数据计算更为精确,小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例

112、如百分比使用还可以节省储存空间,例如百分比使用decimal(4,2)即可。即可。(5)尽量避免)尽量避免NULL字段,建议将字段指定字段,建议将字段指定为为NOTNULL约束。约束。3.1.7 3.1.7 选择合适的数据合适的数据类型型1 12 23 3createtable表名表名(字段名字段名1数据类型数据类型约束约束条件条件,其他约束条件其他约束条件,其他约束条件其他约束条件)其他选项(例如存储引其他选项(例如存储引擎、字符集等选项)擎、字符集等选项)设置自增型字段置自增型字段设置置约束束其他其他选项的的设置置45创建建“选课系系统”数据数据库表表复制一个表复制一个表结构构3.2 3.

113、2 创建表创建表MySQL数据库基础与实例教程数据库基础与实例教程1设置主键(设置主键(PrimaryKey)约束)约束(1)如果一个表的主键是单个字段,直接在该字)如果一个表的主键是单个字段,直接在该字段的数据类型或者其他约束条件后加上段的数据类型或者其他约束条件后加上“primarykey”关键字,即可将该字段设置为主键约束,语关键字,即可将该字段设置为主键约束,语法规则如下。法规则如下。字段名字段名数据类型数据类型其他约束条件其他约束条件primarykey例如:例如:student_nochar(11)primarykey3.2.1 3.2.1 设置置约束束MySQL数据库基础与实例教

114、程数据库基础与实例教程1设置主键(设置主键(PrimaryKey)约束)约束(2)如果一个表的主键是多个字段的组合(例如)如果一个表的主键是多个字段的组合(例如字段名字段名1与字段名与字段名2共同组成主键),定义完所有共同组成主键),定义完所有的字段后,使用下面的语法规则将(字段名的字段后,使用下面的语法规则将(字段名1,字字段名段名2)设置为复合主键。)设置为复合主键。primarykey(字段名字段名1,字段名字段名2)3.2.1 3.2.1 设置置约束束MySQL数据库基础与实例教程数据库基础与实例教程任务布置:完成本书场景描述任务布置:完成本书场景描述4:查看某个表的约:查看某个表的约

115、束条件的任务要求。束条件的任务要求。注意:注意:MySQL命令后,命令后,“G”的作用。的作用。3.2.1 3.2.1 设置置约束束MySQL数据库基础与实例教程数据库基础与实例教程默认情况下,默认情况下,MySQL自增型字段的值从自增型字段的值从1开始开始递增,且步长为递增,且步长为1。设置自增型字段的语法格式如。设置自增型字段的语法格式如下。下。字段名字段名数据类型数据类型auto_increment3.2.2 3.2.2 设置自增型字段置自增型字段MySQL数据库基础与实例教程数据库基础与实例教程1设置表的存储引擎,语法格式如下。设置表的存储引擎,语法格式如下。engine=存储引擎类型

116、存储引擎类型2设置该表的字符集,语法格式如下。设置该表的字符集,语法格式如下。defaultcharset=字符集类型字符集类型3.2.3 3.2.3 其他其他选项的的设置置MySQL数据库基础与实例教程数据库基础与实例教程3设置索引关键字的压缩方式,可以通过设置设置索引关键字的压缩方式,可以通过设置pack_keys选项实现(注意仅对选项实现(注意仅对MyISAM存储引擎存储引擎的表有效),语法格式如下。的表有效),语法格式如下。pack_keys=压缩类型压缩类型压缩类型值为压缩类型值为default:表示只压缩索引中字符串:表示只压缩索引中字符串类型的关键字(例如类型的关键字(例如cha

117、r、varchar、text等字段)等字段),但不压缩数值类型的关键字。,但不压缩数值类型的关键字。压缩类型值为压缩类型值为0:表示取消索引关键字的压缩。:表示取消索引关键字的压缩。3.2.3 3.2.3 其他其他选项的的设置置MySQL数据库基础与实例教程数据库基础与实例教程3设置索引关键字的压缩方式设置索引关键字的压缩方式压缩类型值为压缩类型值为1:表示压缩索引中所有关键字的储:表示压缩索引中所有关键字的储存空间,这样做通常会使检索速度加快,更新速存空间,这样做通常会使检索速度加快,更新速度变慢。例如索引中第一个关键字的值为度变慢。例如索引中第一个关键字的值为“perform”,第二关键字

118、的值为,第二关键字的值为“performance”,那么第二关键字会被存储为,那么第二关键字会被存储为“7,ance”。3.2.3 3.2.3 其他其他选项的的设置置MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置2:书书写写本本书书场场景景描描述述5:创创建建“选选课课系系统统”数据库表的数据库表的SQL代码,调试,并运行。代码,调试,并运行。3.2.4 3.2.4 创建建“选课系系统”数据数据库表表MySQL数据库基础与实例教程数据库基础与实例教程复制一个表结构的实现方法有两种。复制一个表结构的实现方法有两种。方法一:在方法一:在createtable语句的末尾添加语句的

119、末尾添加like子句,子句,可以将源表的表结构复制到新表中,语法格式如可以将源表的表结构复制到新表中,语法格式如下。下。createtable新表名新表名like源表源表3.2.5 3.2.5 复制一个表复制一个表结构构MySQL数据库基础与实例教程数据库基础与实例教程复制一个表结构的实现方法有两种。复制一个表结构的实现方法有两种。方法二、在方法二、在createtable语句的末尾添加一个语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中。下面的语法格式将源表的表记录拷贝到新表中。下面的语法格式将源表的表结构以及源

120、表的所有记录拷贝到新表将源表的表结构以及源表的所有记录拷贝到新表中。中。createtable新表名新表名select*from源表源表3.2.5 3.2.5 复制一个表复制一个表结构构1 12 23 3成熟的数据库设计,成熟的数据库设计,数据库的表结构一般不数据库的表结构一般不会发生变化。数据库的会发生变化。数据库的表结构一旦发生变化,表结构一旦发生变化,基于该表的视图、触发基于该表的视图、触发器、存储过程将直接受器、存储过程将直接受到影响,甚至导致应用到影响,甚至导致应用程序的修改。程序的修改。修改修改约束条件束条件修改字段相关信息修改字段相关信息修改表的其他修改表的其他选项4 4修改表名

121、修改表名3.3 3.3 修改表结构修改表结构4 4MySQL数据库基础与实例教程数据库基础与实例教程1删除字段删除字段删除表字段的语法格式如下。删除表字段的语法格式如下。altertable表名表名drop字段名字段名3.3.1 3.3.1 修改字段相关信息修改字段相关信息MySQL数据库基础与实例教程数据库基础与实例教程2添加新字段添加新字段向表添加新字段时,通常需要指定新字段向表添加新字段时,通常需要指定新字段在表中的位置。向表添加新字段的语法格式在表中的位置。向表添加新字段的语法格式如下。如下。altertable表名表名add新字段名新字段名新数据类型新数据类型新约束条件新约束条件fi

122、rst|after旧字段名旧字段名3.3.1 3.3.1 修改字段相关信息修改字段相关信息MySQL数据库基础与实例教程数据库基础与实例教程3修改字段名(或者数据类型)修改字段名(或者数据类型)(1)修改表的字段名(及数据类型)的语法)修改表的字段名(及数据类型)的语法格式如下。格式如下。altertable表名表名change旧字段名旧字段名新字段名新字段名新数据类型新数据类型3.3.1 3.3.1 修改字段相关信息修改字段相关信息MySQL数据库基础与实例教程数据库基础与实例教程3修改字段名(或者数据类型)修改字段名(或者数据类型)(2)如果仅对字段的数据类型进行修改,可)如果仅对字段的数

123、据类型进行修改,可以使用下面的语法格式。以使用下面的语法格式。altertable表名表名modify字段名字段名新数据类型新数据类型3.3.1 3.3.1 修改字段相关信息修改字段相关信息MySQL数据库基础与实例教程数据库基础与实例教程1添加约束条件添加约束条件向表的某个字段添加约束条件的语法格式向表的某个字段添加约束条件的语法格式如下(其中约束类型可以是唯一性约束、主如下(其中约束类型可以是唯一性约束、主键约束及外键约束)。键约束及外键约束)。altertable表名表名addconstraint约束名约束名约约束类型束类型(字段名字段名)3.3.2 3.3.2 修改修改约束条件束条件M

124、ySQL数据库基础与实例教程数据库基础与实例教程2删除约束条件删除约束条件(1)删除表的主键约束条件语法格式比较简)删除表的主键约束条件语法格式比较简单,语法格式如下。单,语法格式如下。altertable表名表名dropprimarykey(2)删除表的外键约束时,需指定外键约束)删除表的外键约束时,需指定外键约束名称,语法格式如下(注意需指定外键约束名称,语法格式如下(注意需指定外键约束名)。名)。altertable表名表名dropforeignkey约束名约束名3.3.2 3.3.2 修改修改约束条件束条件MySQL数据库基础与实例教程数据库基础与实例教程2删除约束条件删除约束条件(3

125、)若要删除表字段的唯一性约束,实际上)若要删除表字段的唯一性约束,实际上只需删除该字段的唯一性索引即可,语法格只需删除该字段的唯一性索引即可,语法格式如下(注意需指定唯一性索引的索引名)。式如下(注意需指定唯一性索引的索引名)。3.3.2 3.3.2 修改修改约束条件束条件MySQL数据库基础与实例教程数据库基础与实例教程altertable表名表名engine=新的存储引擎类型新的存储引擎类型altertable表名表名defaultcharset=新的字符集新的字符集altertable表名表名auto_increment=新的初始值新的初始值altertable表名表名pack_keys

126、=新的压缩类型新的压缩类型 3.3.3 3.3.3 修改表的其他修改表的其他选项MySQL数据库基础与实例教程数据库基础与实例教程修改表名的语法格式较为简单,语法格式如修改表名的语法格式较为简单,语法格式如下。下。renametable旧表名旧表名to新表名新表名该命令等效于:该命令等效于:altertable旧表名旧表名rename新新表名表名3.3.4 3.3.4 修改表名修改表名删除表的删除表的SQL语法格式比较简单,前面也已语法格式比较简单,前面也已经讲过,这里不再赘述。这里唯一需要强调的是经讲过,这里不再赘述。这里唯一需要强调的是删除表时,如果表之间存在外键约束关系,此时删除表时,如

127、果表之间存在外键约束关系,此时需要注意删除表的顺序。需要注意删除表的顺序。 3.4 3.4 删除表删除表1 12 23 3创建数据库表时,初创建数据库表时,初学者通常仅仅关注该表学者通常仅仅关注该表有哪些字段、字段的数有哪些字段、字段的数据类型及约束条件等信据类型及约束条件等信息,数据库表中另一个息,数据库表中另一个重要的概念重要的概念“索引索引”很很容易被忽视。容易被忽视。索引关索引关键字的字的选取原取原则理解索引理解索引索引与索引与约束束4 45 5创建索引建索引删除索引除索引3.5 3.5 索引索引 MySQL数据库基础与实例教程数据库基础与实例教程想象一下现代汉语词典的使用方法,理解想

128、象一下现代汉语词典的使用方法,理解索引的重要性。索引的重要性。1索引的本质是什么?索引的本质是什么?2MySQL数据库中,数据是如何检索的?数据库中,数据是如何检索的?3一个数据库表只能创建一个索引吗?一个数据库表只能创建一个索引吗?4什么是前缀索引?什么是前缀索引?5索引可以是字段的组合吗?索引可以是字段的组合吗?6能跨表创建索引吗?能跨表创建索引吗?3.5.1 3.5.1 理解索引理解索引MySQL数据库基础与实例教程数据库基础与实例教程想象一下现代汉语词典的使用方法,理解想象一下现代汉语词典的使用方法,理解索引的重要性。索引的重要性。7索引数据需要额外的存储空间吗?索引数据需要额外的存储

129、空间吗?8表中的哪些字段适合选作表的索引?什么表中的哪些字段适合选作表的索引?什么是主索引?什么是聚簇索引?是主索引?什么是聚簇索引?9索引与数据结构是什么关系?索引与数据结构是什么关系?10索索引引非非常常重重要要,同同一一个个表表,表表的的索索引引越越多越好吗?多越好吗?3.5.1 3.5.1 理解索引理解索引MySQL数据库基础与实例教程数据库基础与实例教程索引的设计往往需要一定的技巧,掌握了索引的设计往往需要一定的技巧,掌握了这些技巧,可以确保索引能够大幅地提升数这些技巧,可以确保索引能够大幅地提升数据检索效率,弥补索引在数据更新方面带来据检索效率,弥补索引在数据更新方面带来的缺陷。的

130、缺陷。原则原则1:表的某个字段值离散度越高,该字段:表的某个字段值离散度越高,该字段越适合选作索引的关键字。越适合选作索引的关键字。原则原则2:占用储存空间少的字段更适合选作索:占用储存空间少的字段更适合选作索引的关键字。引的关键字。3.5.2 3.5.2 索引关索引关键字的字的选取原取原则MySQL数据库基础与实例教程数据库基础与实例教程原则原则3:较频繁地作为:较频繁地作为where查询条件的字段查询条件的字段应该创建索引,分组字段或者排序字段应该应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。创建索引,两个表的连接字段应该创建索引。原则原则4:更新频繁的字段

131、不适合创建索引,不:更新频繁的字段不适合创建索引,不会出现在会出现在where子句中的字段不应该创建索引。子句中的字段不应该创建索引。原则原则5最左前缀原则最左前缀原则原则原则6尽量使用前缀索引尽量使用前缀索引3.5.2 3.5.2 索引关索引关键字的字的选取原取原则MySQL数据库基础与实例教程数据库基础与实例教程约约束束主主要要用用于于保保证证业业务务逻逻辑辑操操作作数数据据库库时时数据的完整性;约束是逻辑层面的概念。数据的完整性;约束是逻辑层面的概念。索索引引则则是是将将关关键键字字数数据据以以某某种种数数据据结结构构的的方方式式存存储储到到外外存存,用用于于提提升升数数据据的的检检索索

132、性性能能;索索引引既既有有逻逻辑辑上上的的概概念念,更更是是一一种种物物理理存存储储方方式式,且且事事实实存存在在、需需要要耗耗费费一一定定的的储储存存空空间。间。3.5.3 3.5.3 索引与索引与约束束MySQL数据库基础与实例教程数据库基础与实例教程索引的种类:索引的种类:主索引、聚簇索引主索引、聚簇索引唯一性索引唯一性索引普通索引普通索引复合索引复合索引全文索引(全文索引(fulltext)3.5.4 3.5.4 创建索引建索引MySQL数据库基础与实例教程数据库基础与实例教程方法一:创建表的同时创建索引方法一:创建表的同时创建索引createtable表名表名(字段名字段名1数据类型

133、数据类型约束条件约束条件,其他约束条件其他约束条件,unique|fulltextindex索引名索引名(字段名字段名(长度长度)asc|desc)engine=存储引擎类型存储引擎类型defaultcharset=字符集类型字符集类型3.5.4 3.5.4 创建索引建索引MySQL数据库基础与实例教程数据库基础与实例教程createtablebook(isbnchar(20)primarykey,namechar(100)notnull,brief_introductiontextnotnull,pricedecimal(6,2),publish_timedatenotnull,unique

134、indexisbn_unique(isbn),indexname_index(name(20),fulltextindexbrief_fulltext(name,brief_introduction),indexcomplex_index(price,publish_time)engine=MyISAMdefaultcharset=gbk;3.5.4 3.5.4 创建索引建索引MySQL数据库基础与实例教程数据库基础与实例教程方法二、在已有表上创建索引方法二、在已有表上创建索引语法格式一:语法格式一:createunique|fulltextindex索引名索引名on表名表名(字段名字段名(长

135、度长度)asc|desc)语法格式二:语法格式二:altertable表名表名addunique|fulltextindex索引名索引名(字段名字段名(长度长度)asc|desc)3.5.4 3.5.4 创建索引建索引MySQL数据库基础与实例教程数据库基础与实例教程删除索引的语法格式如下。删除索引的语法格式如下。dropindex索引名索引名on表名表名3.5.5 3.5.5 删除索引除索引Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之表记录的更新操作表记录的更新操作1 12 23 3本章讲解本章讲解“选课系统选课系统”的各种更新操作,一的各种更新

136、操作,一方面是为接下来的章节方面是为接下来的章节准备测试数据,另一方准备测试数据,另一方面希望读者对面希望读者对“选课系选课系统统”的各个表结构有更的各个表结构有更深刻的认识,便于后续深刻的认识,便于后续章节的学习。章节的学习。4 4表表记录的修改的修改表记录的插入表记录的插入表表记录的的删除除MySQL特殊字符序列特殊字符序列内容一览内容一览 1 12 23 3向数据库表插入记向数据库表插入记录时,可以使用录时,可以使用insert语句向表中插语句向表中插入一条或者多条记录,入一条或者多条记录,也可以使用也可以使用insert.select语句语句向表中插入另一个表向表中插入另一个表的结果集

137、。的结果集。更新操作与字符集更新操作与字符集使用使用insert语句插入新句插入新记录关于自增型字段关于自增型字段45批量插入多条批量插入多条记录使用使用insert.select插入插入结果集果集6使用使用replace插入新插入新记录4.1 4.1 表表记录的插入的插入MySQL数据库基础与实例教程数据库基础与实例教程语法格式如下。语法格式如下。insertinto表名表名(字段列表)(字段列表)values(值列(值列表)表)任务布置任务布置1:完成本书:完成本书场景描述场景描述1:向表的所有字:向表的所有字段插入数据的任务要求。段插入数据的任务要求。注意:注意:insert语句的返回结

138、果。语句的返回结果。4.1.1 4.1.1 使用使用insertinsert语句插入新句插入新记录MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置2:完成本书场景描述:完成本书场景描述2:在指定的字段:在指定的字段插入数据的任务要求。插入数据的任务要求。任务布置任务布置3:完成本书场景描述:完成本书场景描述3:在:在insert语句语句中使用默认值的任务要求。中使用默认值的任务要求。注意:注意:外外键约束关系束关系。4.1.1 4.1.1 使用使用insertinsert语句插入新句插入新记录MySQL数据库基础与实例教程数据库基础与实例教程从从本本章章开开始始,MySQL客

139、客户户机机与与MySQL服服务务器器之之间间的的数数据据请请求求、响响应应变变得得更更加加频频繁繁,当当请请求求数数据据(或或者者响响应应数数据据)中中存存在在中中文文字字符符时时,字字符符集集的的设设置变得非常关键。置变得非常关键。任任务务布布置置4:完完成成本本书书场场景景描描述述4:更更新新操操作作与与字字符集的任务要求。符集的任务要求。4.1.2 4.1.2 更新操作与字符集更新操作与字符集MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置5:完完成成本本书书场场景景描描述述5:关关于于自自增增型型字字段的任务要求。段的任务要求。4.1.3 4.1.3 关于自增型字段关

140、于自增型字段MySQL数据库基础与实例教程数据库基础与实例教程使用使用insertinsert语句可以一次性地向表批量插入语句可以一次性地向表批量插入多条记录,语法格式如下。多条记录,语法格式如下。insert into insert into 表名表名(字段列表字段列表) values) values( (值列表值列表1),1),( (值列表值列表2),2),( (值列表值列表n);n);4.1.4 4.1.4 批量插入多条批量插入多条记录MySQL数据库基础与实例教程数据库基础与实例教程 在在insertinsert语句中使用语句中使用selectselect子句可以将源表子句可以将源表的

141、查询结果添加到目标表中,语法格式如下。的查询结果添加到目标表中,语法格式如下。insert into insert into 目标表名目标表名(字段列表字段列表1) 1) select (select (字段列表字段列表2) from 2) from 源表源表 where where 条件表达条件表达式式注意:字段列表注意:字段列表1 1与字段列表与字段列表2 2的字段个数必须相的字段个数必须相同,且对应字段的数据类型尽量保持一致。同,且对应字段的数据类型尽量保持一致。如果源表与目标表的表结构完全相同,如果源表与目标表的表结构完全相同,“( (字段列字段列表表1)1)”可以省略。可以省略。4.

142、1.5 4.1.5 使用使用insertinsert.select.select插入插入结果果MySQL数据库基础与实例教程数据库基础与实例教程replacereplace语句的语法格式有三种语法格式。语句的语法格式有三种语法格式。语法格式语法格式1 1:replace into replace into 表名表名 (字段列表)(字段列表) values values (值列表)(值列表)语法格式语法格式2 2:replace into replace into 目标表名目标表名(字段字段列表列表1) 1) select (select (字段列表字段列表2) from 2) from 源表源

143、表 where where 条件表条件表达式达式4.1.6 4.1.6 使用使用replacereplace插入新插入新记录MySQL数据库基础与实例教程数据库基础与实例教程replacereplace语句的语法格式有三种语法格式。语句的语法格式有三种语法格式。语法格式语法格式3 3:replace into replace into 表名表名set set 字段字段1=1=值值1, 1, 字段字段2=2=值值2 24.1.6 4.1.6 使用使用replacereplace插入新插入新记录MySQL数据库基础与实例教程数据库基础与实例教程 replace replace语句的功能与语句的功能

144、与insertinsert语句的功能基语句的功能基本相同,不同之处在于:使用本相同,不同之处在于:使用replacereplace语句向语句向表插入新记录时,如果新纪录的主键值或者表插入新记录时,如果新纪录的主键值或者唯一性约束的字段值与已有记录相同,则已唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也有记录先被删除(注意:已有记录删除时也不能违背外键约束条件),然后再插入新记不能违背外键约束条件),然后再插入新记录。录。4.1.6 4.1.6 使用使用replacereplace插入新插入新记录MySQL数据库基础与实例教程数据库基础与实例教程 使用使用repla

145、cereplace的最大好处就是可以将的最大好处就是可以将deletedelete和和insertinsert合二为一,形成一个原子操作,这样就无需合二为一,形成一个原子操作,这样就无需将将deletedelete操作与操作与insertinsert操作置于事务中了。操作置于事务中了。任务布置任务布置6 6:完成本书场景描述:完成本书场景描述6 6:replacereplace语句的语句的用法的任务要求。用法的任务要求。说明:考虑到数据库移植,不建议使用说明:考虑到数据库移植,不建议使用replacereplace。4.1.6 4.1.6 使用使用replacereplace插入新插入新记录u

146、pdate表名表名set字段名字段名1=值值1,字段名字段名2=值值2,.,字段名字段名n=值值nwhere条件表达式条件表达式where子句指定了表中的哪些记录需要修改。若子句指定了表中的哪些记录需要修改。若省略了省略了where子句,则表示修改表中的所有记录。子句,则表示修改表中的所有记录。set子句指定了要修改的字段以及该字段修改后的子句指定了要修改的字段以及该字段修改后的值。值。4.2 4.2 表表记录的修改的修改1 12 2 表记录的删除通常表记录的删除通常使用使用deletedelete语句实现,语句实现,如果要清空某一个表可如果要清空某一个表可以使用以使用truncatetrun

147、cate语句。语句。 使用使用truncatetruncate清空表清空表记录使用使用deletedelete删除表除表记录4.3 4.3 表表记录的的删除除MySQL数据库基础与实例教程数据库基础与实例教程deletedelete语句的语法格式如下。语句的语法格式如下。delete from delete from 表名表名 where where 条件表达式条件表达式 说明:如果没有指定说明:如果没有指定wherewhere子句,那么该表的子句,那么该表的所有记录都将被删除,但表结构依然存在。所有记录都将被删除,但表结构依然存在。4.3.1 4.3.1 使用使用deletedelete删除

148、表除表记录MySQL数据库基础与实例教程数据库基础与实例教程truncate tabletruncate table用于完全清空一个表,语法用于完全清空一个表,语法格式如下。格式如下。truncate table truncate table 表名表名4.3.2 4.3.2 使用使用truncatetruncate清空表清空表记录MySQL数据库基础与实例教程数据库基础与实例教程从逻辑上说,从逻辑上说,truncate语句与语句与“deletefrom表名表名”语句作用相同,但是在某些情况下,两者语句作用相同,但是在某些情况下,两者在使用上有所区别。在使用上有所区别。例如:清空记录的表如果是父

149、表,那么例如:清空记录的表如果是父表,那么truncate命令将永远执行失败。如果使用命令将永远执行失败。如果使用truncatetable成成功清空表记录,那么会重新设置自增型字段的计功清空表记录,那么会重新设置自增型字段的计数器。数器。truncatetable语句不支持事务的回滚,并语句不支持事务的回滚,并且不会触发触发器程序的运行。且不会触发触发器程序的运行。4.3.2 4.3.2 使用使用truncatetruncate清空表清空表记录MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置7:完成本书:完成本书场景描述场景描述7:truncate与与delete的区别的区

150、别的任务要求。的任务要求。4.3.2 4.3.2 使用使用truncatetruncate清空表清空表记录MySQL中,当字符中,当字符串中存在串中存在8个特殊字符个特殊字符序列时,字符序列被转序列时,字符序列被转义成对应的字符(每个义成对应的字符(每个字符序列以反斜线符号字符序列以反斜线符号“”开头,且字符序开头,且字符序列大小写敏感)。列大小写敏感)。4.4 4.4 MySQLMySQL特殊字符序列特殊字符序列向表中插入两条学生信息向表中插入两条学生信息4.4 4.4 MySQLMySQL特殊字符序列特殊字符序列Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实

151、例教程 之之表记录的检索表记录的检索1 12 23 3本章详细讲解本章详细讲解select语句检索表语句检索表记录的方法,并结记录的方法,并结合合“选课系统选课系统”,讨论该系统部分问讨论该系统部分问题域的实现方法。题域的实现方法。4 4使用使用where子句子句过滤结果集果集select语句概述语句概述使用使用order by子句子句对结果集排序果集排序使用聚合函数使用聚合函数汇总结果集果集5 5使用使用group by子句子句对记录分分组统计内容一览内容一览 6 67 78 8本章详细讲解本章详细讲解select语句检索表语句检索表记录的方法,并结记录的方法,并结合合“选课系统选课系统”,

152、讨论该系统部分问讨论该系统部分问题域的实现方法。题域的实现方法。9 9子子查询合并结果集合并结果集选课系系统综合合查询使用正使用正则表达式模糊表达式模糊查询1010全文全文检索索内容一览内容一览 5.1 select5.1 select语句概述语句概述select语句的语法格式如下。语句的语法格式如下。select字段列表字段列表from数据源数据源where条件表达式条件表达式groupby分组字段分组字段having条件表达式条件表达式orderby排序字段排序字段asc|desc1 12 23 3使用使用谓词限制限制记录的行数的行数使用使用select子句指定字段列表子句指定字段列表使用

153、使用from子句指定数据源子句指定数据源4多表多表连接接5.1 select5.1 select语句概述语句概述MySQL数据库基础与实例教程数据库基础与实例教程使用以下几种方式指定字段列表:使用以下几种方式指定字段列表:5.1.1 5.1.1 使用使用selectselect子句指定字段列表子句指定字段列表MySQL数据库基础与实例教程数据库基础与实例教程可以为字段列表中的字段名或表达式指定可以为字段列表中的字段名或表达式指定别名,中间使用别名,中间使用as关键字分隔即可(关键字分隔即可(as关键关键字可以省略)。字可以省略)。多表查询时,同名字段前必须添加表名前多表查询时,同名字段前必须添

154、加表名前缀,中间使用缀,中间使用“.”分隔。分隔。5.1.1 5.1.1 使用使用selectselect子句指定字段列表子句指定字段列表MySQL数据库基础与实例教程数据库基础与实例教程MySQL中的两个谓词中的两个谓词distinct和和limit可以限制记录可以限制记录的行数。的行数。(1)使用谓词)使用谓词distinct过滤结果集中的重复记录过滤结果集中的重复记录数据库表中不允许出现重复的记录,但这不意味着数据库表中不允许出现重复的记录,但这不意味着select的查询结果集中不会出现记录重复的现象。的查询结果集中不会出现记录重复的现象。如果需要过滤结果集中重复的记录,可以使用谓词如果

155、需要过滤结果集中重复的记录,可以使用谓词关键字关键字distinct,语法格式如下。,语法格式如下。distinct字段名字段名5.1.2 5.1.2 使用使用谓词限制限制记录的行数的行数MySQL数据库基础与实例教程数据库基础与实例教程(2)使用谓词)使用谓词limit查询某几行记录查询某几行记录查询前几条或者中间某几条记录,可以使用谓词关查询前几条或者中间某几条记录,可以使用谓词关键字键字limit实现。语法格式如下。实现。语法格式如下。select字段列表字段列表from数据源数据源limitstart,length;start表示从第几行记录开始检索,表示从第几行记录开始检索,leng

156、th表示检表示检索多少行记录。表中第一行记录的索多少行记录。表中第一行记录的start值为值为0。5.1.2 5.1.2 使用使用谓词限制限制记录的行数的行数MySQL数据库基础与实例教程数据库基础与实例教程例如:例如:select*fromstudentlimit0,3;该该SQL语句等效于:语句等效于:select*fromstudentlimit3;例如检索例如检索choose表中从第表中从第2条记录开始的条记录开始的3条记录条记录信息,可以使用下面的信息,可以使用下面的SQL语句。语句。select*fromchooselimit1,3;5.1.2 5.1.2 使用使用谓词限制限制记录

157、的行数的行数MySQL数据库基础与实例教程数据库基础与实例教程多张数据库表(或者视图)多张数据库表(或者视图)“缝补缝补”成一个结成一个结果集时,需要指定果集时,需要指定“缝补缝补”条件,该条件,该“缝补缝补”条条件称为连接条件。件称为连接条件。指定连接条件的方法有两种:第一种方法是在指定连接条件的方法有两种:第一种方法是在where子句中指定连接条件(稍后讲解)。第二子句中指定连接条件(稍后讲解)。第二种方法是在种方法是在from子句中使用连接(子句中使用连接(join)运算将)运算将多个数据源按照某种连接条件多个数据源按照某种连接条件“缝补缝补”在一起。在一起。5.1.3 5.1.3 使用

158、使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程第二种方法第二种方法from子句的语法格式如下。子句的语法格式如下。from表名表名1连接类型连接类型join表名表名2on表表1和和表表2之间的连接条件之间的连接条件说明:说明:SQL标准中的连接类型主要分为标准中的连接类型主要分为inner连连接(内连接)和接(内连接)和outer连接(外连接),而外连连接(外连接),而外连接又分为接又分为left(左外连接,简称为左连接)、(左外连接,简称为左连接)、right(右外连接,简称为右连接)以及(右外连接,简称为右连接)以及full(完(完全外连

159、接,简称完全连接)。全外连接,简称完全连接)。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程1内连接(内连接(innerjoin)内连接将两个表中满足指定连接条件的记录连内连接将两个表中满足指定连接条件的记录连接成新的结果集,舍弃所有不满足连接条件的记接成新的结果集,舍弃所有不满足连接条件的记录。内连接是最常用的连接类型,也是默认的连录。内连接是最常用的连接类型,也是默认的连接类型,可以在接类型,可以在from子句中使用子句中使用innerjoin(inner关键字可以省略)实现内连接,语法关键字可以省略)实现内连

160、接,语法格式如下。格式如下。from表表1innerjoin表表2on表表1和表和表2之间的之间的连接条件连接条件5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置1:完成本书场景描述:完成本书场景描述1的任务要求。的任务要求。说明:使用内连接连接两个数据库表时,连接条说明:使用内连接连接两个数据库表时,连接条件会同时过滤表件会同时过滤表1与表与表2的记录信息。的记录信息。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程2外连

161、接(外连接(outerjoin)外连接又分为左连接(外连接又分为左连接(leftjoin)、右连接)、右连接(rightjoin)和完全连接()和完全连接(full)。与内连接不)。与内连接不同,外连接(左连接或右连接)的连接条件只过同,外连接(左连接或右连接)的连接条件只过滤一个表,对另一个表不进行过滤(该表的所有滤一个表,对另一个表不进行过滤(该表的所有记录出现在结果集中);记录出现在结果集中);注意:注意:MySQL暂不支持完全连接暂不支持完全连接。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程(1)左连接的

162、语法格式)左连接的语法格式from表表1leftjoin表表2on表表1和表和表2之间的连之间的连接条件接条件说明:语法格式中表说明:语法格式中表1左连接表左连接表2,意味着查询结,意味着查询结果集中须包含表果集中须包含表1的全部记录,然后表的全部记录,然后表1按指定的按指定的连接条件与表连接条件与表2进行连接,若表进行连接,若表2中没有满足连接中没有满足连接条件的记录,则结果集中表条件的记录,则结果集中表2相应的字段填入相应的字段填入NULL。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置2:完成

163、本书场景描述:完成本书场景描述2的任务要求。的任务要求。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程(2)右连接的语法格式)右连接的语法格式from表表1rightjoin表表2on表表1和表和表2之间的之间的连接条件连接条件说明:语法格式中表说明:语法格式中表1右连接表右连接表2,意味着查询结,意味着查询结果集中须包含表果集中须包含表2的全部记录,然后表的全部记录,然后表2按指定的按指定的连接条件与表连接条件与表1进行连接,若表进行连接,若表1中没有满足连接中没有满足连接条件的记录,则结果集中表条件的记录,则结

164、果集中表1相应的字段填入相应的字段填入NULL。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置3:完成本书场景描述:完成本书场景描述3的任务要求。的任务要求。5.1.3 5.1.3 使用使用fromfrom子句指定数据源子句指定数据源MySQL数据库基础与实例教程数据库基础与实例教程以以3个表为例,语法格式如下。个表为例,语法格式如下。from表表1连接类型连接类型join表表2on表表1和表和表2之之间的连接条件间的连接条件连接类型连接类型join表表3on表表2和表和表3之间的连接之间的连接条件

165、条件5.1.4 5.1.4 多表多表连接接数据库中存储着海量数据库中存储着海量数据,数据库用户往往数据,数据库用户往往需要的是满足特定条件需要的是满足特定条件的记录,的记录,where子句可子句可以实现结果集的过滤筛以实现结果集的过滤筛选。选。where子句的语法格式:子句的语法格式:where条件表达式条件表达式1 12 23 3is NULL运算符运算符使用使用单一的条件一的条件过滤结果集果集select语句与字符集句与字符集4使用使用逻辑运算符运算符5使用使用like进行模糊行模糊查询5.2 5.2 使用使用wherewhere子句过滤结果集子句过滤结果集MySQL数据库基础与实例教程数

166、据库基础与实例教程单一的过滤条件可以使用下面的布尔表达式表单一的过滤条件可以使用下面的布尔表达式表示。示。表达式表达式1比较运算符比较运算符表达式表达式2说明:说明:“表达式表达式1”和和“表达式表达式2”可以是一个字段可以是一个字段名、常量、变量、函数甚至是子查询。名、常量、变量、函数甚至是子查询。比较运算符用于比较两个表达式的值,比较的结比较运算符用于比较两个表达式的值,比较的结果是一个布尔值(果是一个布尔值(true或者或者false)。)。5.2.1 5.2.1 使用使用单一的条件一的条件过滤结果集果集MySQL数据库基础与实例教程数据库基础与实例教程常用的比较运算符有常用的比较运算符

167、有=(等于)、(等于)、(大于)、(大于)、=(大于等于)、(大于等于)、(小于)、(小于)、=(小于等于)、(小于等于)、(不等于)、(不等于)、!=(不等于)、(不等于)、!(不大于)。(不大于)。如果表达式的结果是数值,则按照数值的大小如果表达式的结果是数值,则按照数值的大小进行比较;如果表达式的结果是字符串,则需要进行比较;如果表达式的结果是字符串,则需要参考字符序参考字符序collation的设置进行比较。的设置进行比较。5.2.1 5.2.1 使用使用单一的条件一的条件过滤结果集果集MySQL数据库基础与实例教程数据库基础与实例教程isNULL用于判断表达式的值是否为空值用于判断表

168、达式的值是否为空值NULL(isnot恰恰相反),恰恰相反),isNULL的语法格式的语法格式如下。如下。表达式表达式isnotNULL说明:不能将说明:不能将“scoreisNULL”写成写成“score=NULL;”,原因是,原因是NULL是一个不确定的数,不能是一个不确定的数,不能使用使用“=”、“!=”等比较运算符与等比较运算符与NULL进行比进行比较。较。5.2.2 is NULL5.2.2 is NULL运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置4:完完成成本本书书场场景景描描述述4:MySQL客客户户机显示结果集时出现乱码问题的任务要求。机显示

169、结果集时出现乱码问题的任务要求。任任务务布布置置5:完完成成本本书书场场景景描描述述5:查查询询结结果果失失败问题的任务要求。败问题的任务要求。任任务务布布置置6:完完成成本本书书场场景景描描述述6:SQL语语句句解解析错误问题的任务要求。析错误问题的任务要求。5.2.3 select5.2.3 select语句与字符集句与字符集MySQL数据库基础与实例教程数据库基础与实例教程where子子句句中中可可以以包包含含多多个个查查询询条条件件,使使用用逻逻辑辑运运算算符符可可以以将将多多个个查查询询条条件件组组合合起起来来,完完成成更更为为复复杂杂的的过过滤滤筛筛选选。常常用用的的逻逻辑辑运运算

170、算符符包包括括逻逻辑辑与与(and)、逻逻辑辑或或(or)以以及及逻逻辑辑非非(!),其其中逻辑非(!)为单目运算符。中逻辑非(!)为单目运算符。5.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程1逻辑非(!)逻辑非(!)逻辑非(!)为单目运算符,逻辑非(!)的逻辑非(!)为单目运算符,逻辑非(!)的使用方法较为简单,如下所示。使用逻辑非(!)使用方法较为简单,如下所示。使用逻辑非(!)操作布尔表达式时,布尔表达式的值为操作布尔表达式时,布尔表达式的值为true时,整时,整个逻辑表达式的结果为个逻辑表达式的结果为false,反之亦然。,反之亦然。

171、!布尔表达式布尔表达式5.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程2and逻辑运算符逻辑运算符使用使用and逻辑运算符连接两个布尔表达式时,只逻辑运算符连接两个布尔表达式时,只有两个布尔表达式的值都为有两个布尔表达式的值都为true时,整个逻辑表达时,整个逻辑表达式的结果才为式的结果才为true。语法格式如下。语法格式如下。布尔表达式布尔表达式1and布尔表达式布尔表达式25.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程另外另外MySQL还支持还支持betweenand运算符,运算符,bet

172、weenand运算符用于判断一个表达式的值运算符用于判断一个表达式的值是否位于指定的取值范围内,是否位于指定的取值范围内,betweenand的的语法格式如下。语法格式如下。表达式表达式notbetween起始值起始值and终止值终止值5.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程3使用使用or逻辑运算符逻辑运算符使用使用or逻辑运算符连接两个布尔表达式时,只逻辑运算符连接两个布尔表达式时,只有两个表达式的值都为有两个表达式的值都为false时,整个逻辑表达式时,整个逻辑表达式的结果才为的结果才为false。语法格式如下。语法格式如下。布尔表

173、达式布尔表达式1or布尔表达式布尔表达式25.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程另外另外MySQL还支持还支持in运算符,运算符,in运算符用于判运算符用于判定一个表达式的值是否位于一个离散的数学集合定一个表达式的值是否位于一个离散的数学集合内,内,in的语法格式如下。的语法格式如下。表达式表达式notin(数学集合)(数学集合)5.2.4 5.2.4 使用使用逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程like运算符用于判断一个字符串是否与给定的模运算符用于判断一个字符串是否与给定的模式相匹配。式相匹配。模式是

174、一种特殊的字符串,特殊之处在于不仅模式是一种特殊的字符串,特殊之处在于不仅包含普通字符,还包含有通配符。在实际应用中,包含普通字符,还包含有通配符。在实际应用中,如果不能对字符串进行精确查询,此时可以使用如果不能对字符串进行精确查询,此时可以使用like运算符与通配符实现模糊查询,运算符与通配符实现模糊查询,like运算符的运算符的语法格式如下。语法格式如下。字符串表达式字符串表达式notlike模式模式5.2.5 5.2.5 使用使用likelike进行模糊行模糊查询MySQL数据库基础与实例教程数据库基础与实例教程模式是一个字符串,其中包含普通字符和通配模式是一个字符串,其中包含普通字符和

175、通配符。在符。在MySQL中常用的通配符如表所示。中常用的通配符如表所示。5.2.5 5.2.5 使用使用likelike进行模糊行模糊查询MySQL数据库基础与实例教程数据库基础与实例教程模糊查询模糊查询“%”或者或者“_”字符时,需要将字符时,需要将“%”或者或者“_”字符转义,例如检索学生姓名中所有带字符转义,例如检索学生姓名中所有带“_”的学生信息,可以使用下面的的学生信息,可以使用下面的SQL语句,其语句,其中中new_student表在表记录的更新操作章节中创表在表记录的更新操作章节中创建。执行结果如图建。执行结果如图5-23所示。所示。select*fromnew_student

176、wherestudent_namelike%_%;5.2.5 5.2.5 使用使用likelike进行模糊行模糊查询MySQL数据库基础与实例教程数据库基础与实例教程如果不想使用如果不想使用“”作为转义字符,可以使用作为转义字符,可以使用escape关键字自定义一个转义字符,例如下面的关键字自定义一个转义字符,例如下面的SQL语句使用字符语句使用字符“!”作为转义字符。作为转义字符。select*fromnew_studentwherestudent_namelike%!_%escape!;5.2.5 5.2.5 使用使用likelike进行模糊行模糊查询select语句的查询结果集的排序由数

177、据库系统动语句的查询结果集的排序由数据库系统动态确定,往往是无序的,态确定,往往是无序的,orderby子句用于对结子句用于对结果集排序。在果集排序。在select语句中添加语句中添加orderby子句,就子句,就可以使结果集中的记录按照一个或多个字段的值可以使结果集中的记录按照一个或多个字段的值进行排序,排序的方向可以是升序(进行排序,排序的方向可以是升序(asc)或降序)或降序(desc)。)。orderby子句的语法格式如下。子句的语法格式如下。orderby字段名字段名1asc|desc,字段名字段名nasc|desc5.3 5.3 使用使用order byorder by子句对结果集

178、排序子句对结果集排序聚聚合合函函数数用用于于对对一一组组值值进进行行计计算算并并返返回回一一个个汇汇总总值值,常常用用的的聚聚合合函函数数有有累累加加求求和和sum()函函数数、平平均均值值avg()函函数数、统统计计记记录录的的行行数数count()函函数数、最最大值大值max()函数和最小值函数和最小值min()函数等。函数等。5.4 5.4 使用聚合函数汇总结果集使用聚合函数汇总结果集使使用用count()对对NULL值值统统计计时时,count()函函数数将将忽忽略略NULL值值。sum()函函数数、avg()函函数数、max()以以及及min()函函数数等等统统计计函函数数,统统计计

179、数数据据时时也也将将忽忽略略NULL值。值。5.4 5.4 使用聚合函数汇总结果集使用聚合函数汇总结果集groupby子句将子句将查询结果按照某个查询结果按照某个字段(或多个字段)字段(或多个字段)进行分组(字段值进行分组(字段值相同的记录作为一相同的记录作为一个分组。个分组。1 12 23 3group by子句与子句与having子句子句group by子句与聚合函数子句与聚合函数group by子句与子句与group_concat()函数函数4group by子句与子句与with rollup选项5.5 5.5 使用使用group bygroup by子句对记录分组统计子句对记录分组统计

180、groupby子句通常与聚合函数一起使用。子句通常与聚合函数一起使用。groupby子句的语法格式如下。子句的语法格式如下。groupby字段列表字段列表having条件表达式条件表达式withrollup任务布置任务布置7:完成本书场景描述:完成本书场景描述7的任务要求。的任务要求。5.5 5.5 使用使用group bygroup by子句对记录分组统计子句对记录分组统计MySQL数据库基础与实例教程数据库基础与实例教程例如统计每一个班的学生人数。例如统计每一个班的学生人数。例如统计每个学生已经选修多少门课程,该生例如统计每个学生已经选修多少门课程,该生的最高分、最低分、总分及平均成绩。的

181、最高分、最低分、总分及平均成绩。5.5.1 group by5.5.1 group by子句与聚合函数子句与聚合函数MySQL数据库基础与实例教程数据库基础与实例教程having子句用于设置分组或聚合函数的过滤筛子句用于设置分组或聚合函数的过滤筛选条件,选条件,having子句通常与子句通常与groupby子句一起使子句一起使用。用。having子句语法格式与子句语法格式与where子句语法格式子句语法格式类似,类似,having子句语法格式如下。子句语法格式如下。having条件表达式条件表达式其中条件表达式是一个逻辑表达式,用于指定分其中条件表达式是一个逻辑表达式,用于指定分组后的筛选条件

182、。组后的筛选条件。5.5.2 group by5.5.2 group by子句与子句与havinghaving子句子句MySQL数据库基础与实例教程数据库基础与实例教程例如检索平均成绩高于例如检索平均成绩高于70分的学生信息及平均分的学生信息及平均成绩。成绩。5.5.2 group by5.5.2 group by子句与子句与havinghaving子句子句MySQL数据库基础与实例教程数据库基础与实例教程下面下面select语句的语法格式中,语句的语法格式中,select语句的执语句的执行过程为:首先使用行过程为:首先使用where子句对结果集进行过滤子句对结果集进行过滤筛选,接着筛选,接着

183、groupby子句分组子句分组where子句的输出,子句的输出,最后最后having子句从分组的结果中再进行筛选。子句从分组的结果中再进行筛选。select字段列表字段列表from数据源数据源where条件表达式条件表达式groupby分组字段分组字段having条件表达式条件表达式5.5.2 group by5.5.2 group by子句与子句与havinghaving子句子句MySQL数据库基础与实例教程数据库基础与实例教程group_concat()函函数数的的功功能能是是将将集集合合中中的的字字符符串串连连接接起起来来,此此时时group_concat()函函数数的的功功能能与与字符

184、串连接函数字符串连接函数concat()的功能相似。的功能相似。5.5.3 group by5.5.3 group by子句与子句与group_concatgroup_concat()()函数函数MySQL数据库基础与实例教程数据库基础与实例教程group_concat()函函数数的的功功能能是是将将集集合合中中的的字字符符串串连连接接起起来来,此此时时group_concat()函函数数的的功功能能与与字符串连接函数字符串连接函数concat()的功能相似。的功能相似。例如下面例如下面SQL语句中的语句中的group_concat()函数以及函数以及concat()函数负责将集合中函数负责将

185、集合中(java,程序程序,设计设计)三个字符三个字符串连接起来。串连接起来。selectgroup_concat(java,程序程序,设计设计),concat(java,程序程序,设计设计);5.5.3 group by5.5.3 group by子句与子句与group_concatgroup_concat()()函数函数MySQL数据库基础与实例教程数据库基础与实例教程group_concat()函函数数还还可可以以按按照照分分组组字字段段,将将另另一一个个字字段段的的值值(NULL值值除除外外)使使用用逗逗号号连连接接起来。起来。concat()却函数没有提供这样的功能。却函数没有提供这

186、样的功能。5.5.3 group by5.5.3 group by子句与子句与group_concatgroup_concat()()函数函数MySQL数据库基础与实例教程数据库基础与实例教程groupby子子句句将将结结果果集集分分为为若若干干个个组组,使使用用聚聚合合函函数数可可以以对对每每个个组组内内的的数数据据进进行行信信息息统统计计,有有时时需需要要对对各各个个组组进进行行汇汇总总运运算算,则则需需要要在在每每个个分分组组后后加加上上一一条条汇汇总总记记录录,这这个个任任务务可可以以通通过过withrollup选项实现。选项实现。5.5.4 group by5.5.4 group b

187、y子句与子句与with rollupwith rollup选项MySQL数据库基础与实例教程数据库基础与实例教程5.6 5.6 合并合并结果集果集 使用使用unionunion可以将多个可以将多个select select 语句的查询结语句的查询结果集组合成一个结果集。果集组合成一个结果集。select select 字段列表字段列表1 from table1 1 from table1 union allunion allselect select 字段列表字段列表2 from table2.2 from table2.说明:字段列表说明:字段列表1 1与字段列表与字段列表2 2的字段个数必

188、须相的字段个数必须相同,且具有相同的数据类型。合并产生的新结果同,且具有相同的数据类型。合并产生的新结果集的字段名与字段列表集的字段名与字段列表1 1中的字段名对应。中的字段名对应。union与与unionall的区别:的区别:当当使使用用union时时,MySQL会会筛筛选选掉掉select结结果果集集中中重重复复的的记记录录(在在结结果果集集合合并并后后会会对对新新产产生生的的结结果果集集进进行行排排序序运运算算,效效率率稍稍低低)。而而使使用用unionall时时,MySQL会会直直接接合合并并两两个个结结果果集集,效效率率高高于于union。如如果果可可以以确确定定合合并并前前的的两两

189、个个结结果果集集中中不不包包含重复的记录,建议使用含重复的记录,建议使用unionall。5.6 5.6 合并结果集合并结果集如如果果一一个个select语语句句能能够够返返回回单单个个值值或或者者一一列列值值,且且该该select语语句句嵌嵌套套在在另另一一个个SQL语语句句中中(例例如如select语语句句、insert语语句句、update语语句句或或者者delete语语句句)中中,那那么么该该select语语句句称称为为子子查查询询(也也叫叫内内层层查查询询),包包含含子子查查询询的的SQL语语句句称称为为主主查查询询(也也叫叫外外层层查查询询)。为为了了标标记记子子查查询询与与主主查

190、查询询之之间的关系,通常将子查询写在小括号内。间的关系,通常将子查询写在小括号内。子查询分为相关子查询与非相关子查询。子查询分为相关子查询与非相关子查询。5.7 5.7 子查询子查询子子查查询询一一般般用用在在主主查查询询的的where子子句句或或having子子句句中中,与与比比较较运运算算符符或或者者逻逻辑辑运运 算算 符符 一一 起起 构构 成成where筛筛 选选 条条 件件 或或having筛选条件。筛选条件。1 12 23 3子子查询与与in运算符运算符子子查询与比与比较运算符运算符子子查询与与exists逻辑运算符运算符4子子查询与与any运算符运算符5子子查询与与all运算符运

191、算符5.7 5.7 子查询子查询MySQL数据库基础与实例教程数据库基础与实例教程如如果果子子查查询询返返回回单单个个值值,则则可可以以将将一一个个表表达达式式的值与子查询的结果集进行比较。的值与子查询的结果集进行比较。子查询可以仅仅使用自己定义的数据源,也可子查询可以仅仅使用自己定义的数据源,也可以以“直接引用直接引用”主查询中的数据源,但两者意义主查询中的数据源,但两者意义完全不同。完全不同。5.7.1 5.7.1 子子查询与比与比较运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程如果子查询中仅仅使用了自己定义的数据源,如果子查询中仅仅使用了自己定义的数据源,这种查询是非相关

192、子查询,非相关子查询是独立这种查询是非相关子查询,非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给主查询。行完毕后将值传递给主查询。如果子查询中使用了主查询的数据源,这种如果子查询中使用了主查询的数据源,这种查询是相关子查询,此时主查询的执行与相关子查询是相关子查询,此时主查询的执行与相关子查询的执行相互依赖。查询的执行相互依赖。5.7.1 5.7.1 子子查询与比与比较运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程子子查查询询经经常常与与in运运算算符符一一起起使使用用,用用于于将将一一个个表表达达式式的

193、的值值与与子子查查询询返返回回的的一一列列值值进进行行比比较较,如如果果表表达达式式的的值值是是此此列列中中的的任任何何一一个个值值,则则条条件件表表达式的结果为达式的结果为true;否则为;否则为false。5.7.2 5.7.2 子子查询与与inin运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程exists逻逻辑辑运运算算符符用用于于检检测测子子查查询询的的结结果果集集是是否否包包含含有有记记录录,如如果果结结果果集集中中至至少少包包含含一一条条记记录录,则则exists的的结结果果为为true;否否则则为为false。在在exists前面加上前面加上not时,与上述结果恰

194、恰相反。时,与上述结果恰恰相反。5.7.3 5.7.3 子子查询与与existsexists逻辑运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程any运算符通常与比较运算符一起使用。使用运算符通常与比较运算符一起使用。使用any运算符时,通过比较运算符将一个表达式的运算符时,通过比较运算符将一个表达式的值与子查询返回的一列值逐一进行比较,若某次值与子查询返回的一列值逐一进行比较,若某次的比较结果为的比较结果为true,则整个表达式的值为,则整个表达式的值为true;否则为否则为false。any逻辑运算符的语法格式如下。逻辑运算符的语法格式如下。表达式表达式比较运算符比较运算符a

195、ny(子查询子查询)5.7.4 5.7.4 子子查询与与anyany运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程举例来说:当比较运算符为大于号(举例来说:当比较运算符为大于号()时,)时,“表达式表达式any(子查询子查询)”表示至少大于子查询结表示至少大于子查询结果集中的某一个值(或者说大于结果集中的最小果集中的某一个值(或者说大于结果集中的最小值),那么整个表达式的结果为值),那么整个表达式的结果为true。5.7.4 5.7.4 子子查询与与anyany运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程all运算符通常与比较运算符一起使用。使用运算符通常与比

196、较运算符一起使用。使用all运算符时,通过比较运算符将一个表达式的值与运算符时,通过比较运算符将一个表达式的值与子查询返回的一列值逐一进行比较,若每次的比子查询返回的一列值逐一进行比较,若每次的比较结果都为较结果都为true,则整个表达式的值为,则整个表达式的值为true;否;否则为则为false。any逻辑运算符的语法格式如下。逻辑运算符的语法格式如下。表达式表达式比较运算符比较运算符all(子查询子查询)5.7.5 5.7.5 子子查询与与allall运算符运算符MySQL数据库基础与实例教程数据库基础与实例教程举例来说:当比较运算符为大于号(举例来说:当比较运算符为大于号()时,)时,“

197、表达式表达式all(子查询子查询)”表示大于子查询结果集表示大于子查询结果集中的任何一个值(或者说大于结果集中的最大值)中的任何一个值(或者说大于结果集中的最大值),那么整个表达式的结果为,那么整个表达式的结果为true。5.7.5 5.7.5 子子查询与与allall运算符运算符任务布置任务布置8:书写本章节的:书写本章节的select代码。代码。5.8 5.8 选课系统综合查询选课系统综合查询MySQL数据库基础与实例教程数据库基础与实例教程5.9 5.9 使用正使用正则表达式模糊表达式模糊查询 与与likelike运算符相似,正则表达式主要用于判运算符相似,正则表达式主要用于判断一个字符

198、串是否与给定的模式匹配,但正则表断一个字符串是否与给定的模式匹配,但正则表达式的模式匹配功能比达式的模式匹配功能比likelike运算符的模式匹配功运算符的模式匹配功能更为强大,且更加灵活。使用正则表达式进行能更为强大,且更加灵活。使用正则表达式进行模糊查询时,需要使用模糊查询时,需要使用regexpregexp关键字,语法格式关键字,语法格式如下。如下。字段名字段名 not not regexpregexp binary binary 正则表达式正则表达式 MySQL数据库基础与实例教程数据库基础与实例教程5.9 5.9 使用正使用正则表达式模糊表达式模糊查询 正则表达式由一些普通字符和一些

199、元字符构正则表达式由一些普通字符和一些元字符构成,普通字符包括大写字母、小写字母和数字,成,普通字符包括大写字母、小写字母和数字,而元字符具有特殊的含义。在最简单的情况下,而元字符具有特殊的含义。在最简单的情况下,一个正则表达式是一个不包含元字符的字符串。一个正则表达式是一个不包含元字符的字符串。例如正则表达式例如正则表达式testingtesting中没有包含任何元字中没有包含任何元字符,它可以匹配符,它可以匹配testingtesting、123testing123testing等字等字符串。符串。 MySQL数据库基础与实例教程数据库基础与实例教程5.9 5.9 使用正使用正则表达式模糊

200、表达式模糊查询常常用用的的元元字字符符 例如检索含有例如检索含有“java”的课程信息,可以使用的课程信息,可以使用下面的下面的SQL语句。语句。select*fromcoursewherecourse_nameregexpjava;5.9 5.9 使用正则表达式模糊查询使用正则表达式模糊查询例如检索以例如检索以“程序设计程序设计”结尾的课程信息,可结尾的课程信息,可以使用下面的以使用下面的SQL语句。语句。select*fromcoursewherecourse_nameregexp程序设计程序设计$;5.9 5.9 使用正则表达式模糊查询使用正则表达式模糊查询例如检索以例如检索以“j”开头

201、,以开头,以“程序设计程序设计”结尾结尾的课程信息,可以使用下面的的课程信息,可以使用下面的SQL语句。语句。select*fromcoursewherecourse_nameregexpj.*程序设计程序设计$;5.9 5.9 使用正则表达式模糊查询使用正则表达式模糊查询例如检索学生联系方式中以例如检索学生联系方式中以15开头或者开头或者18开头,开头,且后面跟着且后面跟着9位数字的学生信息,可以使用下面位数字的学生信息,可以使用下面的的SQL语句。语句。select*fromstudentwherestudent_contactregexp1580-99;5.9 5.9 使用正则表达式模糊

202、查询使用正则表达式模糊查询大多数时候,使用大多数时候,使用like关键字或者正则表达式关键字或者正则表达式对字符串进行模糊查询,需要对表进行全表扫描,对字符串进行模糊查询,需要对表进行全表扫描,检索效率较低。检索效率较低。通过全文检索,可以有效提升字符串检索效率。通过全文检索,可以有效提升字符串检索效率。5.10 5.10 全文检索全文检索简单地说,简单地说,MySQL全文检索使用特定的分词全文检索使用特定的分词技术、利用查询关键字和查询字段内容之间的相技术、利用查询关键字和查询字段内容之间的相关度进行检索,通过全文索引提高文本匹配的速关度进行检索,通过全文索引提高文本匹配的速度。全文检索的语

203、法格式如下。度。全文检索的语法格式如下。select字段列表字段列表from表名表名wherematch(全文索引字段全文索引字段1,全文索引字段全文索引字段2,.)against(搜索关键字搜索关键字全文检索方式全文检索方式)5.10 5.10 全文检索全文检索在在2011年发布的年发布的5.6版本中版本中InnoDB存储引存储引擎表实现了全文检索擎表实现了全文检索的支持,这将大幅提的支持,这将大幅提升升InnoDB存储引擎的存储引擎的字符串检索效率,实字符串检索效率,实现更快速、更高质量现更快速、更高质量的模糊查询。的模糊查询。1 12 23 3全文全文检索方式索方式全文全文检索的索的简单

204、应用用布布尔尔检索模式的复索模式的复杂应用用4MySQL全文全文检索的注意事索的注意事项5InnoDB表的全文表的全文检索索5.10 5.10 全文检索全文检索MySQL数据库基础与实例教程数据库基础与实例教程createtablebook(isbnchar(20)primarykey,namechar(100)notnull,brief_introductiontextnotnull,pricedecimal(6,2),publish_timedatenotnull,uniqueindexisbn_unique(isbn),indexname_index(name(20),fulltexti

205、ndexbrief_fulltext(name,brief_introduction),indexcomplex_index(price,publish_time)engine=MyISAMdefaultcharset=gbk; 创建书籍book表(注意该表为注意该表为MyISAM存储引擎),在存储引擎),在book表中的字段组合(name, brief_introduction)创建一个全文索引。5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程insertintobook(isbn,name,brief_introduction,pr

206、ice,publish_time)values(978-7-115-25626-3,PHPFundamentals&Practices,WebDatabaseApplicationsMySQLofferswebdevelopersamixtureoftheoreticalandpracticalinformationoncreatingwebdatabaseapplications.,42.0,2012-7-1),(978-7-115-25626-4,MySQLCOOKBOOK,TheMySQLdatabasemanagementsystemhasbecomequitepopularinrec

207、entyears.,128.0,2008-1-1),(978-7-115-25626-5,BeginningMySQL,MySQLisespeciallyheavilyusedincombinationwithawebserverforconstructingdatabase-backedwebsitesthatinvolvedynamiccontentgeneration.,98.0,2008-1-1);向向book表插入测试数据。表插入测试数据。5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程例如检索书名或者简介中涉及到例如检索书名

208、或者简介中涉及到practices单词单词的所有图书信息,可以使用下面的的所有图书信息,可以使用下面的SQL语句。语句。select*frombookwherematch(name,brief_introduction)against(practices)G5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程例如检索书名或者简介中涉及到例如检索书名或者简介中涉及到practices或者或者cookbook单词的所有图书信息,可以使用下面单词的所有图书信息,可以使用下面的的SQL语句。语句。select*frombookwherematch(

209、name,brief_introduction)against(practicescookbook)G5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程检索书名或者简介中涉及到检索书名或者简介中涉及到mysql单词的所有单词的所有图书信息,将检索失败。图书信息,将检索失败。MySQL在进行全文检索时,默认情况下将忽略在进行全文检索时,默认情况下将忽略权重超过权重超过50%的记录,的记录,50%称为阈值(注意读作:称为阈值(注意读作:yzh),),因此检索失败。因此检索失败。5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL

210、数据库基础与实例教程数据库基础与实例教程如果希望忽略阈值的因素,例如检索书名或者如果希望忽略阈值的因素,例如检索书名或者简介中涉及到简介中涉及到“mysql”单词的所有图书信息,可单词的所有图书信息,可以使用下面的以使用下面的SQL语句,执行结果如图语句,执行结果如图5-66所示,所示,该该SQL语句使用了布尔检索模式(稍后讲解)。语句使用了布尔检索模式(稍后讲解)。select*frombookwherematch(name,brief_introduction)against(mysqlinbooleanmode)G5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基

211、础与实例教程数据库基础与实例教程检索书名或者简介中涉及到检索书名或者简介中涉及到php单词的所有图单词的所有图书信息,将检索失败。书信息,将检索失败。这是由于这是由于MySQL全文检索对搜索关键字的最小全文检索对搜索关键字的最小(默认值为(默认值为4)以及最大长度(默认值为)以及最大长度(默认值为84)进)进行了设置。行了设置。5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程检索书名或者简介中涉及到检索书名或者简介中涉及到that单词的所有图单词的所有图书信息,将检索失败。书信息,将检索失败。这是由于这是由于MySQL内置了(内置了(b

212、uilt-in)545个停用个停用词,其中包括词,其中包括has、all、be、been、that等单词。等单词。5.10.1 5.10.1 全文全文检索的索的简单应用用MySQL数据库基础与实例教程数据库基础与实例教程常用的全文检索方式有三种:自然语言检索、常用的全文检索方式有三种:自然语言检索、布尔检索以及查询括展检索。布尔检索以及查询括展检索。(1)自然语言检索()自然语言检索(innaturallanguagemode)自然语言检索是全文检索中的默认类型,只能进自然语言检索是全文检索中的默认类型,只能进行单表查询,但存在阈值的限制。行单表查询,但存在阈值的限制。5.10.2 5.10.

213、2 全文全文检索方式索方式MySQL数据库基础与实例教程数据库基础与实例教程(2)布尔检索()布尔检索(inbooleanmode)布尔检索没有阈值的限制,且可以进行多表查询,布尔检索没有阈值的限制,且可以进行多表查询,还可以包含特定意义的操作符,如还可以包含特定意义的操作符,如+、-、等。等。5.10.2 5.10.2 全文全文检索方式索方式MySQL数据库基础与实例教程数据库基础与实例教程(3)查询括展检索()查询括展检索(withqueryexpansion)查询括展检索是对自然语言检索的一种改动查询括展检索是对自然语言检索的一种改动(自动自动关联度反馈关联度反馈),当查询短语太短时有用

214、。先进行自,当查询短语太短时有用。先进行自然语言检索,然后把关联度较高的记录中的词添然语言检索,然后把关联度较高的记录中的词添加到搜索关键字中进行二次自然语言检索,然后加到搜索关键字中进行二次自然语言检索,然后返回查询结果集。返回查询结果集。5.10.2 5.10.2 全文全文检索方式索方式MySQL数据库基础与实例教程数据库基础与实例教程布布尔尔检检索索模模式式的的against子子句句中中,可可以以在在搜搜索索关关键键字字前前添添加加特特定定意意义义的的操操作作符符,进进行行复复杂杂语语法法的的全文检索,常用的全文检索操作符如表所示。全文检索,常用的全文检索操作符如表所示。5.10.3 5

215、.10.3 布布尔尔检索模式的复索模式的复杂应用用MySQL数据库基础与实例教程数据库基础与实例教程禁用自定义的停用字,重启禁用自定义的停用字,重启MySQL服务器,并服务器,并重建全文索引后,检索书名或者简介中涉及重建全文索引后,检索书名或者简介中涉及“mysql”但不涉及但不涉及“php”单词的的所有图书信单词的的所有图书信息,可以使用下面的息,可以使用下面的SQL语句。语句。select*frombookwherematch(name,brief_introduction)against(+mysql-phpinbooleanmode)G5.10.3 5.10.3 布布尔尔检索模式的复索

216、模式的复杂应用用MySQL数据库基础与实例教程数据库基础与实例教程MySQL并不支持中文全文索引。并不支持中文全文索引。在自然语言检索中,只能检索被全文索引的在自然语言检索中,只能检索被全文索引的那些字段,如果要对索引的多个字段进行某一字那些字段,如果要对索引的多个字段进行某一字段的检索,必须对该字段创建单独的全文索引。段的检索,必须对该字段创建单独的全文索引。布尔检索可以在非全文索引的字段上进行,但检布尔检索可以在非全文索引的字段上进行,但检索效率会降低。索效率会降低。5.10.4 5.10.4 MySQLMySQL全文全文检索的注意事索的注意事项MySQL数据库基础与实例教程数据库基础与实

217、例教程全文检索没有记录关键词在字符串中的位置,全文检索没有记录关键词在字符串中的位置,排序算法比较单一。排序算法比较单一。全文检索不支持前缀索引。全文检索不支持前缀索引。全文检索会降低更新操作(全文检索会降低更新操作(insert、update以及以及delete)的效率。)的效率。5.10.4 5.10.4 MySQLMySQL全文全文检索的注意事索的注意事项MySQL数据库基础与实例教程数据库基础与实例教程InnoDB与与MyISAM存存储储引引擎擎实实现现全全文文检检索索的的方方法法不不同同,同同样样的的全全文文检检索索SQL语语句句,同同样样结结构构的的表表,相相同同的的表表记记录录,

218、全全文文检检索索的的返返回回结结果果可可能能不不同。同。任任务务布布置置9:完完成成本本书书场场景景描描述述8的的任任务务要要求求。并并分分析析InnoDB全全文文检检索索与与MyISAM全全文文检检索索的的区区别。别。5.10.5 5.10.5 InnoDBInnoDB表的全文表的全文检索索Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之MySQLMySQL编程基础编程基础为了便于为了便于MySQL代码维护,以及提高代码维护,以及提高MySQL代码的重用性,代码的重用性,MySQL开发人员经常将频繁使用开发人员经常将频繁使用的业务逻辑封装成存储程序,

219、的业务逻辑封装成存储程序,MySQL的存储程序的存储程序分为四类:函数、触发器、存储过程以及事件。分为四类:函数、触发器、存储过程以及事件。内容一览内容一览 1 12 23 3本章首先介绍了本章首先介绍了MySQL编程的基础知识,然后讲解编程的基础知识,然后讲解了自定义函数的实现方法,了自定义函数的实现方法,接着介绍了接着介绍了MySQL常用的常用的系统函数,最后结合系统函数,最后结合“选课选课系统系统”,编写自定义函数模,编写自定义函数模拟实现了中文全文检索。拟实现了中文全文检索。4 4自定义函数自定义函数MySQL编程基础知识编程基础知识系统函数系统函数中文全文检索的模拟实现中文全文检索的

220、模拟实现内容一览内容一览 1 12 23 3MySQL程序设计结程序设计结构是在构是在SQL标准的基标准的基础上增加了一些程序础上增加了一些程序设计语言的元素,其设计语言的元素,其中包括常量、变量、中包括常量、变量、运算符、表达式、流运算符、表达式、流程控制以及函数等内程控制以及函数等内容。容。用户自定义变量用户自定义变量常量常量运算符与表达式运算符与表达式45begin-end语句块语句块重置命令结束标记重置命令结束标记6.1 6.1 MySQLMySQL编程基础知识编程基础知识MySQL数据库基础与实例教程数据库基础与实例教程按照按照MySQL的数据类型进行划分,可以将的数据类型进行划分,

221、可以将常量划分为字符串常量、数值常量、十六进制常量划分为字符串常量、数值常量、十六进制常量、日期时间常量、二进制常量以及常量、日期时间常量、二进制常量以及NULL。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程1字符串常量字符串常量字符串常量是指用单引号或双引号括起来的字符串常量是指用单引号或双引号括起来的字符序列。字符序列。selectImateacherascol1,youreastudentascol2;由于大多编程语言(例如由于大多编程语言(例如Java、C等)使用等)使用双引号表示字符串,为了便于区分,在双引号表示字符串,为了便于区分,在MySQL

222、数据库中推荐使用单引号表示字符串。数据库中推荐使用单引号表示字符串。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程2数值常量数值常量数值常量可以分为整数常量(例如数值常量可以分为整数常量(例如2013)和小数常量(例如和小数常量(例如5.26、101.5E5),这里不),这里不再赘述。再赘述。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程3日期时间常量日期时间常量日期时间常量是一个符合特殊格式的字符串。日期时间常量是一个符合特殊格式的字符串。例如例如14:30:24是一个时间常量,是一个时间常量,2008-05-1214:

223、28:24是一个日期时间常量。日期时间常是一个日期时间常量。日期时间常量的值必须符合日期、时间标准,例如量的值必须符合日期、时间标准,例如1996-02-31是错误的日期常量。是错误的日期常量。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程3日期时间常量日期时间常量日期时间常量是一个符合特殊格式的字符串。日期时间常量是一个符合特殊格式的字符串。例如例如14:30:24是一个时间常量,是一个时间常量,2008-05-1214:28:24是一个日期时间常量。日期时间常是一个日期时间常量。日期时间常量的值必须符合日期、时间标准,例如量的值必须符合日期、时间标准,例

224、如1996-02-31是错误的日期常量。是错误的日期常量。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程4.布尔值布尔值布尔值只包含两个可能的值:布尔值只包含两个可能的值:true和和false。说明:使用说明:使用select语句显示布尔值语句显示布尔值true或者或者false时,会将其转换为字符串时,会将其转换为字符串“0”或者字符或者字符串串“1”。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程5二进制常量二进制常量二进制常量由数字二进制常量由数字“0”和和“1”组成。二进组成。二进制常量的表示方法:前缀为制常量的

225、表示方法:前缀为“b”,后面紧跟,后面紧跟一个一个“二进制二进制”字符串。例如下面的字符串。例如下面的select语语句输出三个字符。其中句输出三个字符。其中b111101表示表示“等号等号”,b1表示表示“笑脸笑脸”,b11表示表示“心心”。selectb111101,b1,b11;6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程6十六进制常量十六进制常量十六进制常量由数字十六进制常量由数字“0”到到“9”及字母及字母“a”到到“f”或或“A”到到“F”组成(字母不组成(字母不区分大小写)。十六进制常量有两种表示方区分大小写)。十六进制常量有两种表示方法。法

226、。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程6十六进制常量十六进制常量第一种表示方法:前缀为大写字母第一种表示方法:前缀为大写字母“X”或小或小写字母写字母“x”,后面紧跟一个,后面紧跟一个“十六进制十六进制”字字符串。符串。例如例如selectX41,x4D7953514C;其中其中X41表示大写字母表示大写字母A。x4D7953514C表表示字符串示字符串MySQL。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程6十六进制常量十六进制常量第二种表示方法:前缀为第二种表示方法:前缀为“0x”,后面紧跟,后面紧跟一个一

227、个“十六进制数十六进制数”(不用引号)。(不用引号)。例如例如select0x41,0x4D7953514C;其中其中0x41表示大写字母表示大写字母A。0x4D7953514C表示字符串表示字符串MySQL。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程小结:可以看到,使用小结:可以看到,使用select语句显示十六进语句显示十六进制数时,会将十六进制数自动转换为制数时,会将十六进制数自动转换为“字符字符串串”再进行显示。再进行显示。如果需要将一个字符串或数字转换为十六进如果需要将一个字符串或数字转换为十六进制格式的字符串,可以用制格式的字符串,可以用he

228、x()函数实现。函数实现。例如例如selecthex(MySQL);hex()函数将函数将“MySQL”字符串转换为十六进制字符串转换为十六进制数数4D7953514C。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程小结:十六进制数与字符之间存在一一对应小结:十六进制数与字符之间存在一一对应关系,利用这个特点,可以模拟实现中文全关系,利用这个特点,可以模拟实现中文全文检索。文检索。7.NULL值值NULL值可适用于各种字段类型,它通常用来值可适用于各种字段类型,它通常用来表示表示“值不确定值不确定”、“没有值没有值”等意义,等意义,NULL值参与算术运算、比

229、较运算以及逻辑运值参与算术运算、比较运算以及逻辑运算时,结果依然为算时,结果依然为NULL。6.1.1 6.1.1 常量常量MySQL数据库基础与实例教程数据库基础与实例教程变量分为系统变量(以变量分为系统变量(以开头)以及用户开头)以及用户自定义变量。自定义变量。用户自定义变量分为用户会话变量(以用户自定义变量分为用户会话变量(以开开头)以及局部变量(不以头)以及局部变量(不以开头)开头)。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程1用户会话变量用户会话变量MySQL客户机客户机1定义了会话变量,会话期间,定义了会话变量,会话期间,

230、该会话变量一直有效;该会话变量一直有效;MySQL客户机客户机2不能不能访问访问MySQL客户机客户机1定义的会话变量;定义的会话变量;MySQL客户机客户机1关闭或者关闭或者MySQL客户机客户机1与与服务器断开连接后,服务器断开连接后,MySQL客户机客户机1定义的定义的所有会话变量将自动释放,以便节省所有会话变量将自动释放,以便节省MySQL服务器的内存空间。服务器的内存空间。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程用用户户会会话话变变量量6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库

231、基础与实例教程1用户会话变量用户会话变量系统会话变量与用户会话变量的共同之处在系统会话变量与用户会话变量的共同之处在于:变量名大小写不敏感。系统会话变量与于:变量名大小写不敏感。系统会话变量与用户会话变量的区别在于:用户会话变量的区别在于:1用户会话变量用户会话变量一般以一个一般以一个“”开头;系统会话变量以两个开头;系统会话变量以两个“”开头。开头。2系统会话变量无需定义可以系统会话变量无需定义可以直接使用。直接使用。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程(1)用户会话变量的定义与赋值)用户会话变量的定义与赋值一般情况下,用户会

232、话变量的定义与赋值会一般情况下,用户会话变量的定义与赋值会同时进行。用户会话变量的定义与赋值有两同时进行。用户会话变量的定义与赋值有两种方法:使用种方法:使用set命令或者使用命令或者使用select语句。语句。方法一:使用方法一:使用set命令定义用户会话变量,并命令定义用户会话变量,并为其赋值,语法格式如下:为其赋值,语法格式如下:setuser_variable1expression1,user_variable2=expression2,6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程说说明明:用用户户会会话话变变量量的的数数据据类

233、类型型是是根根据据赋赋值值运运算算符符“=”右右边边表表达达式式的的计计算算结结果果自自动动分分配配的的。也也就就是是说说,等等号号右右边边的的值值(包包括括字字符符集集和和字字符符序序)决决定定了了用用户户会会话话变变量量的的数数据据类类型型(包括字符集和字符序)。(包括字符集和字符序)。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程方法二:使用方法二:使用select语句定义用户会话变量,语句定义用户会话变量,并为其赋值,语法格式有两种。并为其赋值,语法格式有两种。第一种语法格式:第一种语法格式:selectuser_variable

234、1:expression1,user_variable2:=expression2,第二种语法格式:第二种语法格式:selectexpression1intouser_variable1,expression2intouser_variable2,6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程方法二:使用方法二:使用select语句定义用户会话变量,语句定义用户会话变量,说明:说明:第一种语法格式中需要使用第一种语法格式中需要使用“:”赋值赋值语句,原因在于语句,原因在于“=”是为是为“比较比较”保留的。保留的。第一种与第二种语法格式的区

235、别在于:第第一种与第二种语法格式的区别在于:第一种语法格式中的一种语法格式中的select语句会产生结果集,语句会产生结果集,第二种语法格式中的第二种语法格式中的select语句,仅仅用于会语句,仅仅用于会话变量的定义及赋值(但不会产生结果集)。话变量的定义及赋值(但不会产生结果集)。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程2用户会话变量与用户会话变量与SQL语句语句任务布置任务布置1:上机操作,完成本书场景描述:上机操作,完成本书场景描述1:用户会话变量与:用户会话变量与SQL语句的任务要求。语句的任务要求。注意:哪些方法的注意:

236、哪些方法的select语句产生结果集语句产生结果集?哪哪些方法的些方法的select语句不产生结果集语句不产生结果集?6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程3局部变量局部变量declare命命令令专专门门用用于于定定义义局局部部变变量量及及对对应应的的数数据据类类型型。局局部部变变量量必必须须定定义义在在存存储储程程序序中中(例例如如函函数数、触触发发器器、存存储储过过程程以以及及事事件件中中),并并且且局局部部变变量量的的作作用用范范围围仅仅仅仅局局限限于于存存储储程程序序中中,脱脱离离存存储储程程序序,局局部部变变量量没没有有

237、丝丝毫毫意义。局部变量主要用于下面三种场合。意义。局部变量主要用于下面三种场合。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程3局部变量局部变量场场合合一一:局局部部变变量量定定义义在在存存储储程程序序的的begin-end语语句句块块(稍稍后后介介绍绍)之之间间。此此时时局局部部变变量量首首先先必必须须使使用用declare命命令令定定义义,并并且且必必须须指指定定局局部部变变量量的的数数据据类类型型。只只有有定定义义局局部部变变量量后后,才才可可以以使使用用set命命令令或或者者select语语句句为为其其赋值。赋值。6.1.2 6.

238、1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程3局部变量局部变量场合二:局部变量作为存储过程或者函数的场合二:局部变量作为存储过程或者函数的参数使用,此时虽然不需要使用参数使用,此时虽然不需要使用declare命令命令定义,但需要指定参数的数据类型。定义,但需要指定参数的数据类型。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程3局部变量局部变量场合三:局部变量也可以用在场合三:局部变量也可以用在SQL语句中。语句中。数据检索时,如果数据检索时,如果select语句的结果集是单个语句的结果集是单个值,

239、可以将值,可以将select语句的返回结果赋予局部变语句的返回结果赋予局部变量,局部变量也可以直接嵌入到量,局部变量也可以直接嵌入到select、insert、update以及以及delete语句的条件表达式语句的条件表达式中。中。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(1)用户会话变量名以)用户会话变量名以“”开头,而局部开头,而局部变量名前面没有变量名前面没有“”符号。符号。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实

240、例教程(2)局部变量使用)局部变量使用declare命令定义(存储过程命令定义(存储过程参数、函数参数除外),定义时必须指定局部变参数、函数参数除外),定义时必须指定局部变量的数据类型;局部变量定义后,才可以使用量的数据类型;局部变量定义后,才可以使用set命令或者命令或者select语句为其赋值。语句为其赋值。用户会话变量使用用户会话变量使用set命令或命令或select语句定义并进语句定义并进行赋值,定义用户会话变量时无需指定数据类型。行赋值,定义用户会话变量时无需指定数据类型。诸如诸如“declarestudent_noint;”的语句是错误的语句是错误语句,用户会话变量不能使用语句,用

241、户会话变量不能使用declare命令定义。命令定义。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(3)用户会话变量的作用范围与生存周期大)用户会话变量的作用范围与生存周期大于局部变量。局部变量如果作为存储过程或于局部变量。局部变量如果作为存储过程或者函数的参数,此时在整个存储过程或函数者函数的参数,此时在整个存储过程或函数内中有效;如果定义在存储程序的内中有效;如果定义在存储程序的begin-end语句块中,此时仅在当前的语句块中,此时仅在当前的begin-end语句块语句块中有

242、效。用户会话变量在本次会话期间一直中有效。用户会话变量在本次会话期间一直有效,直至关闭服务器连接。有效,直至关闭服务器连接。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(4)如果局部变量嵌入到)如果局部变量嵌入到SQL语句中,由于语句中,由于局部变量名前没有局部变量名前没有“”符号,这就要求局部符号,这就要求局部变量名不能与表字段名同名,否则将出现无变量名不能与表字段名同名,否则将出现无法预期的结果。法预期的结果。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据

243、库基础与实例教程数据库基础与实例教程关于局部变量的其他说明:关于局部变量的其他说明:在在MySQL数据库中,由于局部变量涉及数据库中,由于局部变量涉及begin-end语句块、函数、存储过程等知识,语句块、函数、存储过程等知识,局部变量的具体使用方法将结合这些知识稍局部变量的具体使用方法将结合这些知识稍后一块儿进行讲解。后一块儿进行讲解。declare命令尽量写在命令尽量写在begin-end语句块的开语句块的开头,尽量写在任何其他语句的前面。头,尽量写在任何其他语句的前面。6.1.2 6.1.2 用户自定义变量用户自定义变量MySQL数据库基础与实例教程数据库基础与实例教程根据运算符功能的不

244、同,可将根据运算符功能的不同,可将MySQL的运算的运算符分为算术运算符、比较运算符、逻辑运算符分为算术运算符、比较运算符、逻辑运算符以及位操作运算符。符以及位操作运算符。1算术运算符算术运算符算术运算符用于两个操作数之间执行算术运算术运算符用于两个操作数之间执行算术运算。常用的算术运算符有:算。常用的算术运算符有:+(加)、(加)、-(减)(减)、*(乘)、(乘)、/(除)、(除)、%(求余)以及(求余)以及div(求商)等(求商)等6种运算符。种运算符。6.1.3 6.1.3 运算符与表达式运算符与表达式MySQL数据库基础与实例教程数据库基础与实例教程2比较运算符比较运算符比较运算符(又

245、称关比较运算符(又称关系运算符)用于比较系运算符)用于比较操作数之间的大小关操作数之间的大小关系,其运算结果要么系,其运算结果要么为为true、要么为、要么为false、要么为要么为NULL(不确定)(不确定)。6.1.3 6.1.3 运算符与表达式运算符与表达式MySQL数据库基础与实例教程数据库基础与实例教程selectab=ab,ab=ab,ba,NULL=NULL,NULLNULL,NULLisNULL;结结论论:字字符符串串进进行行比比较较时时,会会截截掉掉字字符符串串尾尾部的空格字符,然后进行比较。部的空格字符,然后进行比较。6.1.3 6.1.3 运算符与表达式运算符与表达式My

246、SQL数据库基础与实例教程数据库基础与实例教程3 3逻辑运算符逻辑运算符逻辑运算符(又称布尔运算符)对布尔值进逻辑运算符(又称布尔运算符)对布尔值进行操作,其运算结果要么为行操作,其运算结果要么为truetrue、要么为、要么为falsefalse、要么为、要么为NULLNULL(不确定)。(不确定)。 6.1.3 6.1.3 运算符与表达式运算符与表达式MySQL数据库基础与实例教程数据库基础与实例教程4位运算符位运算符位运算符对二进制数据进行操作(如果不是位运算符对二进制数据进行操作(如果不是二进制类型的数,将进行类型自动转换),二进制类型的数,将进行类型自动转换),其运算结果为二进制数。

247、使用其运算结果为二进制数。使用select语句显示语句显示二进制数时,会将其自动转换为十进制数显二进制数时,会将其自动转换为十进制数显示。示。 6.1.3 6.1.3 运算符与表达式运算符与表达式MySQL数据库基础与实例教程数据库基础与实例教程4位运算符位运算符6.1.3 6.1.3 运算符与表达式运算符与表达式MySQL数据库基础与实例教程数据库基础与实例教程 开始标签开始标签: begin: begin 局部局部 变量的声明变量的声明; ;错误触发条件的声明错误触发条件的声明; ;游标的声明游标的声明; ; 错误处理程序的声明错误处理程序的声明; ;业务逻辑代码业务逻辑代码; ;ende

248、nd结束标签结束标签 ; ;6.1.5 6.1.5 重置命令结束标记重置命令结束标记MySQL数据库基础与实例教程数据库基础与实例教程delimiter $delimiter $select * from student where select * from student where student_namestudent_name like like 张张_$_$delimiter ;delimiter ;select * from student where select * from student where student_namestudent_name like like 张

249、张_;_;6.1.4 begin-end6.1.4 begin-end语句块语句块1 12 23 3函数可以看作是一个函数可以看作是一个“加工作坊加工作坊”,这个,这个“加加工作坊工作坊”接收接收“调用者调用者”传递过来的传递过来的“原料原料”(实际上是函数的参(实际上是函数的参数),然后将这些数),然后将这些“原原料料”“加工处理加工处理”成成“产品产品”(实际上是函数(实际上是函数的返回值),再把的返回值),再把“产产品品”返回给返回给“调用者调用者”。函数的创建与调用函数的创建与调用创建自定义函数的语法格式创建自定义函数的语法格式函数的维护函数的维护45条件控制语句条件控制语句循环语句循

250、环语句6.2 6.2 定义函数定义函数MySQL数据库基础与实例教程数据库基础与实例教程createfunction函数名(参数函数名(参数1,参数,参数2,)returns返回值的数据类型返回值的数据类型函数选项函数选项begin函数体函数体;return语句语句;end;6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程函数选项由以下一种或几种选项组合而成。函数选项由以下一种或几种选项组合而成。languagesql|notdeterministic|containssql|nosql|readssqldata|mod

251、ifiessqldata|sqlsecuritydefiner|invoker|comment注释注释6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程函数选项说明:函数选项说明:languagesql:默认选项,用于说明函数体:默认选项,用于说明函数体使用使用SQL语言编写。语言编写。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程deterministic(确定性):当函数返回不确定值(确定性):当函数返回不确定值时,该选项是为了防止时,该选项是

252、为了防止“复制复制”时的不一致性。时的不一致性。如果函数总是对同样的输入参数产生同样的结果,如果函数总是对同样的输入参数产生同样的结果,则被认为它是则被认为它是“确定的确定的”,否则就是,否则就是“不确定不确定”的。例如函数返回系统当前的时间,返回值是不的。例如函数返回系统当前的时间,返回值是不确定的。如果既没有给定确定的。如果既没有给定deterministic也没有给也没有给定定notdeterministic,默认的就是,默认的就是notdeterministic。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程c

253、ontainssql:表示函数体中不包含读或写数:表示函数体中不包含读或写数据的语句(例如据的语句(例如set命令等)。命令等)。nosql:表示函数体中不包含:表示函数体中不包含SQL语句。语句。readssqldata:表示函数体中包含:表示函数体中包含select查查询语句,但不包含更新语句。询语句,但不包含更新语句。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程modifiessqldata:表示函数体包含更新语:表示函数体包含更新语句。如果上述选项没有明确指定,默认是句。如果上述选项没有明确指定,默认是con

254、tainssql。sqlsecurity:用于指定函数的执行许可。:用于指定函数的执行许可。definer:表示该函数只能由创建者调用。:表示该函数只能由创建者调用。invoker:表示该函数可以被其他数据库用户:表示该函数可以被其他数据库用户调用。默认值是调用。默认值是definer。comment:为函数添加功能说明等注释信息。:为函数添加功能说明等注释信息。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置2:上机操作,完成本书场景描述:上机操作,完成本书场景描述2:简单的自定义函数(空参数)的任务要

255、求。:简单的自定义函数(空参数)的任务要求。任务布置任务布置3:上机操作,完成场景描述:上机操作,完成场景描述3:自:自定义函数可以操作数据库中的数据的任务要定义函数可以操作数据库中的数据的任务要求。求。任务布置任务布置4:上机操作,完成场景描述:上机操作,完成场景描述4:将:将查询结果赋予变量的任务要求。查询结果赋予变量的任务要求。6.2.2 6.2.2 函数的创建与调用函数的创建与调用MySQL数据库基础与实例教程数据库基础与实例教程函函数数的的维维护护包包括括查查看看函函数数的的定定义义、修修改改函函数数的定义以及删除函数的定义等内容。的定义以及删除函数的定义等内容。6.2.3 6.2.

256、3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程1查看函数的定义查看函数的定义(1)查看当前数据库中所有的自定义函数信)查看当前数据库中所有的自定义函数信息,可以使用息,可以使用MySQL命令命令“showfunctionstatus;”。如果自定义函数较多,使用。如果自定义函数较多,使用MySQL命令命令“showfunctionstatuslike模模式式;”可以进行模糊查询。可以进行模糊查询。 6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程1查看函数的定义查看函数的定义(2)查看指定数据库(例如)查看指定数据库(例

257、如choose数据库)数据库)中的所有自定义函数名,可以使用下面的中的所有自定义函数名,可以使用下面的SQL语句,如图语句,如图6-28所示。所示。selectnamefrommysql.procwheredb=chooseandtype=function;6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程1 1查看函数的定义查看函数的定义(3 3)使用)使用MySQLMySQL命令命令“show create show create function function 函数名函数名; ;”可以查看指定函数名的可以查看指定函数名的详细信息。例如查看详

258、细信息。例如查看get_name_fnget_name_fn()()函数的详函数的详细信息,可以使用细信息,可以使用“show create function show create function get_name_fnget_name_fnGG” 6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程1 1查看函数的定义查看函数的定义(4 4)函数的信息都保存在)函数的信息都保存在information_schemainformation_schema数据库中的数据库中的routinesroutines表表中,可以使用中,可以使用selectsel

259、ect语句检索语句检索routinesroutines表,表,查询函数的相关信息。查询函数的相关信息。select * from select * from information_schema.routinesinformation_schema.routines where where routine_nameroutine_name=get_name_fnget_name_fnGG6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程2 2函数定义的修改函数定义的修改由于函数保存的仅仅是函数体,而函数体实际由于函数保存的仅仅是函数体,而函数体实际上

260、是一些上是一些MySQLMySQL表达式,因此函数自身不保存任表达式,因此函数自身不保存任何用户数据。当函数的函数体需要更改时,可何用户数据。当函数的函数体需要更改时,可以使用以使用drop functiondrop function语句暂时将函数的定义删语句暂时将函数的定义删除,然后使用除,然后使用create functioncreate function语句重新创建相语句重新创建相同名字的函数即可。这种方法对于存储过程、同名字的函数即可。这种方法对于存储过程、视图、触发器的修改同样适用。视图、触发器的修改同样适用。6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程

261、数据库基础与实例教程3 3函数定义的删除函数定义的删除使用使用MySQLMySQL命令命令“drop functiondrop function函数名函数名”删删除自定义函数。例如删除除自定义函数。例如删除get_name_fnget_name_fn()()函数函数可以使用可以使用“drop function drop function get_name_fnget_name_fn; ;” 。6.2.3 6.2.3 函数的维护函数的维护MySQL数据库基础与实例教程数据库基础与实例教程条条件件控控制制语语句句分分为为两两种种,一一种种是是ifif语语句句,另另一种是一种是casecase语句。

262、语句。6.2.4 6.2.4 条件控制语句条件控制语句MySQL数据库基础与实例教程数据库基础与实例教程1 1ifif语句语句ifif语句根据条件表达式的值确定执行不同的语句根据条件表达式的值确定执行不同的语句块,语句块,ifif语句的用法格式如下。语句的用法格式如下。if if 条件表达式条件表达式1 then 1 then 语句块语句块1;1; elseifelseif 条件表达式条件表达式2 then2 then语句块语句块2 .2 .elseelse语句块语句块nnend if;end if;说明:说明:end ifend if后必须以后必须以“; ;”结束。结束。6.2.4 6.2.

263、4 条件控制语句条件控制语句MySQL数据库基础与实例教程数据库基础与实例教程6.2.4 6.2.4 条件控制语句条件控制语句MySQL数据库基础与实例教程数据库基础与实例教程2 2casecase语句语句casecase语句用于实现比语句用于实现比ifif语句分支更为复杂的语句分支更为复杂的条件判断,条件判断,casecase语句的语法格式如下。语句的语法格式如下。说明:说明:MySQLMySQL中的中的casecase语句与语句与C C语言、语言、JavaJava语语言等高级程序设计语言不同,在高级程序设言等高级程序设计语言不同,在高级程序设计语言中,每个计语言中,每个casecase的分

264、支需使用的分支需使用“breakbreak”跳出,而跳出,而MySQLMySQL无需使用无需使用“breakbreak”语句。语句。6.2.4 6.2.4 条件控制语句条件控制语句MySQL数据库基础与实例教程数据库基础与实例教程2 2casecase语句语句case case 表达式表达式when value1 then when value1 then 语句块语句块1;1;when value2 then when value2 then 语句块语句块2;2;else else 语句块语句块n;n;end case;end case;6.2.4 6.2.4 条件控制语句条件控制语句MySQ

265、L数据库基础与实例教程数据库基础与实例教程6.2.4 6.2.4 条件控制语句条件控制语句MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL提提供供了了三三种种循循环环语语句句,分分别别是是whilewhile、repeatrepeat以以及及looploop。除除此此以以外外,MySQLMySQL还还提提供供了了iterateiterate语语句句以以及及leaveleave语语句句用用于于循循环环的的内内部部控制。控制。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程1 1whilewhile语句语句当条件表达式的值为当条件表达

266、式的值为truetrue时,反复执行循环时,反复执行循环体,直到条件表达式的值为体,直到条件表达式的值为falsefalse,whilewhile语语句的语法格式如下。句的语法格式如下。 循环标签循环标签:while :while 条件表达式条件表达式 dodo循环体循环体; ;end while end while 循环标签循环标签;说明:说明:end whileend while后必须以后必须以“; ;”结束。结束。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例

267、教程2 2leaveleave语句语句leaveleave语句用于跳出当前的循环语句(例如语句用于跳出当前的循环语句(例如whilewhile语句),语法格式如下。语句),语法格式如下。leave leave 循环标签循环标签; ;说明:说明:leave leave 循环标签后必须以循环标签后必须以“; ;”结束。结束。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程3 3iterateiterate语句语句iterateiterate语句用于跳出本次循环,继而进行下语句用于跳出本次循环,继而进行下次循环。次循环。iterateiterate语句的语法

268、格式如下。语句的语法格式如下。iterate iterate 循环标签循环标签; ;说明:说明:iterateiterate循环标签后必须以循环标签后必须以“; ;”结束。结束。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程4 4repeatrepeat语句语句当条件表达式的值为当条件表达式的值为falsefalse时,反复执行循环,时,反复执行循环,直到条件表达式的值为直到条件表达式的值为truetrue,repeatrepeat语句的语句的语法格式如下。语法格式如下。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础

269、与实例教程4 4repeatrepeat语句语句 循环标签循环标签:repeat :repeat 循环体循环体; ;until until 条件表达式条件表达式end repeat end repeat 循环标签循环标签;说明:说明:end repeatend repeat后必须以后必须以“; ;”结束。结束。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程5 5looploop语句的语法格式语句的语法格式由于由于looploop循环语句本身没有停止循环的语句,循环语句本身没有停止循环的语句,因此因此looploop通常使用通常使用leaveleave

270、语句跳出语句跳出looploop循环,循环,looploop的语法格式如下。的语法格式如下。6.2.5 6.2.5 循环语句循环语句MySQL数据库基础与实例教程数据库基础与实例教程5 5looploop语句的语法格式语句的语法格式 循环标签循环标签: loop: loop循环体循环体; ;if if 条件表达式条件表达式 then then leave leave 循环标签循环标签; ; end if;end if;end loop;end loop;说明:说明:end loopend loop后必须以后必须以“; ;”结束。结束。6.2.5 6.2.5 循环语句循环语句1 12 23 3

271、MySQLMySQL功能强大的一功能强大的一个重要原因是个重要原因是MySQLMySQL内内置了许多功能丰富的置了许多功能丰富的函数。函数。字符串函数字符串函数数学函数数学函数数据数据类型型转换函数函数45条件控制函数条件控制函数系系统信息函数信息函数6.3 6.3 系统函数系统函数6 67 7 本章讲解的所有本章讲解的所有函数函数f(xf(x) )对数据对数据x x进行进行操作时,都会产生返操作时,都会产生返回结果,并且数据回结果,并且数据x x的的值以及值以及x x的数据类型都的数据类型都不会发生丝毫变化。不会发生丝毫变化。 日期和日期和时间函数函数其他常用的其他常用的MySQLMySQL

272、函数函数6.3 6.3 系统函数系统函数MySQL数据库基础与实例教程数据库基础与实例教程为为了了便便于于读读者者学学习习,本本书书将将数数学学函函数数归归纳纳为为三三角角函函数数,指指数数函函数数及及对对数数函函数数,求求近近似似值值函数,随机函数,二进制、十六进制函数等。函数,随机函数,二进制、十六进制函数等。6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程1 1三角函数三角函数MySQLMySQL提供了提供了pi()pi()函数计算圆周率;函数计算圆周率;radians(xradians(x) )函数负责将角度函数负责将角度x x转换为弧度;转换

273、为弧度;degrees(xdegrees(x) )函数负责将弧度函数负责将弧度x x转换为角度。转换为角度。 MySQLMySQL还提供了三角函数,正弦函数还提供了三角函数,正弦函数sin(x)sin(x)、余弦函数余弦函数cos(x)cos(x)、tan(x)tan(x)正切函数、余切函正切函数、余切函数数cot(x)cot(x)、反正弦函数、反正弦函数asin(x)asin(x)、反余弦函数、反余弦函数acos(x)acos(x)以及反正切函数以及反正切函数atan(x)atan(x)。 6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程2 2指数函

274、数及对数函数指数函数及对数函数MySQLMySQL中常用的指数函数有中常用的指数函数有sqrt()sqrt()平方根函数、平方根函数、pow(x,y) pow(x,y) 幂运算函数(计算幂运算函数(计算x x的的y y次方)以及次方)以及exp(x)exp(x)函数(计算函数(计算e e的的x x次方)。次方)。说明:说明:pow(x,y) pow(x,y) 幂运算函数还有一个别名函幂运算函数还有一个别名函数:数:power(x,y)power(x,y),实现相同的功能。,实现相同的功能。6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程2 2指数函数及

275、对数函数指数函数及对数函数MySQLMySQL中常用的对数函数有中常用的对数函数有log(x)log(x)函数(计算函数(计算x x的自然对数)以及的自然对数)以及log10(x)log10(x)函数(计算以函数(计算以1010为底的对数)。为底的对数)。 6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程3 3求近似值函数求近似值函数MySQLMySQL提供的提供的round(x)round(x)函数负责计算离函数负责计算离x x最近最近的整数,的整数,round(x,y)round(x,y)函数负责计算离函数负责计算离x x最近的最近的小数(小数点后

276、保留小数(小数点后保留y y位);位);truncate(x,y)truncate(x,y)函数负责返回小数点后保留函数负责返回小数点后保留y y位的位的x x(舍弃多(舍弃多余小数位,不进行四舍五入);余小数位,不进行四舍五入);6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程3 3求近似值函数求近似值函数format(x,yformat(x,y) )函数负责返回小数点后保留函数负责返回小数点后保留y y位位的的x x(进行四舍五入);(进行四舍五入);ceil(x)ceil(x)函数负责返函数负责返回大于等于回大于等于x x的最小整数;的最小整数;

277、floor(x)floor(x)函数负责函数负责返回小于等于返回小于等于x x的最大整数。的最大整数。 6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程4 4随机函数随机函数MySQLMySQL提供了提供了rand()rand()函数负责返回随机数。函数负责返回随机数。 6.3.1 6.3.1 数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程5 5二进制、十六进制函数二进制、十六进制函数bin(xbin(x) )函数、函数、oct(xoct(x) )函数和函数和hex(xhex(x) )函数分别函数分别返回返回x x的二进制、八进制和

278、十六进制数;的二进制、八进制和十六进制数;ascii(cascii(c) )函数返回字符函数返回字符c c的的ASCIIASCII码(码(ASCIIASCII码码介于介于0 0255255););char (c1,c2,c3,char (c1,c2,c3,) ) 函数将函数将c1c1、c2c2的的ASCIIASCII码转换为字符,然后返回码转换为字符,然后返回这些字符组成的字符串;这些字符组成的字符串;conv(x,code1,code2)conv(x,code1,code2)函数将函数将code1code1进制的进制的x x变变为为code2code2进制数。进制数。6.3.1 6.3.1

279、数学函数数学函数MySQL数据库基础与实例教程数据库基础与实例教程为便于学习,可以将字符串函数归纳为字符为便于学习,可以将字符串函数归纳为字符串基本信息函数、加密函数、字符串连接函串基本信息函数、加密函数、字符串连接函数、修剪函数、子字符串操作函数、字符串数、修剪函数、子字符串操作函数、字符串复制函数、字符串比较函数以及字符串逆序复制函数、字符串比较函数以及字符串逆序函数等。函数等。6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程注意:字符串函数在对字符串操作时,字符注意:字符串函数在对字符串操作时,字符集、字符序的设置至关重要。同一个字符串集、字

280、符序的设置至关重要。同一个字符串函数,对同一个字符串进行操作,如果字符函数,对同一个字符串进行操作,如果字符集或者字符序设置不同,操作结果可能不同。集或者字符序设置不同,操作结果可能不同。6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程1 1字符串基本信息函数字符串基本信息函数字符串基本信息函数包括获取字符串字符集字符串基本信息函数包括获取字符串字符集的函数、获取字符串长度以及获取字符串占的函数、获取字符串长度以及获取字符串占用字节数的函数等。用字节数的函数等。(1 1)关于字符串字符集的函数)关于字符串字符集的函数charset(xcharset

281、(x) )函数返回函数返回x x的字符集;的字符集;collation(xcollation(x) )函数返回函数返回x x的字符序。的字符序。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程1 1字符串基本信息函数字符串基本信息函数(1 1)关于字符串字符集的函数)关于字符串字符集的函数convert(xconvert(x using using charsetcharset) )函数返回函数返回x x的的charsetcharset字符集数据(注意字符集数据(注意x x的字符集没有变的字符集没有变化)。化)。 6.3.2 6.3.2 字符串函

282、数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程1 1字符串基本信息函数字符串基本信息函数(2 2)获取字符串长度以及获取字符串占用字)获取字符串长度以及获取字符串占用字节数函数节数函数char_length(xchar_length(x) )函数用于获取字符串函数用于获取字符串x x的长度;的长度;length(xlength(x) )函数用于获取字符串函数用于获取字符串x x的占用的字的占用的字节数。节数。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程2 2加密函数加密函数加密函数包括不可逆加密函数以及加密加密函数包括不可逆加

283、密函数以及加密- -解密解密函数。函数。(1 1)不可逆加密函数)不可逆加密函数password(xpassword(x) )函数用于对函数用于对x x进行加密,默认返进行加密,默认返回回4141位的加密字符串;位的加密字符串;md5(x)md5(x)函数用于对函数用于对x x进进行加密,默认返回行加密,默认返回3232位的加密字符串。位的加密字符串。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程2 2加密函数加密函数(2 2)加密)加密- -解密函数解密函数MySQLMySQL提供了两对加密提供了两对加密- -解密函数分别是:解密函数分别是:

284、encode(x,keyencode(x,key) )函数与函数与decode(passworddecode(password, , key)key)函数以及函数以及aes_encrypt(x,keyaes_encrypt(x,key) ) 函数与函数与aes_decrypt(password,keyaes_decrypt(password,key) ) 函数。其中函数。其中keykey为加密密钥(注意读作为加密密钥(注意读作m m yuyu ),需要牢记加),需要牢记加密时的密钥才能实现密码的解密。密时的密钥才能实现密码的解密。6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础

285、与实例教程数据库基础与实例教程2 2加密函数加密函数(2 2)加密)加密- -解密函数解密函数encode(x,keyencode(x,key) )函数使用密钥函数使用密钥keykey对对x x进行加密,进行加密,默认返回值是一个二进制数(二进制的位数默认返回值是一个二进制数(二进制的位数由由x x的字节长度决定);的字节长度决定);decode(passworddecode(password, , key)key)函数使用密钥函数使用密钥keykey对密码对密码passwordpassword进行解进行解密。密。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据

286、库基础与实例教程2 2加密函数加密函数(2 2)加密)加密- -解密函数解密函数aes_encrypt(x,keyaes_encrypt(x,key) )函数使用密钥函数使用密钥keykey对对x x进进行加密,默认返回值是一个行加密,默认返回值是一个128128位的二进制数;位的二进制数;aes_decrypt(passwordaes_decrypt(password, key), key)函数使用密钥函数使用密钥keykey对密码对密码passwordpassword进行解密。进行解密。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程3 3字

287、符串连接函数字符串连接函数concat(x1,x2,concat(x1,x2,.).)函数用于将函数用于将x1x1、x2x2等若干等若干个字符串连接成一个新字符串;个字符串连接成一个新字符串;concat_ws(x,x1,x2,concat_ws(x,x1,x2,.).)函数使用函数使用x x将将x1x1、x2x2等若干个字符串连接成一个新字符串。等若干个字符串连接成一个新字符串。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程4 4修剪函数修剪函数修剪函数包括字符串裁剪函数、字符串大小修剪函数包括字符串裁剪函数、字符串大小写转换函数、填充字符串

288、函数等函数。写转换函数、填充字符串函数等函数。(1 1)字符串裁剪函数)字符串裁剪函数ltrim(xltrim(x) )函数用于去掉字符串函数用于去掉字符串x x开头的所有空开头的所有空格字符;格字符;rtrim(xrtrim(x) )函数用于去掉字符串函数用于去掉字符串x x结尾结尾的所有空格字符;的所有空格字符;trim(xtrim(x) )函数用于去掉字符函数用于去掉字符串串x x开头以及结尾的所有空格字符。开头以及结尾的所有空格字符。6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程4 4修剪函数修剪函数(1 1)字符串裁剪函数)字符串裁剪函

289、数trim(leadingtrim(leading | both | trailing x1 | both | trailing x1 from x2)from x2)函数用于从函数用于从x2x2字符串的前缀或者字符串的前缀或者(以及)后缀中去掉字符串(以及)后缀中去掉字符串x1x1。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程4 4修剪函数修剪函数(1 1)字符串裁剪函数)字符串裁剪函数left(x,nleft(x,n) )函数以及函数以及righ(x,nrigh(x,n) )函数也用于截函数也用于截取字符串。其中取字符串。其中left(x

290、,nleft(x,n) )函数返回字符串函数返回字符串x x的前的前n n个字符;个字符;right(x,nright(x,n) )函数返回字符串函数返回字符串x x的后的后n n个字符。个字符。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程4 4修剪函数修剪函数(2 2)字符串大小写转换函数)字符串大小写转换函数upper(xupper(x) )函数以及函数以及ucase(xucase(x) )函数将字符串函数将字符串x x中中的所有字母变成大写字母,字符串的所有字母变成大写字母,字符串x x并没有发并没有发生变化;生变化;lower(xlo

291、wer(x) )函数以及函数以及lcase(xlcase(x) )函数将函数将字符串字符串x x中的所有字母变成小写字母,字符串中的所有字母变成小写字母,字符串x x并没有发生变化。并没有发生变化。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程4 4修剪函数修剪函数(3 3)填充字符串函数)填充字符串函数lpad(x1,len,x2)lpad(x1,len,x2)函数将字符串函数将字符串x2x2填充到填充到x1x1的的开始处,使字符串开始处,使字符串x1x1的长度达到的长度达到lenlen;rpad(x1,len,x2)rpad(x1,len,

292、x2)函数将字符串函数将字符串x2x2填充到填充到x1x1的的结尾处,使字符串结尾处,使字符串x1x1的长度达到的长度达到lenlen。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程5 5子字符串操作函数子字符串操作函数子字符串操作函数包括取出指定位置的子字子字符串操作函数包括取出指定位置的子字符串函数、在字符串中查找指定子字符串的符串函数、在字符串中查找指定子字符串的位置函数、子字符串替换函数等。位置函数、子字符串替换函数等。 (1) (1) 取出指定位置的子字符串函数取出指定位置的子字符串函数substring(x,start,length

293、substring(x,start,length) )函数与函数与mid(x,start,lengthmid(x,start,length) )函数都是从字符串函数都是从字符串x x的的第第n n个位置开始获取个位置开始获取lengthlength长度的字符串。长度的字符串。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程5 5子字符串操作函数子字符串操作函数(2 2)在字符串中查找指定子字符串的位置函数)在字符串中查找指定子字符串的位置函数locate(x1,x2)locate(x1,x2)函数、函数、position(x1 in x2)pos

294、ition(x1 in x2)函数函数以及以及instr(x2,x1)instr(x2,x1)函数都是用于从字符串函数都是用于从字符串x2x2中获中获取取x1x1的开始位置。的开始位置。find_in_set(x1,x2)find_in_set(x1,x2)函数也可以获取字符串函数也可以获取字符串x2x2中中x1x1的开始位置(第几个逗号处的位置),不过该的开始位置(第几个逗号处的位置),不过该函数要求函数要求s2s2是一个用英文的逗号分隔的字符串。是一个用英文的逗号分隔的字符串。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程5 5子字符串操作

295、函数子字符串操作函数(3 3)子字符串替换函数)子字符串替换函数MySQLMySQL提供了两个子字符串替换函数提供了两个子字符串替换函数insert(x1,start,length,x2)insert(x1,start,length,x2)和和replace(x1,x2,x3)replace(x1,x2,x3)。insert(x1,start,length,x2)insert(x1,start,length,x2)函数将字符串函数将字符串x1x1中中从从startstart位置开始、长度为位置开始、长度为lengthlength的子字符串替的子字符串替换为换为x2x2。replace(x1,x

296、2,x3)replace(x1,x2,x3)函数用字符串函数用字符串x3x3替替换换x1x1中所有出现的字符串中所有出现的字符串x2x2,最后返回替换后的,最后返回替换后的字符串。字符串。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程6 6字符串复制函数字符串复制函数字符串复制函数包括字符串复制函数包括repeat(x,nrepeat(x,n) )函数以及函数以及space(nspace(n) )函数。其中函数。其中repeat(x,nrepeat(x,n) )函数产生一个函数产生一个新字符串,该字符串的内容是字符串新字符串,该字符串的内容是字

297、符串x x的的n n次复制;次复制;space(nspace(n) )函数产生一个新字符串,该字符串的内函数产生一个新字符串,该字符串的内容是空格字符的容是空格字符的n n次复制。次复制。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程7 7字符串比较函数字符串比较函数strcmp(x1,x2)strcmp(x1,x2)函数用于比较两个字符串函数用于比较两个字符串x1x1和和x2x2,如果,如果x1x2x1x2函数返回值为函数返回值为1 1;如果;如果x1=x2x1=x2函数返函数返回值为回值为0 0;如果;如果x1x2x1x2函数返回值为函数返

298、回值为-1-1。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程8 8字符串逆序函数字符串逆序函数reverse(xreverse(x) )函数返回一个新字符串,该字符串为函数返回一个新字符串,该字符串为字符串字符串x x的逆序。的逆序。 6.3.2 6.3.2 字符串函数字符串函数MySQL数据库基础与实例教程数据库基础与实例教程最为常用的数据类型转换函数是最为常用的数据类型转换函数是convert(x,typeconvert(x,type) )与与cast(xcast(x as type) as type)函数,另外函数,另外MySQLMyS

299、QL还提供了还提供了“十六进制字符串十六进制字符串”转换为转换为“十十六进制数六进制数”的函数的函数unhex(xunhex(x) )。(1 1)convert()convert()函数函数convert()convert()函数有两种用法格式:函数有两种用法格式:convert(xconvert(x using using charsetcharset) )函数返回函数返回x x的的charsetcharset字符集数据字符集数据(刚刚讲过,这里不再赘述)。(刚刚讲过,这里不再赘述)。 6.3.3 6.3.3 数据类型转换函数数据类型转换函数MySQL数据库基础与实例教程数据库基础与实例教程

300、convert()convert()函数还有另外一种语法格式:函数还有另外一种语法格式:convert(x,typeconvert(x,type) ),可以实现数据类型的转换。,可以实现数据类型的转换。convert(x,typeconvert(x,type) )函数以函数以typetype数据类型返回数据类型返回x x数据数据(注意(注意x x的数据类型没有变化)。除此以外的数据类型没有变化)。除此以外cast(xcast(x as type) as type)函数也实现了函数也实现了convert(x,typeconvert(x,type) )函数相同的功能。函数相同的功能。 6.3.3

301、6.3.3 数据类型转换函数数据类型转换函数MySQL数据库基础与实例教程数据库基础与实例教程(2 2)unhex(xunhex(x) )函数负责将十六进制字符串函数负责将十六进制字符串x x转换转换为十六进制的数值。为十六进制的数值。 6.3.3 6.3.3 数据类型转换函数数据类型转换函数MySQL数据库基础与实例教程数据库基础与实例教程条件控制函数的功能是根据条件表达式的值返回条件控制函数的功能是根据条件表达式的值返回不同的值,不同的值,MySQLMySQL中常用的条件控制函数有中常用的条件控制函数有if()if()、ifnullifnull()()以及以及casecase函数。与先前讲

302、解的函数。与先前讲解的ifif语句以及语句以及casecase语句不同,这些函数可以在语句不同,这些函数可以在MySQLMySQL客户机中直接客户机中直接调用,可以像调用,可以像max()max()统计函数一样直接融入到统计函数一样直接融入到SQLSQL语句中。语句中。6.3.4 6.3.4 条件控制函数条件控制函数MySQL数据库基础与实例教程数据库基础与实例教程(1 1)if()if()函数函数if(condition,v1,v2)if(condition,v1,v2)函数中函数中conditioncondition为条件表为条件表达式,当达式,当conditioncondition的值为

303、的值为truetrue时,函数返回时,函数返回v1v1的值,否则返回的值,否则返回v2v2的值。的值。 6.3.4 6.3.4 条件控制函数条件控制函数MySQL数据库基础与实例教程数据库基础与实例教程(2 2)ifnullifnull()()函数函数ifnull(v1,v2)ifnull(v1,v2)函数中,如果函数中,如果v1v1的值为的值为NULLNULL,则,则该函数返回该函数返回v2v2的值;如果的值;如果v1v1的值不为的值不为NULLNULL,则该,则该函数返回函数返回v1v1的值。的值。6.3.4 6.3.4 条件控制函数条件控制函数MySQL数据库基础与实例教程数据库基础与实

304、例教程(3)case函数函数case函数的语法格式如下。如果表达式的值等于函数的语法格式如下。如果表达式的值等于when语句中某个语句中某个“值值n”,则,则case函数返回值为函数返回值为“结果结果n”;如果与所有的;如果与所有的“值值n”都不相等,都不相等,case函数返回值为函数返回值为“其他值其他值”。case表达式表达式when值值1then结果结果1when值值2then结果结果2else其他值其他值end6.3.4 6.3.4 条件控制函数条件控制函数MySQL数据库基础与实例教程数据库基础与实例教程1关于关于MySQL服务实例的函数服务实例的函数version()函数用于获取当

305、前函数用于获取当前MySQL服务实例使服务实例使用的用的MySQL版本号,该函数的返回值与版本号,该函数的返回值与version静态变量的值相同。静态变量的值相同。6.3.5 6.3.5 系统信息函数系统信息函数MySQL数据库基础与实例教程数据库基础与实例教程2关于关于MySQL服务器连接的函数服务器连接的函数(1)有关)有关MySQL服务器连接的函数服务器连接的函数connection_id()函数用于获取当前函数用于获取当前MySQL服务服务器的连接器的连接ID,该函数的返回值与,该函数的返回值与pseudo_thread_id系统变量的值相同;系统变量的值相同;database()函数

306、与函数与schema()函数用于获取当前操作的数据函数用于获取当前操作的数据库。库。6.3.5 6.3.5 系统信息函数系统信息函数MySQL数据库基础与实例教程数据库基础与实例教程2关于关于MySQL服务器连接的函数服务器连接的函数(2)获取数据库用户信息的函数)获取数据库用户信息的函数user()函数用于获取通过哪一台登录主机、使用函数用于获取通过哪一台登录主机、使用什么账户名成功连接什么账户名成功连接MySQL服务器,服务器,system_user()函数与函数与session_user()函数是函数是user()函数的别函数的别名。名。current_user()函数用于获取该账户名允

307、许函数用于获取该账户名允许通过哪些登录主机连接通过哪些登录主机连接MySQL服务器。服务器。6.3.5 6.3.5 系统信息函数系统信息函数MySQL数据库基础与实例教程数据库基础与实例教程1获取获取MySQL服务器当前日期或时间函数服务器当前日期或时间函数(1)curdate()函数、函数、current_date()函数用于函数用于获取获取MySQL服务器当前日期;服务器当前日期;curtime()函数、函数、current_time()函数用于用于获取函数用于用于获取MySQL服务器当前时间;服务器当前时间;6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教

308、程数据库基础与实例教程now()函函 数数 、 current_timestamp()函函 数数 、 localtime()函函数数以以及及sysdate()函函数数用用于于获获取取MySQL服服务务器器当当前前日日期期和和时时间间,这这四四个个函函数数允允许许传传递递一一个个整整数数值值(小小于于等等于于6)作作为为函函数数参参数数,从从而而获获取取更更为精确的时间信息。为精确的时间信息。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程curdate()函数、函数、current_date()函数、函数、curtime()函数、函数、cu

309、rrent_time()函数、函数、now()函数、函数、current_timestamp()函数、函数、localtime()函数以及函数以及sysdate()函数的返函数的返回值与时区的设置有关。回值与时区的设置有关。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(2 2)获取)获取MySQLMySQL服务器当前服务器当前UNIXUNIX时间戳函数时间戳函数unix_timestampunix_timestamp()()函函数数用用于于获获取取MySQLMySQL服服务务器器当当前前UNIXUNIX时间戳。时间戳。unix_time

310、stamp(datetimeunix_timestamp(datetime) )函函 数数 将将 日日 期期 时时 间间datetimedatetime以以UNIXUNIX时时间间戳戳返返回回,而而from_unixtime(timestampfrom_unixtime(timestamp) )函函数数可可以以将将UNIXUNIX时时间间戳戳以以日日期期时时间间格格式式返返回回。需需要要注注意意的的是是,这这些些函函数的返回值与时区的设置有关。数的返回值与时区的设置有关。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(3)获取)获取MyS

311、QL服务器当前服务器当前UTC日期和时间函日期和时间函数数utc_date()函数用于获取函数用于获取UTC日期;日期;utc_time()函数用于获取函数用于获取UTC时间。时间。UTC即世界标准时间,即世界标准时间,中国大陆、中国香港、中国澳门、中国台湾、蒙中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与州的时间与UTC的时差均为的时差均为+8,也就是,也就是UTC+8。这些函数的返回值与时区的设置无关。这些函数的返回值与时区的设置无关。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据

312、库基础与实例教程数据库基础与实例教程2获取日期或时间的某一具体信息的函数获取日期或时间的某一具体信息的函数(1)获取年、月、日、时、分、秒、微秒等信)获取年、月、日、时、分、秒、微秒等信息的函数息的函数year(x)函数、函数、month(x)函数、函数、dayofmonth(x)函数、函数、hour(x)函数、函数、minute(x)函数、函数、second(x)函数以及函数以及microsecond(x)函数分别用函数分别用于获取日期时间于获取日期时间x的年、月、日、时、分、秒、的年、月、日、时、分、秒、微秒等信息。微秒等信息。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL

313、数据库基础与实例教程数据库基础与实例教程另另外外MySQL还还提提供供了了extract(typefromx)函函数数用用于于获获取取日日期期时时间间x的的年年、月月、日日、时时、分分、秒秒、微微秒秒等等信信息息,其其中中type可可以以分分别别指指定定为为year、month、 day、 hour、 minute、 second、microsecond。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(2)获取月份、星期等信息的函数)获取月份、星期等信息的函数monthname(x)函数用于获取日期时间函数用于获取日期时间x的月份的月份信

314、息。信息。dayname(x)函数与函数与weekday(x)函数用于函数用于获取日期时间获取日期时间x的星期信息;的星期信息;dayofweek(x)函数函数用于获取日期时间用于获取日期时间x是本星期的第几天(星期日是本星期的第几天(星期日为第一天,以此类推)。为第一天,以此类推)。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(3)获取年度信息的函数)获取年度信息的函数quarter(x)函数用于获取日期时间函数用于获取日期时间x在本年是第几在本年是第几季度;季度;week(x)函数与函数与weekofyear(x)函数用于获函数用于

315、获取日期时间取日期时间x在本年是第几个星期;在本年是第几个星期;dayofyear(x)函数用于获取日期时间函数用于获取日期时间x在本年是在本年是第几天。第几天。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程3时间和秒数之间的转换函数时间和秒数之间的转换函数time_to_sec(x)函数用于获取时间函数用于获取时间x在当天的秒在当天的秒数;数;sec_to_time(x)函数用于获取当天的秒数函数用于获取当天的秒数x对应的时间。对应的时间。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例

316、教程4 4日期间隔、时间间隔函数日期间隔、时间间隔函数(1 1)日期间隔函数)日期间隔函数to_days(xto_days(x) )函数用于计算日期函数用于计算日期x x距离距离00000000年年1 1月月1 1日的天数;日的天数;from_days(xfrom_days(x) )函数用于计算从函数用于计算从00000000年年1 1月月1 1日开始日开始n n天后的日期;天后的日期;6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程datediff(x1,x2)datediff(x1,x2)函数用于计算日期函数用于计算日期x1x1与与x2

317、x2之间之间的相隔天数;的相隔天数;adddate(d,nadddate(d,n) )函数返回起始日期函数返回起始日期d d加上加上n n天的日期;天的日期;subdate(d,nsubdate(d,n) )函数返回起始日函数返回起始日期期d d减去减去n n天的日期。天的日期。 6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(2)时间间隔函数)时间间隔函数addtime(t,n)函数返回起始时间函数返回起始时间t加上加上n秒的时间;秒的时间;subtime(t,n)函数返回起始时间函数返回起始时间t减去减去n秒的时间。秒的时间。6.3.

318、6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(3)计算指定日期指定间隔的日期函数)计算指定日期指定间隔的日期函数date_add(date,interval间隔间隔间隔类型间隔类型)函数返函数返回指定日期回指定日期date指定间隔的日期。指定间隔的日期。说明:说明:interval是时间间隔关键字,间隔可以为是时间间隔关键字,间隔可以为正数或者负数(建议使用两个单引号括起来)正数或者负数(建议使用两个单引号括起来)6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程6.3.6 6.3.6 日期和

319、时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程5日期和时间格式化函数日期和时间格式化函数(1)时间格式化函数)时间格式化函数time_format(t,f)函数按照表达式函数按照表达式f的要求显示时的要求显示时间间t,表达式,表达式f中定义了时间的显示格式,显示格中定义了时间的显示格式,显示格式以式以%开头。开头。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程(2)日期和时间格式化函数)日期和时间格式化函数dat

320、e_format(d,f)函数按照表达式函数按照表达式f的要求显示日的要求显示日期和时间期和时间t,表达式,表达式f中定义了日期和时间的显示中定义了日期和时间的显示格式,显示格式以格式,显示格式以%开头。开头。6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程6.3.6 6.3.6 日期和时间函数日期和时间函数MySQL数据库基础与实例教程数据库基础与实例教程1获得当前获得当前MySQL会话最后一次自增字段值会话最后一次自增字段值last_insert_id()函数返回当前函数返回当前MySQL会话最后会话最后一次一次insert或或upda

321、te语句设置的自增字段值。语句设置的自增字段值。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL数据库基础与实例教程数据库基础与实例教程last_insert_id()函数的返回结果遵循一定的原则。函数的返回结果遵循一定的原则。(1)last_insert_id()函数仅仅用于获取当前函数仅仅用于获取当前MySQL会话时会话时insert或或update语句设置的自增语句设置的自增字段值,该函数的返回值与系统会话变量字段值,该函数的返回值与系统会话变量last_insert_id的值一致。的值一致。(2)自增字段值如果是数据库用户自己指定,)自增字段值如果是数

322、据库用户自己指定,而不是自动生成,那么而不是自动生成,那么last_insert_id()函数的返函数的返回值为回值为0。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL数据库基础与实例教程数据库基础与实例教程last_insert_id()函数的返回结果遵循一定的原则。函数的返回结果遵循一定的原则。(3)假如使用一条)假如使用一条insert语句插入多行记录,语句插入多行记录,last_insert_id()函数只返回第一条记录的自增字段值。函数只返回第一条记录的自增字段值。(4)last_insert_id()函数与表无关。如果向表函数与表无关。如果向表A

323、插入数据后再向表插入数据后再向表B插入数据,插入数据,last_insert_id()函数返回表函数返回表B的自增字段值。的自增字段值。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL数据库基础与实例教程数据库基础与实例教程2IP地址与整数相互转换函数地址与整数相互转换函数inet_aton(ip)函数用于将函数用于将IP地址(字符串数据)地址(字符串数据)转换为整数;转换为整数;inet_ntoa(n)函数用于将整数转换函数用于将整数转换为为IP地址(字符串数据)。地址(字符串数据)。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数M

324、ySQL数据库基础与实例教程数据库基础与实例教程3基准值函数基准值函数benchmark(n,expression)函数将表达式函数将表达式expression重复执行重复执行n次,返回结果为次,返回结果为0。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL数据库基础与实例教程数据库基础与实例教程4uuid()函数函数uuid()函数可以生成一个函数可以生成一个128位的通用唯一识别位的通用唯一识别码码UUID(UniversallyUniqueIdentifier)。)。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL数据库

325、基础与实例教程数据库基础与实例教程4uuid()函数函数UUID码由码由5个段构成,其中前个段构成,其中前3个段与服务器主个段与服务器主机的时间有关(精确到微秒);第机的时间有关(精确到微秒);第4段是一个随段是一个随机数,在当前的机数,在当前的MySQL服务实例中该随机数不服务实例中该随机数不会变化,除非重启会变化,除非重启MySQL服务;第服务;第5段是通过网段是通过网卡卡MAC地址转换得到,同一台地址转换得到,同一台MySQL服务器运服务器运行多个行多个MySQL服务实例时,该值相等。服务实例时,该值相等。6.3.7 6.3.7 其他常用的其他常用的MySQLMySQL函数函数MySQL

326、数据库基础与实例教程数据库基础与实例教程任务布置任务布置5:上机操作,完成场景描述:上机操作,完成场景描述5:中文全中文全文检索的模拟实现文检索的模拟实现的任务要求。的任务要求。6.4 6.4 中文全文检索的模拟实现中文全文检索的模拟实现Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之视图触发器视图触发器1 12 23 3 本章首先讲解了本章首先讲解了视图以及触发器的视图以及触发器的管理及使用,然后管理及使用,然后结合结合“选课系统选课系统”分别介绍视图以及分别介绍视图以及触发器在该系统中触发器在该系统中的应用。的应用。4 4触发器触发器视图视图临时表

327、临时表派生表(派生表(Derived Table)5 5视图、子查询、临时表、派生表视图、子查询、临时表、派生表内容一览内容一览 视图与表有很多相似视图与表有很多相似的地方,视图也是由若的地方,视图也是由若干个字段以及若干条记干个字段以及若干条记录构成,视图也可以作录构成,视图也可以作为为select语句的数据源。语句的数据源。甚至在某些特定条件下,甚至在某些特定条件下,可以通过视图对表进行可以通过视图对表进行更新操作。更新操作。7.1 7.1 视图视图1 12 23 3视图中保存的仅仅视图中保存的仅仅是一条是一条select语句,语句,视图中的源数据都来视图中的源数据都来自于数据库表,数据自

328、于数据库表,数据库表称为基本表或者库表称为基本表或者基表,视图称为虚表。基表,视图称为虚表。查看看视图的定的定义创建建视图视图在在“选课系系统”中的中的应用用45视图的作用的作用删除除视图7.1 7.1 视图视图6 67 7视图中保存的仅仅视图中保存的仅仅是一条是一条select语句,语句,视图中的源数据都来视图中的源数据都来自于数据库表,数据自于数据库表,数据库表称为基本表或者库表称为基本表或者基表,视图称为虚表。基表,视图称为虚表。检查视图local与与cascade检查视图7.1 7.1 视图视图MySQL数据库基础与实例教程数据库基础与实例教程创建视图的语法格式如下。创建视图的语法格式

329、如下。createview视图名视图名(视图字段列表视图字段列表)asselect语句语句7.1.1 7.1.1 创建视图创建视图MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置1:上机操作,完成本书:上机操作,完成本书场景描述场景描述1的任务要求,理解的任务要求,理解“对于经常使用的、结构对于经常使用的、结构复杂的复杂的select语句,建议将其封装为视图语句,建议将其封装为视图”。7.1.1 7.1.1 创建视图创建视图MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看视图的定义。可以使用下面四种方法查看视图的定义。1在在choose数据库中成功地

330、创建了视图数据库中成功地创建了视图available_course_view后,该视图的定义默后,该视图的定义默认保存在数据库目录(例如认保存在数据库目录(例如choose目录)下,目录)下,文件名为文件名为available_course_view.frm。使用。使用记事本打开该文件,即可查看该视图的定义。记事本打开该文件,即可查看该视图的定义。7.1.2 7.1.2 查看视图的定义查看视图的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看视图的定义。可以使用下面四种方法查看视图的定义。2视图是一个虚表,也可以使用查看表结构视图是一个虚表,也可以使用查看表结构的

331、方式查看视图的定义。的方式查看视图的定义。3MySQL命令命令“showtables;”命令不仅显命令不仅显示当前数据库中所有的基表,也会将所有的示当前数据库中所有的基表,也会将所有的视图罗列出来。视图罗列出来。7.1.2 7.1.2 查看视图的定义查看视图的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看视图的定义。可以使用下面四种方法查看视图的定义。4MySQL系统数据库系统数据库information_schema的的views表存储了所有视图的定义,使用下面表存储了所有视图的定义,使用下面的的select语句查询该表的所有记录,也可以查语句查询该表的所有记

332、录,也可以查看所有视图的详细信息。看所有视图的详细信息。select*frominformation_schema.viewsG7.1.2 7.1.2 查看视图的定义查看视图的定义MySQL数据库基础与实例教程数据库基础与实例教程从现在开始,本书将选择从现在开始,本书将选择“方案一方案一”实现学实现学生选课功能。方案一与方案二的唯一区别在生选课功能。方案一与方案二的唯一区别在于:方案一中的课程于:方案一中的课程course表比方案二中的表比方案二中的课程课程course表多了一个表多了一个“剩余的学生名额剩余的学生名额”available字段。字段。任务布置任务布置2:上机操作,完成本书:上机

333、操作,完成本书场景描述场景描述2的任务要求。的任务要求。7.1.3 7.1.3 视图在视图在“选课系统选课系统”中的应用中的应用MySQL数据库基础与实例教程数据库基础与实例教程1使操作变得简单使操作变得简单2避免数据冗余避免数据冗余3增强数据安全性增强数据安全性4提高数据的逻辑独立性提高数据的逻辑独立性7.1.4 7.1.4 视图的作用视图的作用MySQL数据库基础与实例教程数据库基础与实例教程如果某个视图不再使用,可以使用如果某个视图不再使用,可以使用dropview语句将该视图删除,语法格式如下。语句将该视图删除,语法格式如下。dropview视图名视图名7.1.5 7.1.5 删除视图

334、删除视图MySQL数据库基础与实例教程数据库基础与实例教程视图分为普通视图与检查视图。视图分为普通视图与检查视图。通过检查视图更新基表数据时,只有满足通过检查视图更新基表数据时,只有满足检查条件的更新语句才能成功执行。创建检检查条件的更新语句才能成功执行。创建检查视图的语法格式如下。查视图的语法格式如下。createview视图名视图名(视图字段列表视图字段列表)asselect语句语句withlocal|cascadedcheckoption7.1.6 7.1.6 检查视图检查视图MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置3:上机操作,完成本书:上机操作,完成本书场景

335、描述场景描述3:普通视图与更新操作:普通视图与更新操作的任务要求。的任务要求。任务布置任务布置4:上机操作,完成本书:上机操作,完成本书场景描述场景描述4:检查视图与更新操作:检查视图与更新操作的任务要求。的任务要求。然后分析普通视图与检查视图之间的区别。然后分析普通视图与检查视图之间的区别。7.1.6 7.1.6 检查视图检查视图MySQL数据库基础与实例教程数据库基础与实例教程检检查查视视图图分分为为local检检查查视视图图与与cascade检检查查视图。视图。with_check_option的值为的值为1时表示时表示local(local视图),视图),值为值为2时表示时表示casc

336、ade(级联视图,在视图的(级联视图,在视图的基础上再次创建另一个视图)。基础上再次创建另一个视图)。7.1.6 local7.1.6 local与与cascadecascade检查视图检查视图MySQL数据库基础与实例教程数据库基础与实例教程local检查检查视图与视图与cascade检检查视图查视图7.1.6 local7.1.6 local与与cascadecascade检查视图检查视图1 12 23 3触发器主要用于监视某触发器主要用于监视某个表的个表的insert、update以及以及delete等更新操作,等更新操作,这些操作可以分别激活这些操作可以分别激活该表的该表的insert

337、、update或者或者delete类型的触发类型的触发程序运行,从而实现数程序运行,从而实现数据的自动维护。据的自动维护。使用触使用触发器器实现检查约束束准准备工作工作使用触使用触发器器维护冗余数据冗余数据45使用触使用触发器模器模拟外外键级联选项查看触看触发器的定器的定义7.2 7.2 触发器触发器MySQL数据库基础与实例教程数据库基础与实例教程6 67 7触发器主要用于监视某触发器主要用于监视某个表的个表的insert、update以及以及delete等更新操作,等更新操作,这些操作可以分别激活这些操作可以分别激活该表的该表的insert、update或者或者delete类型的触发类型的

338、触发程序运行,从而实现数程序运行,从而实现数据的自动维护。据的自动维护。删除触除触发器器使用触使用触发器的注意事器的注意事项7.2 7.2 触发器触发器7.2 7.2 触发器触发器MySQL数据库基础与实例教程数据库基础与实例教程使用使用createtrigger语句可以创建一个触发器,语句可以创建一个触发器,语法格式如下。语法格式如下。createtrigger触发器名触发器名触发时间触发时间触发事件触发事件on表名表名foreachrowbegin触发程序触发程序end7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL的触发事件有

339、三种:的触发事件有三种: insert insert:将新记录插入表时激活触发程序,:将新记录插入表时激活触发程序,例如通过例如通过insertinsert、load dataload data和和replacereplace语句,可以语句,可以激活触发程序运行。激活触发程序运行。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL的触发事件有三种:的触发事件有三种: update update:更改某一行记录时激活触发程序,:更改某一行记录时激活触发程序,例如通过例如通过updateupdate语句,可以激活触发程序运行。语句,可以激

340、活触发程序运行。 delete delete:从表中删除某一行记录时激活触发:从表中删除某一行记录时激活触发程序,例如通过程序,例如通过deletedelete和和replacereplace语句,可以激活语句,可以激活触发程序运行。触发程序运行。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程 触发器的触发时间有两种:触发器的触发时间有两种:beforebefore与与afterafter。beforebefore表示在触发事件发生之前执行触发程表示在触发事件发生之前执行触发程序。序。afterafter表示在触发事件发生之后执行触发器。表示在触发事

341、件发生之后执行触发器。因此严格意义上讲一个数据库表最多可以设因此严格意义上讲一个数据库表最多可以设置六种类型的触发器。置六种类型的触发器。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程for each rowfor each row表示行级触发器。表示行级触发器。 目前目前MySQLMySQL仅支持行级触发器,不支持语仅支持行级触发器,不支持语句级别的触发器(例如句级别的触发器(例如create tablecreate table等语句)。等语句)。for each rowfor each row表示更新(表示更新(insertinsert、upda

342、teupdate或或者者deletedelete)操作影响的每一条记录都会执行)操作影响的每一条记录都会执行一次触发程序。一次触发程序。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程触发程序中可以使用触发程序中可以使用old关键字与关键字与new关键字。关键字。当向表插入新记录时,在触发程序中可以当向表插入新记录时,在触发程序中可以使用使用new关键字表示新记录,当需要访问新关键字表示新记录,当需要访问新记录的某个字段值时,可以使用记录的某个字段值时,可以使用“new.字段字段名名”的方式访问。的方式访问。7.2.1 7.2.1 准备工作准备工作My

343、SQL数据库基础与实例教程数据库基础与实例教程触发程序中可以使用触发程序中可以使用old关键字与关键字与new关键字。关键字。当从表中删除某条旧记录时,在触发程序当从表中删除某条旧记录时,在触发程序中可以使用中可以使用old关键字表示旧记录,当需要访关键字表示旧记录,当需要访问旧记录的某个字段值时,可以使用问旧记录的某个字段值时,可以使用“old.字段名字段名”的方式访问。的方式访问。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程触发程序中可以使用触发程序中可以使用oldold关键字与关键字与newnew关键字。关键字。 当修改表的某条记录时,在触发

344、程序中当修改表的某条记录时,在触发程序中可以使用可以使用oldold关键字表示修改前的旧记录、使关键字表示修改前的旧记录、使用用newnew关键字表示修改后的新记录。当需要访关键字表示修改后的新记录。当需要访问旧记录的某个字段值时,可以使用问旧记录的某个字段值时,可以使用“old.old.字段名字段名”的方式访问。当需要访问修改后的的方式访问。当需要访问修改后的新记录的某个字段值时,可以使用新记录的某个字段值时,可以使用“new.new.字字段名段名”的方式访问。的方式访问。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程触发程序中可以使用触发程序中可

345、以使用old关键字与关键字与new关键字。关键字。old记录是只读的,可以引用它,但不能记录是只读的,可以引用它,但不能更改它。在更改它。在before触发程序中,可使用触发程序中,可使用“setnew.col_name=value”更改更改new记录的值。记录的值。7.2.1 7.2.1 准备工作准备工作MySQL数据库基础与实例教程数据库基础与实例教程前前面面曾曾经经提提到到,MySQL可可以以使使用用复复合合数数据据类类型型set或或者者enum对对字字段段的的取取值值范范围围进进行行检检查查约约束束,使使用用复复合合数数据据类类型型可可以以实实现现离离散散的的字字符符串串数数据据的的检

346、检查查约约束束,对对于于数数值值型型的的数数不不建建议议使使用用set或或者者enum实实现现检检查查约约束束,可可以以使用触发器实现。使用触发器实现。7.2.2 7.2.2 使用触发器实现检查约束使用触发器实现检查约束MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置5 5:上机操作,完成本书:上机操作,完成本书场景描述场景描述5 5:使用触发器实现检查约束:使用触发器实现检查约束的任务要求。的任务要求。7.2.2 7.2.2 使用触发器实现检查约束使用触发器实现检查约束MySQL数据库基础与实例教程数据库基础与实例教程冗余的数据需要额外的维护,维护冗余数冗余的数据需要额外的

347、维护,维护冗余数据时,为了避免数据不一致问题的发生(例据时,为了避免数据不一致问题的发生(例如:剩余的学生名额如:剩余的学生名额+已选学生人数已选学生人数课程的课程的人数上限),冗余的数据应该尽量避免交由人数上限),冗余的数据应该尽量避免交由人工维护,建议冗余的数据交由应用系统人工维护,建议冗余的数据交由应用系统(例如触发器)自动维护。(例如触发器)自动维护。7.2.3 7.2.3 使用触发器维护冗余数据使用触发器维护冗余数据MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置6:上机操作,完成本书:上机操作,完成本书场景描述场景描述6:使用触发器自动维护课程:使用触发器自动维护

348、课程available的字段的字段值值的任务要求。的任务要求。7.2.3 7.2.3 使用触发器维护冗余数据使用触发器维护冗余数据MySQL数据库基础与实例教程数据库基础与实例教程对于对于InnoDB存储引擎的表而言,由于支持存储引擎的表而言,由于支持外键约束,在定义外键约束时,通过设置外外键约束,在定义外键约束时,通过设置外键的级联选项键的级联选项cascade、setnull或者或者noaction(restrict),外键约束关系可以交由),外键约束关系可以交由InnoDB存储引擎自动维护。存储引擎自动维护。7.2.4 7.2.4 使用触发器模拟外键级联选项使用触发器模拟外键级联选项My

349、SQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置7:上机操作,完成本书:上机操作,完成本书场景描述场景描述7:使用:使用InnoDB存储引擎维护外键约束关系存储引擎维护外键约束关系的的任务要求。任务要求。任务布置任务布置8:上机操作,完成本书:上机操作,完成本书场景描述场景描述8:使用触发器模拟外键级联选项:使用触发器模拟外键级联选项的任务要求。的任务要求。7.2.4 7.2.4 使用触发器模拟外键级联选项使用触发器模拟外键级联选项MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看触发器的定义。可以使用下面四种方法查看触发器的定义。1使用使用showtri

350、ggers命令查看触发器的定命令查看触发器的定义义7.2.5 7.2.5 查看触发器的定义查看触发器的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看触发器的定义。可以使用下面四种方法查看触发器的定义。2查询查询information_schema数据库中的数据库中的triggers表,可以查看触发器的定义表,可以查看触发器的定义MySQL中所有触发器的定义都存放在中所有触发器的定义都存放在information_schema数据库下的数据库下的triggers表中,表中,查询查询triggers表,可以查看所有数据库中所有触表,可以查看所有数据库中所有触发器的详

351、细信息,查询语句如下:发器的详细信息,查询语句如下:select*frominformation_schema.triggersG7.2.5 7.2.5 查看触发器的定义查看触发器的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看触发器的定义。可以使用下面四种方法查看触发器的定义。3使用使用“showcreatetrigger”命令可以查看某命令可以查看某一个触发器的定义。一个触发器的定义。例如使用例如使用“showcreatetriggerorganization_delete_before_triggerG”命令可命令可以查看触发器以查看触发器organiza

352、tion_delete_before_trigger的定义。的定义。7.2.5 7.2.5 查看触发器的定义查看触发器的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看触发器的定义。可以使用下面四种方法查看触发器的定义。4成成功功创创建建触触发发器器后后,MySQL自自动动在在数数据据库库目目录录下下创创建建TRN以以及及TRG触触发发器器文文件件,以以记记事事本本方方式打开这些文件,可以查看触发器的定义。式打开这些文件,可以查看触发器的定义。7.2.5 7.2.5 查看触发器的定义查看触发器的定义MySQL数据库基础与实例教程数据库基础与实例教程可以使用可以使用

353、droptrigger语句将该触发器删除,语语句将该触发器删除,语法格式如下。法格式如下。droptrigger触发器名触发器名7.2.6 7.2.6 删除触发器删除触发器MySQL数据库基础与实例教程数据库基础与实例教程1触发程序中如果包含触发程序中如果包含select语句,该语句,该select语语句不能返回结果集。句不能返回结果集。2同一个表不能创建两个相同触发时间、触发事同一个表不能创建两个相同触发时间、触发事件的触发程序。件的触发程序。3触发程序中不能使用以显式或隐式方式打开、触发程序中不能使用以显式或隐式方式打开、开始或结束事务的语句,如开始或结束事务的语句,如starttrans

354、action、commit、rollback或者或者setautocommit=0等语等语句。句。7.2.7 7.2.7 使用触发器的使用触发器的1010条注意事项条注意事项MySQL数据库基础与实例教程数据库基础与实例教程4MySQL触触发发器器针针对对记记录录进进行行操操作作,当当批批量量更更新数据时,引入触发器会导致更新操作性能降低。新数据时,引入触发器会导致更新操作性能降低。5在在MyISAM存存储储引引擎擎中中,触触发发器器不不能能保保证证原原子子性性。InnoDB存存储储引引擎擎支支持持事事务务,使使用用触触发发器器可可以以保保证证更更新新操操作作与与触触发发程程序序的的原原子子性

355、性,此此时时触触发发程程序和更新操作是在同一个事务中完成。序和更新操作是在同一个事务中完成。7.2.7 7.2.7 使用触发器的使用触发器的1010条注意事项条注意事项MySQL数据库基础与实例教程数据库基础与实例教程6InnoDB存存储储引引擎擎实实现现外外键键约约束束关关系系时时,建建议议使使用用级级联联选选项项维维护护外外键键数数据据;MyISAM存存储储引引擎擎虽虽然然不不支支持持外外键键约约束束关关系系时时,但但可可以以使使用用触触发发器器实实现现级级联联修修改改和和级级联联删删除除,进进而而维维护护“外外键键”数数据,模拟实现外键约束关系。据,模拟实现外键约束关系。7.2.7 7.

356、2.7 使用触发器的使用触发器的1010条注意事项条注意事项MySQL数据库基础与实例教程数据库基础与实例教程7使用触发器维护使用触发器维护InnoDB外键约束的级联选项外键约束的级联选项时,数据库开发人员究竟应该选择时,数据库开发人员究竟应该选择after触发器还触发器还是是before触发器?答案是:应该首先维护子表的触发器?答案是:应该首先维护子表的数据,然后再维护父表的数据,否则可能出现错数据,然后再维护父表的数据,否则可能出现错误。误。 7.2.7 7.2.7 使用触发器的使用触发器的1010条注意事项条注意事项MySQL数据库基础与实例教程数据库基础与实例教程8MySQL的触发程序

357、不能对本表进行更新语句的触发程序不能对本表进行更新语句(例如(例如update语句)。触发程序中的更新操作可语句)。触发程序中的更新操作可以直接使用以直接使用set命令替代,否则可能出现错误信息,命令替代,否则可能出现错误信息,甚至陷入死循环。甚至陷入死循环。9在在before触发程序中,触发程序中,auto_increment字段字段的的new值为值为0,不是实际插入新记录时自动生成的,不是实际插入新记录时自动生成的自增型字段值。自增型字段值。7.2.7 7.2.7 使用触发器的使用触发器的1010条注意事项条注意事项MySQL数据库基础与实例教程数据库基础与实例教程10添加触发器后,建议对

358、其进行详细的测试,添加触发器后,建议对其进行详细的测试,测试通过后再决定是否使用触发器。测试通过后再决定是否使用触发器。7.2.7 7.2.7 使用触发器的使用触发器的1010条注意事项条注意事项1 12 23 3按照按照MySQL临时表的存储临时表的存储位置可以将其分为内存临位置可以将其分为内存临时表(时表(in-memory)以及)以及外存临时表(外存临时表(on-disk)。)。按照按照MySQL临时表的创建临时表的创建时机可以将其分为自动创时机可以将其分为自动创建的临时表以及手动创建建的临时表以及手动创建的临时表。的临时表。“选课系系统”中中临时表的使用表的使用临时表的表的创建、建、查

359、看与看与删除除使用使用临时表的注意事表的注意事项7.3 7.3 临时表临时表MySQL数据库基础与实例教程数据库基础与实例教程1手动创建临时表手动创建临时表手动创建临时表很容易,给正常的手动创建临时表很容易,给正常的createtable语语句加上句加上temporary关键字即可。关键字即可。 2查看临时表的定义可以使用查看临时表的定义可以使用MySQL语句语句“showcreatetable临时表名临时表名;”。 7.3.1 7.3.1 临时表的创建、查看与删除临时表的创建、查看与删除MySQL数据库基础与实例教程数据库基础与实例教程3断开断开MySQL服务器的连接,临时表服务器的连接,临

360、时表frm表结构表结构定义文件以及表记录将被清除。使用定义文件以及表记录将被清除。使用drop命令也命令也可以删除临时表,语法格式如下。可以删除临时表,语法格式如下。droptemporarytable临时表表名临时表表名7.3.1 7.3.1 临时表的创建、查看与删除临时表的创建、查看与删除MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置9:上机操作,完成本书:上机操作,完成本书场景描述场景描述9的任的任务要求。务要求。7.3.2 7.3.2 “选课系统选课系统”中临时表的使用中临时表的使用MySQL数据库基础与实例教程数据库基础与实例教程使用存储程序可以实现表数据的复杂加

361、工处使用存储程序可以实现表数据的复杂加工处理,有时需要将理,有时需要将select语句的查询结果集临时地语句的查询结果集临时地保存到存储程序(例如函数、存储过程)的变量保存到存储程序(例如函数、存储过程)的变量中,不过目前中,不过目前MySQL并不支持表类型变量。临时并不支持表类型变量。临时表可以模拟实现表类型变量的功能。表可以模拟实现表类型变量的功能。7.3.2 7.3.2 使用临时表的注意事项使用临时表的注意事项MySQL数据库基础与实例教程数据库基础与实例教程临时表如果与基表重名,那么基表将被隐藏,临时表如果与基表重名,那么基表将被隐藏,除非删除临时表,基表才能被访问。除非删除临时表,基

362、表才能被访问。Memory、MyISAM、Merge或者或者InnoDB存存储引擎的表都支持临时表。储引擎的表都支持临时表。临时表不支持聚簇索引、触发器。临时表不支持聚簇索引、触发器。7.3.2 7.3.2 使用临时表的注意事项使用临时表的注意事项MySQL数据库基础与实例教程数据库基础与实例教程showtables命令不会显示临时表的信息。命令不会显示临时表的信息。不能用不能用rename来重命名一个临时表。但可以来重命名一个临时表。但可以使用使用altertable重命名临时表。重命名临时表。在同一条在同一条select语句中,临时表只能引用一语句中,临时表只能引用一次。例如下面的次。例如

363、下面的select语句将抛出语句将抛出“ERROR1137(HY000):Cantreopentable:t1”错误信息。错误信息。select*fromtempast1,tempast2;7.3.2 7.3.2 使用临时表的注意事项使用临时表的注意事项派生表与视图一样,一般在派生表与视图一样,一般在from子句中使用,子句中使用,其语法格式如下(粗体字代码为派生表代码)。其语法格式如下(粗体字代码为派生表代码)。.from(select子句子句)派生表名派生表名.派生表必须是一个有效的表,因此它必须遵守以派生表必须是一个有效的表,因此它必须遵守以下规则:下规则:每个派生表必须有自己的别名。每

364、个派生表必须有自己的别名。派生表中的所有字段必须要有名称,字段名必须派生表中的所有字段必须要有名称,字段名必须唯一。唯一。7.4 7.4 派生表(派生表(Derived TableDerived Table)任务布置任务布置10:完成本书:完成本书场景描述场景描述10的任务要求。的任务要求。7.4 7.4 派生表(派生表(Derived TableDerived Table)子查询一般在主查询语句中的子查询一般在主查询语句中的where子句或者子句或者having子句中使用。子句中使用。视图通常在主查询语句中的视图通常在主查询语句中的from子句中使用。子句中使用。7.5 7.5 子查询、视图

365、、临时表、派生表子查询、视图、临时表、派生表视图本质是一条视图本质是一条select语句,执行的是某一个语句,执行的是某一个数据源某个字段的查询操作,如果视图的数据源某个字段的查询操作,如果视图的“主查主查询询”语句是语句是update语句、语句、delete语句或者语句或者insert语句,且语句,且“主查询主查询”语句执行了该数据源该字段语句执行了该数据源该字段的更新操作,那么主查询语句将出错。的更新操作,那么主查询语句将出错。原因非常简单:在对某个表的某个字段操作时,原因非常简单:在对某个表的某个字段操作时,查询操作(查询操作(select语句)不能与更新操作语句)不能与更新操作(upd

366、ate语句、语句、delete语句或者语句或者insert语句)同语句)同时进行。时进行。7.5 7.5 子查询、视图、临时表、派生表子查询、视图、临时表、派生表与视图相似,临时表一般在与视图相似,临时表一般在from子句中使用。子句中使用。临时表与视图的区别在于:临时表与视图的区别在于:临时表本质也是一条临时表本质也是一条select语句,执行的是某语句,执行的是某一个数据源某个字段的查询操作,但由于临时表一个数据源某个字段的查询操作,但由于临时表会先执行完毕,并且将查询结果集提前置放到服会先执行完毕,并且将查询结果集提前置放到服务器内存。因此务器内存。因此“临时表临时表”的的“主查询主查询

367、”语句语句(例如(例如update、delete或者或者insert语句)执行字语句)执行字段的更新操作时,不会产生段的更新操作时,不会产生“ERROR1443(HY000)”错误。错误。7.5 7.5 子查询、视图、临时表、派生表子查询、视图、临时表、派生表派生表与临时表的功能基本相同,它们之间的派生表与临时表的功能基本相同,它们之间的最大区别在于生命周期不同。最大区别在于生命周期不同。临时表如果是手工创建,那么临时表的生命周临时表如果是手工创建,那么临时表的生命周期在期在MySQL服务器连接过程中有效;服务器连接过程中有效;而派生表的生命周期仅在本次而派生表的生命周期仅在本次select语

368、句执行语句执行的过程中有效,本次的过程中有效,本次select语句执行结束,派生语句执行结束,派生表立即清除。因此,如果希望延长查询结果集的表立即清除。因此,如果希望延长查询结果集的生命周期,可以选用临时表;反之亦然。生命周期,可以选用临时表;反之亦然。7.5 7.5 子查询、视图、临时表、派生表子查询、视图、临时表、派生表另外,通过视图虽然可以更新基表的数据,但另外,通过视图虽然可以更新基表的数据,但本书并不建议这样做。原因在于:通过视图更新本书并不建议这样做。原因在于:通过视图更新基表数据,并不会触发触发器的运行。基表数据,并不会触发触发器的运行。 7.5 7.5 子查询、视图、临时表、派

369、生表子查询、视图、临时表、派生表Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之存储过程与游标存储过程与游标1 12 23 3本章主要讲解如何本章主要讲解如何在在MySQL中使用存中使用存储过程,并结合储过程,并结合“选课系统选课系统”讲解存讲解存储过程在该系统中储过程在该系统中的应用,最后本章的应用,最后本章对存储程序做了总对存储程序做了总结。结。4 4错误触触发条件和条件和错误处理理存储过程存储过程游游标预处理理SQL语句句5 5存存储程序的程序的说明明内容一览内容一览 1 12 23 3存储过程也可以看作是存储过程也可以看作是一个一个“加工作坊加

370、工作坊”,它,它接收接收“调用者调用者”传递过传递过来的来的“原料原料”(in参数)参数),然后将这些,然后将这些“原料原料”“加工处理加工处理”成成“产产品品”(存储过程的存储过程的out参数或参数或inout参数),再参数),再把把“产品产品”返回给返回给“调调用者用者”。存储过程的调用存储过程的调用创建存储过程的语法格式创建存储过程的语法格式“选课系统选课系统”的存储过程的存储过程45查看存储过程的定义查看存储过程的定义删除存储过程删除存储过程6存储过程与函数的比较存储过程与函数的比较8.1 8.1 存储过程存储过程MySQL数据库基础与实例教程数据库基础与实例教程创建存储过程的语法格式

371、如下。创建存储过程的语法格式如下。createprocedure存储过程名(参数存储过程名(参数1,参,参数数2,)存储过程选项存储过程选项begin存储过程语句块存储过程语句块;end;8.1.1 8.1.1 创建存储过程的语法格式创建存储过程的语法格式MySQL数据库基础与实例教程数据库基础与实例教程存储过程选项由以下一种或几种选项组合而成。存储过程选项由以下一种或几种选项组合而成。具体含义请查看函数选项的内容。具体含义请查看函数选项的内容。languagesql|notdeterministic|containssql|nosql|readssqldata|modifiessqldata

372、|sqlsecuritydefiner|invoker|comment注释注释8.1.1 8.1.1 创建存储过程的语法格式创建存储过程的语法格式MySQL数据库基础与实例教程数据库基础与实例教程与函数相同之处在于:存储过程的参数也与函数相同之处在于:存储过程的参数也是局部变量,也需要提供参数的数据类型;是局部变量,也需要提供参数的数据类型;与函数不同的是,存储过程有三种类型的参与函数不同的是,存储过程有三种类型的参数:数:in参数、参数、out参数以及参数以及inout参数。参数。8.1.1 8.1.1 创建存储过程的语法格式创建存储过程的语法格式MySQL数据库基础与实例教程数据库基础与实

373、例教程in代表输入参数(默认情况下为代表输入参数(默认情况下为in参数),参数),表示该参数的值必须由调用程序指定;表示该参数的值必须由调用程序指定;out代表输出参数,表示该参数的值经存储代表输出参数,表示该参数的值经存储过程计算后,将过程计算后,将out参数的计算结果返回给调参数的计算结果返回给调用程序;用程序;inout代表即是输入参数,又是输出参数,代表即是输入参数,又是输出参数,表示该参数的值即可以由调用程序指定,又表示该参数的值即可以由调用程序指定,又可以将可以将inout参数的计算结果返回给调用程序。参数的计算结果返回给调用程序。8.1.1 8.1.1 创建存储过程的语法格式创建

374、存储过程的语法格式MySQL数据库基础与实例教程数据库基础与实例教程例如下面的存储过程:例如下面的存储过程:delimiter$createprocedureget_choose_number_proc(instudent_no1int,outchoose_numberint)readssqldatabeginselectcount(*)intochoose_numberfromchoosewherestudent_no=student_no1;end$delimiter;8.1.1 8.1.1 创建存储过程的语法格式创建存储过程的语法格式MySQL数据库基础与实例教程数据库基础与实例教程调用

375、存储过程须使用调用存储过程须使用call关键字,另外还要关键字,另外还要向存储过程传递向存储过程传递in参数、参数、out参数或者参数或者inout参参数。数。例如:例如:setstudent_no=2012001;setchoose_number=0;callget_choose_number_proc(student_no,choose_number);selectchoose_number;8.1.2 8.1.2 存储过程的调用存储过程的调用MySQL数据库基础与实例教程数据库基础与实例教程存储过程存储过程get_choose_number_proc()中中的的in参数与参数与out参数

376、的数据类型都为整数,也参数的数据类型都为整数,也可以将这两个参数简化为一个可以将这两个参数简化为一个inout参数。参数。8.1.2 8.1.2 存储过程的调用存储过程的调用MySQL数据库基础与实例教程数据库基础与实例教程delimiter$createprocedureget_choose_number1_proc(inoutnumberint)readssqldatabeginselectcount(*)intonumberfromchoosewherestudent_no=number;end$delimiter;8.1.2 8.1.2 存储过程的调用存储过程的调用MySQL数据库基础

377、与实例教程数据库基础与实例教程setnumber=2012001;callget_choose_number1_proc(number);selectnumber;8.1.2 8.1.2 存储过程的调用存储过程的调用MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置1:上机操作,完成本书场景描述:上机操作,完成本书场景描述1的任务要求。的任务要求。任务布置任务布置2:上机操作,完成本书场景描述:上机操作,完成本书场景描述2的任务要求。的任务要求。任务布置任务布置3:上机操作,完成本书场景描述:上机操作,完成本书场景描述3的任务要求。的任务要求。8.1.3 8.1.3 “选课系统

378、选课系统”的存储过程的存储过程MySQL数据库基础与实例教程数据库基础与实例教程可以使用下面四种方法查看存储过程的定义、可以使用下面四种方法查看存储过程的定义、权限、字符集等信息。权限、字符集等信息。1使用使用showprocedurestatus命令查看存储过命令查看存储过程的定义。程的定义。2查看某个数据库(例如查看某个数据库(例如choose数据库)中的数据库)中的所有存储过程名,可以使用下面的所有存储过程名,可以使用下面的SQL语句。语句。selectnamefrommysql.procwheredb=chooseandtype=procedure;8.1.4 8.1.4 查看存储过程

379、的定义查看存储过程的定义MySQL数据库基础与实例教程数据库基础与实例教程3使用使用MySQL命令命令“showcreateprocedure存储过程名存储过程名;”可以查看指定数据库指定存储过程可以查看指定数据库指定存储过程的详细信息。的详细信息。例如查看例如查看get_choose_number_proc()存储过程存储过程的详细信息,可以使用的详细信息,可以使用“showcreateprocedureget_choose_number_procG” 8.1.4 8.1.4 查看存储过程的定义查看存储过程的定义MySQL数据库基础与实例教程数据库基础与实例教程4存储过程的信息都保存在存储过

380、程的信息都保存在information_schema数据库中的数据库中的routines表中,表中,可以使用可以使用select语句查询存储过程的相关信息语句查询存储过程的相关信息.例如下面的例如下面的SQL语句查看的是语句查看的是get_choose_number_proc()存储过程的相关信息。存储过程的相关信息。select*frominformation_schema.routineswhereroutine_name=get_choose_number_procG8.1.4 8.1.4 查看存储过程的定义查看存储过程的定义MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函

381、数之间的共同特点在于:存储过程与函数之间的共同特点在于:应应用用程程序序调调用用存存储储过过程程或或者者函函数数时时,只只需需要要提提供供存存储储过过程程名名或或者者函函数数名名,以以及及参参数数信信息息,无无需需 将将 若若 干干 条条 MySQL命命 令令 或或 SQL语语 句句 发发 送送 到到MySQL服务器,节省了网络开销。服务器,节省了网络开销。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的共同特点在于:存储过程与函数之间的共同特点在于:存储过程或者函数可以重复使用,可以减少存储过程或者函数可以

382、重复使用,可以减少数据库开发人员,尤其是应用程序开发人员的工数据库开发人员,尤其是应用程序开发人员的工作量。作量。使用存储过程或者函数可以增强数据的安全使用存储过程或者函数可以增强数据的安全访问控制。可以设定只有某些数据库用户才具有访问控制。可以设定只有某些数据库用户才具有某些存储过程或者函数的执行权。某些存储过程或者函数的执行权。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的不同之处在于:存储过程与函数之间的不同之处在于:函数必须有且仅有一个返回值,且必须指定函数必须有且仅有一个返回值,且必须指定返回值数

383、据类型(返回值类型目前仅仅支持字符返回值数据类型(返回值类型目前仅仅支持字符串、数值类型)。存储过程可以没有返回值,也串、数值类型)。存储过程可以没有返回值,也可以有返回值,甚至可以有多个返回值,所有的可以有返回值,甚至可以有多个返回值,所有的返回值需要使用返回值需要使用out或者或者inout参数定义。参数定义。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的不同之处在于:存储过程与函数之间的不同之处在于:函数体内可以使用函数体内可以使用selectinto语句为某个变语句为某个变量赋值,但不能使用量赋值,

384、但不能使用select语句返回结果(或者语句返回结果(或者结果集)。存储过程则没有这方面的限制,存储结果集)。存储过程则没有这方面的限制,存储过程甚至可以返回多个结果集。过程甚至可以返回多个结果集。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的不同之处在于:存储过程与函数之间的不同之处在于:函数可以直接嵌入到函数可以直接嵌入到SQL语句(例如语句(例如select语句中)或者语句中)或者MySQL表达式中,最重要的是函数表达式中,最重要的是函数可以用于扩展标准的可以用于扩展标准的SQL语句。存储过程一般需语

385、句。存储过程一般需要单独调用,并不会嵌入到要单独调用,并不会嵌入到SQL语句中使用(例语句中使用(例如如select语句中),调用时需要使用语句中),调用时需要使用call关键字。关键字。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的不同之处在于:存储过程与函数之间的不同之处在于:函数中的函数体限制比较多,比如函数体内函数中的函数体限制比较多,比如函数体内不能使用以显式或隐式方式打开、开始或结束事不能使用以显式或隐式方式打开、开始或结束事务的语句,如务的语句,如starttransaction、commit

386、、rollback或者或者setautocommit=0等语句;不能在等语句;不能在函数体内使用预处理函数体内使用预处理SQL语句(稍后讲解)。存语句(稍后讲解)。存储过程的限制相对就比较少,基本上所有的储过程的限制相对就比较少,基本上所有的SQL语句或语句或MySQL命令都可以在存储过程中使用。命令都可以在存储过程中使用。8.1.6 8.1.6 存储过程与函数的比较存储过程与函数的比较MySQL数据库基础与实例教程数据库基础与实例教程存储过程与函数之间的不同之处在于:存储过程与函数之间的不同之处在于:应用程序(例如应用程序(例如Java、PHP等应用程序)调用函等应用程序)调用函数时,通常将

387、函数封装到数时,通常将函数封装到SQL字符串(例如字符串(例如select语语句)中进行调用;应用程序(例如句)中进行调用;应用程序(例如Java、PHP等应用等应用程序)调用存储过程时,必须使用程序)调用存储过程时,必须使用call关键字进行调用,关键字进行调用,如果应用程序希望获取存储过程的返回值,应用程序如果应用程序希望获取存储过程的返回值,应用程序必须给存储过程的必须给存储过程的out参数或者参数或者inout参数传递参数传递MySQL会话变量,才能通过该会话变量获取存储过程的返回会话变量,才能通过该会话变量获取存储过程的返回值。值。8.1.6 8.1.6 存储过程与函数的比较存储过程

388、与函数的比较默认情况下,存储程序运行过程中(例如存储默认情况下,存储程序运行过程中(例如存储过程或者函数)发生错误时,过程或者函数)发生错误时,MySQL将自动终止将自动终止存储程序的执行。存储程序运行过程中发生错误存储程序的执行。存储程序运行过程中发生错误时,数据库开发人员有时希望自己控制程序的运时,数据库开发人员有时希望自己控制程序的运行流程,并不希望行流程,并不希望MySQL将自动终止存储程序的将自动终止存储程序的执行,执行,MySQL的错误处理机制可以帮助数据库开的错误处理机制可以帮助数据库开发人员自行控制程序流程。发人员自行控制程序流程。8.2 8.2 错误触发条件和错误处理错误触发

389、条件和错误处理1 12 23 3存储程序运行过程中存储程序运行过程中(例如存储过程或者函(例如存储过程或者函数)发生错误时数)发生错误时MySQL的错误处理机制的错误处理机制可以帮助数据库开发人可以帮助数据库开发人员自行控制程序流程。员自行控制程序流程。自定自定义错误触触发条件条件自定自定义错误处理程序理程序自定自定义错误处理程序理程序说明明8.2 8.2 错误触发条件和错误处理错误触发条件和错误处理MySQL数据库基础与实例教程数据库基础与实例教程自定义错误处理程序时需要使用自定义错误处理程序时需要使用declare关键字,关键字,语法格式如下。语法格式如下。declare错误处理类型错误处

390、理类型handlerfor错误触发条错误触发条件件自定义错误处理程序自定义错误处理程序;8.2.1 8.2.1 自定义错误处理程序自定义错误处理程序MySQL数据库基础与实例教程数据库基础与实例教程错错误误处处理理类类型型的的取取值值要要么么是是continue,要要么么是是exit。当当错错误误处处理理类类型型是是continue时时,表表示示错错误误发发生生后后,MySQL立立即即执执行行自自定定义义错错误误处处理理程程序序,然然后后忽略该错误继续执行其他忽略该错误继续执行其他MySQL语句。语句。当当错错误误处处理理类类型型是是exit时时,表表示示错错误误发发生生后后,MySQL立立即

391、即执执行行自自定定义义错错误误处处理理程程序序,然然后后立立刻刻停止其他停止其他MySQL语句的执行。语句的执行。8.2.1 8.2.1 自定义错误处理程序自定义错误处理程序MySQL数据库基础与实例教程数据库基础与实例教程错错误误触触发发条条件件:表表示示满满足足什什么么条条件件时时,自自定定义义错错误误处处理理程程序序开开始始运运行行,错错误误触触发发条条件件定定义义了了自自定义错误处理程序运行的时机。定义错误处理程序运行的时机。错错误误触触发发条条件件有有3种种取取值值:MySQL错错误误代代码码、ANSI标标准准错错误误代代码码以以及及自自定定义义错错误误触触发发条条件件。例例如如14

392、52是是MySQL错错误误代代码码,它它对对应应于于ANSI标标准准错误代码错误代码23000,自定义错误触发条件稍后讲解。,自定义错误触发条件稍后讲解。8.2.1 8.2.1 自定义错误处理程序自定义错误处理程序MySQL数据库基础与实例教程数据库基础与实例教程自自定定义义错错误误处处理理程程序序:错错误误发发生生后后,MySQL会会立立即即执执行行自自定定义义错错误误处处理理程程序序中中的的MySQL语语句句,自自定定义义错错误误处处理理程程序序也也可可以以是是一一个个begin-end语语句块。句块。任任务务布布置置4:上上机机操操作作,完完成成本本书书场场景景描描述述4:自自定义错误处

393、理程序的任务要求。定义错误处理程序的任务要求。8.2.1 8.2.1 自定义错误处理程序自定义错误处理程序MySQL数据库基础与实例教程数据库基础与实例教程自定义错误触发条件允许数据库开发人员为自定义错误触发条件允许数据库开发人员为MySQL错误代码或者错误代码或者ANSI标准错误代码命名,标准错误代码命名,语法格式如下。语法格式如下。declare错误触发条件错误触发条件conditionforMySQL错误代码或者错误代码或者ANSI标准错误代码标准错误代码;8.2.2 8.2.2 自定义错误触发条件自定义错误触发条件MySQL数据库基础与实例教程数据库基础与实例教程例如代码片段:例如代码

394、片段:declarecontinuehandlerfor1452beginseterror1=外键约束错误外键约束错误!;end;可以替换成代码片段:可以替换成代码片段:8.2.2 8.2.2 自定义错误触发条件自定义错误触发条件MySQL数据库基础与实例教程数据库基础与实例教程declareforeign_key_errorconditionforsqlstate23000;declarecontinuehandlerforforeign_key_errorbeginseterror1=外键约束错误外键约束错误!;end;8.2.2 8.2.2 自定义错误触发条件自定义错误触发条件MySQL

395、数据库基础与实例教程数据库基础与实例教程自定义错误触发条件以及自定义错误处理程序自定义错误触发条件以及自定义错误处理程序可以在触发器、函数以及存储过程中使用。可以在触发器、函数以及存储过程中使用。参与软件项目的多个数据库开发人员,如果每参与软件项目的多个数据库开发人员,如果每个人都自建一套错误触发条件以及错误处理程序,个人都自建一套错误触发条件以及错误处理程序,极易造成极易造成MySQL错误管理混乱。实际开发过程中,错误管理混乱。实际开发过程中,建议数据库开发人员建立清晰的错误处理规范,建议数据库开发人员建立清晰的错误处理规范,必要时可以将自定义错误触发条件、自定义错误必要时可以将自定义错误触

396、发条件、自定义错误处理程序封装在一个存储程序中。处理程序封装在一个存储程序中。8.2.3 8.2.3 自定义错误处理程序说明自定义错误处理程序说明1 12 2数数据据库库开开发发人人员员编编写写存存储储过过程程(或或者者函函数数)等等存存储储程程序序时时,有有 时时 需需 要要 存存 储储 程程 序序 中中 的的MySQL代代码码扫扫描描select结结果果集集中中的的数数据据,并并对对结结果果集集中中的的每每条条记记录录进进行行简简单单处处理理,通通过过MySQL的的游游标标机机制制可可以以解解决决此类问题。此类问题。游游标在在“网网络选课”系系统中的使用中的使用使用使用游游标8.3 8.3

397、 游标游标MySQL数据库基础与实例教程数据库基础与实例教程游标的使用可以概括为声明游标、打开游标、游标的使用可以概括为声明游标、打开游标、从游标中提取数据以及关闭游标。从游标中提取数据以及关闭游标。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程1声明游标声明游标声明游标需要使用声明游标需要使用declare语句,其语法格式如下。语句,其语法格式如下。declare游标名游标名cursorforselect语句语句使用使用declare语句声明游标后,此时与该游标对应语句声明游标后,此时与该游标对应的的select语句并没有执行,语句并没有执行,My

398、SQL服务器内存中服务器内存中并不存在与并不存在与select语句对应的结果集。语句对应的结果集。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程2打开游标打开游标打开游标需要使用打开游标需要使用open语句,其语法格式如下。语句,其语法格式如下。open游标名游标名使用使用open语句打开游标后,与该游标对应的语句打开游标后,与该游标对应的select语句将被执行,语句将被执行,MySQL服务器内存中将存服务器内存中将存放与放与select语句对应的结果集。语句对应的结果集。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库

399、基础与实例教程3从游标中提取数据从游标中提取数据从游标中提取数据需要使用从游标中提取数据需要使用fetch语句,其语法格语句,其语法格式如下。式如下。fetch游标名游标名into变量名变量名1,变量名变量名2,说明:变量名的个数必须与声明游标时使用的说明:变量名的个数必须与声明游标时使用的select语句结果集中的字段个数保持一致。语句结果集中的字段个数保持一致。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程第一次执行第一次执行fetch语句时,语句时,fetch语句从结果集语句从结果集中提取第一条记录,再次执行中提取第一条记录,再次执行fetch

400、语句时,语句时,fetch语句从结果集中提取第二条记录,语句从结果集中提取第二条记录,以此类以此类推。推。fetch语句每次从结果集中仅仅提取一条记录,语句每次从结果集中仅仅提取一条记录,因此因此fetch语句需要循环语句的配合,才能实现整语句需要循环语句的配合,才能实现整个个“结果集结果集”的遍历。的遍历。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程当使用当使用fetch语句从游标中提取最后一条记录后,语句从游标中提取最后一条记录后,再次执行再次执行fetch语句时,将产生语句时,将产生“ERROR1329(02000):NodatatoFETC

401、H”错误信息,数据库错误信息,数据库开发人员可以针对开发人员可以针对MySQL错误代码错误代码1329,自定,自定义错误处理程序以便结束义错误处理程序以便结束“结果集结果集”的遍历。的遍历。注意:游标错误处理程序应该放在声明游标语注意:游标错误处理程序应该放在声明游标语句之后。游标通常结合错误处理程序一起使用,句之后。游标通常结合错误处理程序一起使用,用于结束用于结束“结果集结果集”的遍历。的遍历。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程4关闭游标关闭游标关闭游标使用关闭游标使用close语句,其语法格式如下。语句,其语法格式如下。close游

402、标名游标名关闭游标的目的在于释放游标打开时产生的结果关闭游标的目的在于释放游标打开时产生的结果集,节省集,节省MySQL服务器的内存空间。游标如果没服务器的内存空间。游标如果没有被明确地关闭,游标将在它被声明的有被明确地关闭,游标将在它被声明的begin-end语句块的末尾关闭。语句块的末尾关闭。8.3.1 8.3.1 使用游标使用游标MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置5:上机操作,完成本书场景描述:上机操作,完成本书场景描述5的任的任务要求,理解游标的用法。务要求,理解游标的用法。8.3.2 8.3.2 游标在游标在“网络选课网络选课”系统中的使用系统中的使用

403、1 12 23 3运行期间,如果运行期间,如果SQL语语句不能发生动态地变化,这句不能发生动态地变化,这种种SQL语句称为静态语句称为静态SQL语语句。句。运行期间,如果运行期间,如果SQL语语句或句或SQL所带的参数可以发所带的参数可以发生动态变化,这种生动态变化,这种SQL语句语句称为动态称为动态SQL语句或者预处语句或者预处理理SQL语句语句。“选课系系统”中中预处理理SQL语句的使用句的使用预处理理SQL语句句使用步使用步骤预处理理SQL语句句的复的复杂应用用4静静态SQL语句与句与预处理理SQL语句句8.4 8.4 预处理预处理SQLSQL语句语句MySQL数据库基础与实例教程数据库

404、基础与实例教程MySQL支持预处理支持预处理SQL语句,预处理语句,预处理SQL语语句的使用主要包含三个步骤:创建预处理句的使用主要包含三个步骤:创建预处理SQL语语句、执行预处理句、执行预处理SQL语句以及释放预处理语句以及释放预处理SQL语语句。句。1创建预处理创建预处理SQL语句语句创建预处理创建预处理SQL语句的语法格式如下。语句的语法格式如下。prepare预处理预处理SQL语句名语句名fromSQL字符串字符串8.4.1 8.4.1 预处理预处理SQLSQL语句使用步骤语句使用步骤MySQL数据库基础与实例教程数据库基础与实例教程2执行预处理执行预处理SQL语句语句使用使用exec

405、ute命令可以执行预处理命令可以执行预处理SQL语句中定语句中定义的义的SQL语句,其语法格式如下。语句,其语法格式如下。execute预处理名预处理名using填充数据填充数据,填充数据填充数据.8.4.1 8.4.1 预处理预处理SQLSQL语句使用步骤语句使用步骤MySQL数据库基础与实例教程数据库基础与实例教程3释放预处理释放预处理SQL语句语句当预处理当预处理SQL语句不再使用时,可以使用语句不再使用时,可以使用deallocate语句将该预处理语句将该预处理SQL语句释放。其语语句释放。其语法格式如下。法格式如下。deallocateprepare预处理名预处理名8.4.1 8.4

406、.1 预处理预处理SQLSQL语句使用步骤语句使用步骤MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置6:上机操作,完成本书场景描述:上机操作,完成本书场景描述6的任的任务要求,理解务要求,理解预处理预处理SQL语句语句的用法。的用法。8.4.2 8.4.2 “选课系统选课系统”中预处理中预处理SQLSQL语句的使用语句的使用MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置7:上机操作,完成本书场景描述:上机操作,完成本书场景描述7的任的任务要求,理解务要求,理解预处理预处理SQL语句语句的用法。的用法。任务布置任务布置8:上机操作,完成本书场景描述:上机操

407、作,完成本书场景描述8的任的任务要求,理解务要求,理解预处理预处理SQL语句语句的用法。的用法。8.4.3 8.4.3 预处理预处理SQLSQL语句的复杂应用语句的复杂应用MySQL数据库基础与实例教程数据库基础与实例教程对于静态对于静态SQL语句而言,每次将其发送到语句而言,每次将其发送到MySQL服务实例时,服务实例时,MySQL服务实例都会对其服务实例都会对其进行解析、执行,然后将执行结果返回给进行解析、执行,然后将执行结果返回给MySQL客户机。客户机。对于预处理对于预处理SQL语句而言,预处理语句而言,预处理SQL语句创语句创建后,第一次运行预处理建后,第一次运行预处理SQL语句时,

408、语句时,MySQL服服务实例会对其解析,解析成功后,将其保存到务实例会对其解析,解析成功后,将其保存到MySQL服务器缓存中,为今后每一次地执行作好服务器缓存中,为今后每一次地执行作好准备(今后无需再次解析)。准备(今后无需再次解析)。8.4.4 8.4.4 静态静态SQLSQL语句与预处理语句与预处理SQLSQL语句语句MySQL数据库基础与实例教程数据库基础与实例教程对于某些对于某些SQL语句,如果满足语句,如果满足“一次创建,多一次创建,多次执行次执行”的条件,可以考虑将其封装为预处理的条件,可以考虑将其封装为预处理SQL语句,发挥其语句,发挥其“一次解析,多次执行一次解析,多次执行”的

409、性的性能优势。当然预处理能优势。当然预处理SQL语句如果使用不当,也语句如果使用不当,也会导致性能下降,甚至不如静态会导致性能下降,甚至不如静态SQL语句。语句。8.4.4 8.4.4 静态静态SQLSQL语句与预处理语句与预处理SQLSQL语句语句无论初学者还是有经验的数据库开发人员,无论初学者还是有经验的数据库开发人员,都要对自己开发的存储程序进行严格的测试,都要对自己开发的存储程序进行严格的测试,并尽量保存测试步骤、测试数据以及测试结并尽量保存测试步骤、测试数据以及测试结果。果。 8.5 8.5 存储程序的说明存储程序的说明与应用程序(与应用程序(Java或者或者.NET或者或者PHP等

410、应等应用程序)相比,存储程序可维护性高,更新用程序)相比,存储程序可维护性高,更新存储程序通常比更改、测试以及重新部署应存储程序通常比更改、测试以及重新部署应用程序需要更少的时间和精力。用程序需要更少的时间和精力。使用存储程序与使用大量离散的使用存储程序与使用大量离散的SQL语句语句写出的应用程序相比,更易于代码优化、重写出的应用程序相比,更易于代码优化、重用和维护。用和维护。8.5 8.5 存储程序的说明存储程序的说明当然存储程序并不是神话,不能将所有的当然存储程序并不是神话,不能将所有的业务逻辑代码全部封装成存储程序,把业务业务逻辑代码全部封装成存储程序,把业务处理的所有负担全部压在数据库

411、服务器上。处理的所有负担全部压在数据库服务器上。事实上数据库服务器的核心任务是存储数事实上数据库服务器的核心任务是存储数据,保证数据的安全性、完整性以及一致性,据,保证数据的安全性、完整性以及一致性,如果数据库承担了过多业务逻辑方面的工作,如果数据库承担了过多业务逻辑方面的工作,势必会对数据库服务器的性能造成负面影响。势必会对数据库服务器的性能造成负面影响。8.5 8.5 存储程序的说明存储程序的说明对于简单的业务逻辑,在不影响数据库性对于简单的业务逻辑,在不影响数据库性能的前提下,为了节省网络资源,可以将业能的前提下,为了节省网络资源,可以将业务逻辑封装成存储程序。务逻辑封装成存储程序。对于

412、较为复杂的业务逻辑,建议使用高级对于较为复杂的业务逻辑,建议使用高级语言(语言(Java或者或者.NET或者或者PHP等)实现,让等)实现,让应用服务器(例如应用服务器(例如Apache、IIS等)承担更多等)承担更多的业务逻辑,保持负载均衡。的业务逻辑,保持负载均衡。8.5 8.5 存储程序的说明存储程序的说明Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之事务机制和锁机制事务机制和锁机制1 12 23 3本章探讨了数据库中本章探讨了数据库中事务与锁机制的必要性,事务与锁机制的必要性,讲解了如何在数据库中讲解了如何在数据库中使用事务与锁机制实现使用事

413、务与锁机制实现数据库的一致性以及并数据库的一致性以及并发性,并结合发性,并结合“选课系选课系统统”讲解事务与锁机制讲解事务与锁机制在该系统中的应用。在该系统中的应用。4 4锁机制机制事务机制事务机制事事务的的ACID特性特性事事务与与锁机制注意事机制注意事项内容一览内容一览 事务通常包含一系列更新操作,这些更新操作是事务通常包含一系列更新操作,这些更新操作是一个不可分割的逻辑工作单元。如果事务成功执一个不可分割的逻辑工作单元。如果事务成功执行,那么该事务中所有的更新操作都会成功执行、行,那么该事务中所有的更新操作都会成功执行、并将执行结果提交到数据库文件中,成为数据库并将执行结果提交到数据库文

414、件中,成为数据库永久的组成部分。如果事务中某条更新操作执行永久的组成部分。如果事务中某条更新操作执行失败,那么事务中的所有操作均被撤销。失败,那么事务中的所有操作均被撤销。9.1 9.1 事务机制事务机制 1 12 23 3简言之:事务中的简言之:事务中的更新操作要么都执更新操作要么都执行,要么都不执行,行,要么都不执行,这个特征叫做事务这个特征叫做事务的原子性。的原子性。关关闭MySQL自自动提交提交事事务的必要性的必要性回回滚45提交提交事事务9.1 9.1 事务机制事务机制 6 67 7简言之:事务中的简言之:事务中的更新操作要么都执更新操作要么都执行,要么都不执行,行,要么都不执行,这

415、个特征叫做事务这个特征叫做事务的原子性。的原子性。保存点保存点“选课系系统”中的事中的事务9.1 9.1 事务机制事务机制 MySQL数据库基础与实例教程数据库基础与实例教程对对于于银银行行系系统统而而言言,转转账账业业务务是是银银行行最最基基本本的的、且且最最常常用用的的业业务务,有有必必要要将将转转账账业业务务封封装装成成存存储储过过程程,调调用用该该存存储储过过程程后后即即可可实实现现两个银行账户间的转账。两个银行账户间的转账。任任务务布布置置1:上上机机操操作作,完完成成本本书书场场景景描描述述1的任务要求,理解事务的必要性。的任务要求,理解事务的必要性。9.1.1 9.1.1 事务机

416、制的必要性事务机制的必要性MySQL数据库基础与实例教程数据库基础与实例教程关闭自动提交的方法有两种:一种是显示地关闭自动提交的方法有两种:一种是显示地关闭自动提交,一种是隐式地关闭自动提交。关闭自动提交,一种是隐式地关闭自动提交。方法一:显示地关闭自动提交方法一:显示地关闭自动提交使用使用MySQL命令命令“setautocommit=0;”,可,可以显示地关闭以显示地关闭MySQL自动提交。自动提交。9.1.2 9.1.2 关闭关闭MySQLMySQL自动提交自动提交MySQL数据库基础与实例教程数据库基础与实例教程方法二:隐式地关闭自动提交方法二:隐式地关闭自动提交使用使用MySQL命令

417、命令“starttransaction;”可以隐式地关闭自动提交。隐式地关闭自动可以隐式地关闭自动提交。隐式地关闭自动提交,不会修改系统会话变量提交,不会修改系统会话变量autocommitte的值。的值。推荐使用方法二。推荐使用方法二。9.1.2 9.1.2 关闭关闭MySQLMySQL自动提交自动提交MySQL数据库基础与实例教程数据库基础与实例教程关关闭闭MySQL自自动动提提交交后后,数数据据库库开开发发人人员员可可以根据需要回滚(也叫撤销)更新操作。以根据需要回滚(也叫撤销)更新操作。任任务务布布置置2:上上机机操操作作,完完成成本本书书场场景景描描述述2以及场景描述以及场景描述3的

418、任务要求,理解回滚的作用。的任务要求,理解回滚的作用。9.1.3 9.1.3 回滚回滚MySQL数据库基础与实例教程数据库基础与实例教程MySQL自自动动提提交交一一旦旦关关闭闭,数数据据库库开开发发人人员员需需要要“提提交交”更更新新语语句句,才才能能将将更更新新结结果果提提交交到到数数据据库库文文件件中中,成成为为数数据据库库永永久久的的组组成成部部分分。自自动动提提交交关关闭闭后后,MySQL的的提提交交方方式式分为显示地提交与隐式地提交。分为显示地提交与隐式地提交。9.1.4 9.1.4 提交提交MySQL数据库基础与实例教程数据库基础与实例教程显显示示地地提提交交:MySQL自自动动

419、提提交交关关闭闭后后,使使用用MySQL命命令令“commit;”可可以以显显示示地地提提交交更更新语句。新语句。隐隐式式地地提提交交:MySQL自自动动提提交交关关闭闭后后,使使用用下下面面的的MySQL语语句句,可可以以隐隐式式地地提提交交更更新新语语句。句。9.1.4 9.1.4 提交提交MySQL数据库基础与实例教程数据库基础与实例教程begin、setautocommit=1、starttransaction、renametable、truncatetable等语句;等语句;数数据据定定义义(create、alter、drop)语语句句,例例如如createdatabase、crea

420、tetable、createindex、createfunction、createprocedure、altertable、alterfunction、alterprocedure、dropdatabase、droptable、dropfunction、dropindex、dropprocedure等语句;等语句;9.1.4 9.1.4 提交提交MySQL数据库基础与实例教程数据库基础与实例教程权限管理和账户管理语句:权限管理和账户管理语句:例如例如grant、revoke、setpassword、createuser、dropuser、renameuser等等语语句);句);锁语句(锁语句(

421、locktables、unlocktables)。)。9.1.4 9.1.4 提交提交MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置3:上上机机操操作作,完完成成本本书书场场景景描描述述2以及场景描述以及场景描述4的任务要求,理解提交的作用。的任务要求,理解提交的作用。9.1.4 9.1.4 提交提交MySQL数据库基础与实例教程数据库基础与实例教程使使用用MySQL命命令令“starttransaction;”可可以以开开启启一一个个事事务务,该该命命令令开开启启事事务务的的同同时时,会会隐式地关闭隐式地关闭MySQL自动提交。自动提交。使使用用commit命命令令可可以

422、以提提交交事事务务中中的的更更新新语语句句;使用使用rollback命令可以回滚事务中的更新语句。命令可以回滚事务中的更新语句。9.1.5 9.1.5 事务事务MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置4:上上机机操操作作,完完成成本本书书场场景景描描述述5的任务要求,理解事务的作用。的任务要求,理解事务的作用。9.1.5 9.1.5 事务事务MySQL数据库基础与实例教程数据库基础与实例教程保保存存点点(也也称称为为检检查查点点)可可以以实实现现事事务务的的“部分部分”提交或者提交或者“部分部分”撤销。撤销。使使用用MySQL命命令令“savepoint保保存存点点名

423、名;”可可以以在在事事务务中中设设置置一一个个保保存存点点,使使用用MySQL命命令令“rollbacktosavepoint保保存存点点名名;”可可以以将事务回滚到保存点状态。将事务回滚到保存点状态。9.1.6 9.1.6 保存点保存点MySQL数据库基础与实例教程数据库基础与实例教程任任务务布布置置5:上上机机操操作作,完完成成本本书书场场景景描描述述6的任务要求,理解保存点的作用。的任务要求,理解保存点的作用。9.1.6 9.1.6 保存点保存点MySQL数据库基础与实例教程数据库基础与实例教程说明:说明:“rollbacktosavepointB”仅仅是让仅仅是让数据库回到事务中的某个

424、数据库回到事务中的某个“一致性状态一致性状态B”,而而“一致性状态一致性状态B”仅仅是一个仅仅是一个“临时状态临时状态”,该,该“临时状态临时状态”并没有将更新回滚,也没并没有将更新回滚,也没有将更新提交。事务回滚必须借助于有将更新提交。事务回滚必须借助于rollback(而不是(而不是“rollbacktosavepointB”),事务的提交需借助于),事务的提交需借助于commit。9.1.6 9.1.6 保存点保存点MySQL数据库基础与实例教程数据库基础与实例教程使用使用MySQL命令命令“releasesavepoint保存保存点名点名;”可以删除一个事务的保存点。可以删除一个事务的

425、保存点。如果该保存点不存在,该命令将出现错误信如果该保存点不存在,该命令将出现错误信息:息:ERROR1305(42000):SAVEPOINTdoesnotexist。如果当前的事务中存在两个。如果当前的事务中存在两个相同名字的保存点,旧保存点将被自动丢弃。相同名字的保存点,旧保存点将被自动丢弃。9.1.6 9.1.6 保存点保存点MySQL数据库基础与实例教程数据库基础与实例教程“选选课课系系统统”中中,最最为为复复杂杂的的业业务务逻逻辑辑莫莫过过于于“学学生生选选课课”以以及及“学学生生调调课课”功功能能的的实实现现,之之前前的的章章节节已已经经编编写写了了choose_proc()存存

426、储储过过程程实实现现了了学学生生的的选选课课功功能能。本本章章将将借借用用事事 务务 的的 概概 念念 编编 写写 调调 课课 存存 储储 过过 程程 replace_course_proc(),实现,实现“选课系统选课系统”的调课功能。的调课功能。9.1.7 9.1.7 “选课系统选课系统”中的事务中的事务MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置6:上机操作,完成本书场景描述:上机操作,完成本书场景描述7的任务要求。的任务要求。9.1.7 9.1.7 “选课系统选课系统”中的事务中的事务1 12 23 3同一时刻,多个并发用户同一时刻,多个并发用户同时访问同一个数据

427、时,同时访问同一个数据时,仅仅通过事务机制,无法仅仅通过事务机制,无法保证多用户同时访问同一保证多用户同时访问同一数据的数据一致性,有必数据的数据一致性,有必要引入锁机制实现要引入锁机制实现MySQL的并发访问,锁机制是实的并发访问,锁机制是实现多用户并发访问的基石。现多用户并发访问的基石。MySQL锁机制的基机制的基础知知识锁机制的必要性机制的必要性MyISAM表的表表的表级锁45InnoDB表的行表的行级锁“选课系系统”中的行中的行级锁9.2 9.2 锁锁6 67 78 8同一时刻,多个并发用户同一时刻,多个并发用户同时访问同一个数据时,同时访问同一个数据时,仅仅通过事务机制,无法仅仅通过

428、事务机制,无法保证多用户同时访问同一保证多用户同时访问同一数据的数据一致性,有必数据的数据一致性,有必要引入锁机制实现要引入锁机制实现MySQL的并发访问,锁机制是实的并发访问,锁机制是实现多用户并发访问的基石。现多用户并发访问的基石。 InnoDB行行级锁与索引之与索引之间的关系的关系InnoDB表的意向表的意向锁间隙隙锁与死与死锁9死死锁与与锁等待等待9.2 9.2 锁锁MySQL数据库基础与实例教程数据库基础与实例教程并发用户访问同一数据,锁机制可以避免数据不并发用户访问同一数据,锁机制可以避免数据不一致问题的发生。以场景描述一致问题的发生。以场景描述2为例。为例。9.2.1 9.2.1

429、 锁机制的必要性锁机制的必要性MySQL数据库基础与实例教程数据库基础与实例教程1锁的粒度锁的粒度锁的粒度是指锁的作用范围。锁的粒度是指锁的作用范围。锁的粒度可以分为服务器级锁(锁的粒度可以分为服务器级锁(server-levellocking)和存储引擎级锁()和存储引擎级锁(storage-engine-levellocking)。)。MyISAM存储引擎支持表锁。存储引擎支持表锁。InnoDB存储引擎支持表锁以及行级锁。存储引擎支持表锁以及行级锁。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实例教程2隐式锁与显式锁

430、隐式锁与显式锁MySQL锁分为隐式锁以及显式锁。锁分为隐式锁以及显式锁。 MySQL自动加锁称为隐式锁。隐式锁。数据库开发人员手动加锁称为显式锁。数据库开发人员手动加锁称为显式锁。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实例教程3锁的类型锁的类型锁的类型包括读锁(锁的类型包括读锁(readlock)和写锁()和写锁(writelock),其中读锁也称为共享锁,写锁也称为排),其中读锁也称为共享锁,写锁也称为排他锁或者独占锁。他锁或者独占锁。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识M

431、ySQL数据库基础与实例教程数据库基础与实例教程读锁允许其它读锁允许其它MySQL客户机对数据同时客户机对数据同时“读读”,但不允许其它但不允许其它MySQL客户机对数据任何客户机对数据任何“写写” 。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实例教程写锁不允许其它写锁不允许其它MySQL客户机对数据同时读,也客户机对数据同时读,也不允许其它不允许其它MySQL客户机对数据同时写客户机对数据同时写 。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实

432、例教程4锁的钥匙锁的钥匙多个多个MySQL客户机并发访问同一个数据时,如果客户机并发访问同一个数据时,如果MySQL客户机客户机A对该数据成功地施加了锁,那么对该数据成功地施加了锁,那么只有只有MySQL客户机客户机A拥有这把锁的拥有这把锁的“钥匙钥匙”,也,也就是说:只有就是说:只有MySQL客户机客户机A能够对该锁进行解能够对该锁进行解锁操作。锁操作。9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实例教程5锁的生命周期锁的生命周期锁的生命周期是指在同一个锁的生命周期是指在同一个MySQL服务器连接内,服务器连接内,对数

433、据加锁到解锁之间的时间间隔。对数据加锁到解锁之间的时间间隔。 9.2.2 9.2.2 MySQLMySQL锁机制的基础知识锁机制的基础知识MySQL数据库基础与实例教程数据库基础与实例教程任任何何针针对对MyISAM表表的的查查询询操操作作或或者者更更新新操操作作,都都会会隐隐式式地地施施加加表表级级锁锁,隐隐式式锁锁的的生生命命周周期期非非常常短暂,且不受数据库开发人员的控制。短暂,且不受数据库开发人员的控制。9.2.3 9.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程有有时时需需要要延延长长表表级级锁锁的的生生命命周周期期,MySQ

434、L为为数数据据库库开开发发人人员员提提供供了了显显示示地地施施加加表表级级锁锁以以及及显显示示地地解锁的解锁的MySQL命令。命令。9.2.3 9.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程9.2.3 9.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程注意事项:注意事项: readread与与writewrite选选项项的的功功能能在在于于施施加加表表级级读读锁锁还还是是表级写锁。表级写锁。 MySQLMySQL客客户户机机A A使使用用lock lock tablestable

435、s命命令令可可以以同同时时为为多多个个表表施施加加表表级级锁锁(包包括括读读锁锁或或者者写写锁锁),并并且且加加锁锁期期间间,MySQLMySQL客客户户机机A A不不能能对对“没没有有锁锁定定的的表表”进进行行更更新新及及查查询询操操作作,否否则则将将抛抛出出“表表未未被被锁锁定定”的错误信息。的错误信息。 9.2.3 9.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程如如果果需需要要为为同同一一个个表表同同时时施施加加读读锁锁与与写写锁锁,需需要为该表起两个别名,以区分读锁与写锁。要为该表起两个别名,以区分读锁与写锁。 9.2.3 9

436、.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程read read locallocal与与readread选项之之间的的区区别在在于于:如如果果MySQLMySQL客客户机机A A使使用用readread选项为某某个个MyISAMMyISAM表表施施加加读锁,加加锁期期间,MySQLMySQL客客户机机A A以以及及MySQLMySQL客客户机机B B都都不不能能对该表表进行行插插入入操操作作。如如果果MySQLMySQL客客户机机A A使使用用read read locallocal选项为某某个个MyISAMMyISAM表表施施加加读

437、锁,加加锁期期间,MySQLMySQL客客户机机B B可可以以对该表表进行行插插入入操操作,前提是新作,前提是新记录必必须插入到表的末尾插入到表的末尾。 9.2.3 9.2.3 MyISAMMyISAM表的表级锁表的表级锁MySQL数据库基础与实例教程数据库基础与实例教程InnoDBInnoDB提供了两种类型的行级锁,分别是共享锁提供了两种类型的行级锁,分别是共享锁(S S)以及排他锁()以及排他锁(X X),其中共享锁也叫读锁,),其中共享锁也叫读锁,排他锁也叫写锁。排他锁也叫写锁。 在查询(在查询(selectselect)语句或者更新()语句或者更新(insertinsert、updat

438、eupdate以及以及deletedelete)语句中,为受影响的记录施)语句中,为受影响的记录施加行级锁的方法也非常简单。加行级锁的方法也非常简单。 9.2.4 9.2.4 InnoDBInnoDB表的行级锁表的行级锁MySQL数据库基础与实例教程数据库基础与实例教程方法方法1 1在查询(在查询(selectselect)语句中,为符合查询条)语句中,为符合查询条件的记录施加共享锁,语法格式如下所示。件的记录施加共享锁,语法格式如下所示。select * from select * from 表表 where where 条件语句条件语句 lock in lock in share mode

439、;share mode;方法方法2 2在查询(在查询(selectselect)语句中,为符合查询条)语句中,为符合查询条件的记录施加排他锁,语法格式如下所示。件的记录施加排他锁,语法格式如下所示。select * from select * from 表表 where where 条件语句条件语句 for update;for update;9.2.4 9.2.4 InnoDBInnoDB表的行级锁表的行级锁MySQL数据库基础与实例教程数据库基础与实例教程方方法法3 3在在更更新新(insertinsert、updateupdate以以及及deletedelete)语语句句中中,InnoD

440、BInnoDB存存储储引引擎擎将将符符合合更更新新条条件件的的记记录录自自动施加排他锁(隐式锁)。动施加排他锁(隐式锁)。即即:InnoDBInnoDB存存储储引引擎擎自自动动地地为为更更新新语语句句影影响响的的记记录施加隐式排他锁。录施加隐式排他锁。9.2.4 9.2.4 InnoDBInnoDB表的行级锁表的行级锁MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置8:完成本书场景描述:完成本书场景描述9:通过事务延长:通过事务延长行级锁的生命周期的任务要求。行级锁的生命周期的任务要求。9.2.4 9.2.4 InnoDBInnoDB表的行级锁表的行级锁MySQL数据库基础与

441、实例教程数据库基础与实例教程任务布置任务布置9 9:完成本书场景描述:完成本书场景描述1010的任务要求。的任务要求。9.2.5 9.2.5 “选课系统选课系统”中的行级锁中的行级锁MySQL数据库基础与实例教程数据库基础与实例教程考虑如下场景:考虑如下场景:MySQLMySQL客户机客户机A A获得了某个获得了某个InnoDBInnoDB表中若干条记录的行级锁,此时表中若干条记录的行级锁,此时MySQLMySQL客户机客户机B B出出于某种原因需要向该表显式地施加表级锁(使用于某种原因需要向该表显式地施加表级锁(使用lock tableslock tables命令即可),命令即可),MySQ

442、LMySQL客户机客户机B B为了获得为了获得该表的表级锁,需要逐行检测表中的行级锁是否该表的表级锁,需要逐行检测表中的行级锁是否与表级锁兼容,而这种检测需要耗费大量的服务与表级锁兼容,而这种检测需要耗费大量的服务器资源。器资源。 9.2.6 9.2.6 InnoDBInnoDB表的意向锁表的意向锁MySQL数据库基础与实例教程数据库基础与实例教程试想:如果MySQL客户机A获得该表若干条记录的行级锁之前,MySQL客户机A直接向该表施加一个“表级锁”(这个表级锁是隐式的,也叫意向锁),MySQL客户机B仅仅需要检测自己的表级锁与该意向锁是否兼容,无需逐行检测该表是否存在行级锁,就会节省不少服

443、务器资源。9.2.6 9.2.6 InnoDBInnoDB表的意向锁表的意向锁MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL提供了两种意向锁:意向共享锁(提供了两种意向锁:意向共享锁(ISIS)和意)和意向排它锁(向排它锁(IXIX)。)。9.2.6 9.2.6 InnoDBInnoDB表的意向锁表的意向锁MySQL数据库基础与实例教程数据库基础与实例教程意向共享锁(意向共享锁(ISIS):向):向InnoDBInnoDB表的某些记录施加表的某些记录施加行级共享锁时,行级共享锁时,InnoDBInnoDB存储引擎会自动地向该表存储引擎会自动地向该表施加意向共享锁(施加意

444、向共享锁(ISIS)。也就是说:执行)。也就是说:执行“select * from select * from 表表 where where 条件语句条件语句 lock in lock in share mode;share mode;”后,后,InnoDBInnoDB存储引擎在为表中符合存储引擎在为表中符合条件语句的记录施加共享锁前,条件语句的记录施加共享锁前,InnoDBInnoDB会自动地会自动地为该表施加意向共享锁(为该表施加意向共享锁(ISIS)。)。9.2.6 9.2.6 InnoDBInnoDB表的意向锁表的意向锁MySQL数据库基础与实例教程数据库基础与实例教程意向排它锁(意向

445、排它锁(IXIX):向):向InnoDBInnoDB表的某些记录施加表的某些记录施加行级排它锁时,行级排它锁时,InnoDBInnoDB存储引擎会自动地向该表存储引擎会自动地向该表施加意向排它锁(施加意向排它锁(IXIX)。也就是说:执行更新语)。也就是说:执行更新语句(例如句(例如insertinsert、updateupdate或者或者deletedelete语句)或者语句)或者“select * from select * from 表表 where where 条件语句条件语句 for for update;update;”,InnoDBInnoDB存储引擎在为表中符合条件语存储引擎在

446、为表中符合条件语句的记录施加排他锁前,句的记录施加排他锁前,InnoDBInnoDB会自动地为该表会自动地为该表施加意向排它锁(施加意向排它锁(IXIX)。)。9.2.6 9.2.6 InnoDBInnoDB表的意向锁表的意向锁MySQL数据库基础与实例教程数据库基础与实例教程InnoDBInnoDB表的行级锁是通过对表的行级锁是通过对“索引索引”施加锁的方施加锁的方式实现的,这就意味着:只有通过索引字段检索式实现的,这就意味着:只有通过索引字段检索数据的查询语句或者更新语句,才可能施加行级数据的查询语句或者更新语句,才可能施加行级锁;否则锁;否则InnoDBInnoDB将使用表级锁,使用表级

447、锁势必将使用表级锁,使用表级锁势必会降低会降低InnoDBInnoDB表的并发访问性能。表的并发访问性能。任务布置任务布置1010:完成本书场景描述:完成本书场景描述1111的任务要求。的任务要求。注意:间隙锁与记录锁的区别。注意:间隙锁与记录锁的区别。9.2.7 9.2.7 InnoDBInnoDB行级锁与索引之间的关系行级锁与索引之间的关系MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置1111:完成本书场景描述:完成本书场景描述1111的任务要求。的任务要求。注意:间隙锁与记录锁的区别。注意:间隙锁与记录锁的区别。9.2.8 9.2.8 间隙锁与死锁间隙锁与死锁MySQ

448、L数据库基础与实例教程数据库基础与实例教程给给MyISAMMyISAM表施加表级锁不会导致死锁问题的发生,表施加表级锁不会导致死锁问题的发生,这是由于这是由于MyISAMMyISAM总是一次性地获得总是一次性地获得SQLSQL语句的全部语句的全部锁。给锁。给InnoDBInnoDB表施加行级锁可能导致死锁问题的表施加行级锁可能导致死锁问题的发生,这是由于执行发生,这是由于执行SQLSQL语句期间,可以继续施加语句期间,可以继续施加行级锁。因此这里讨论的死锁问题主要是行级锁。因此这里讨论的死锁问题主要是InnoDBInnoDB行级锁产生的死锁问题。行级锁产生的死锁问题。任务布置任务布置1212:

449、完成本书场景描述:完成本书场景描述1313的任务要求。的任务要求。注意:间隙锁与记录锁的区别。注意:间隙锁与记录锁的区别。9.2.8 9.2.8 间隙锁与死锁间隙锁与死锁MySQL数据库基础与实例教程数据库基础与实例教程默默认认情情况况下下:InnoDBInnoDB存存储储引引擎擎一一旦旦出出现现锁锁等等待待超超时时异异常常,InnoDBInnoDB存存储储引引擎擎即即不不会会提提交交事事务务,也也不不会会回回滚滚事事务务,而而这这是是十十分分危危险险的的。一一旦旦发发生生锁锁等等待待超超时时异异常常,应应用用程程序序应应该该自自定定义义错错误误处处理理程程序序,由由程程序序开开发发人人员员选

450、选择择进进一一步步提提交交事事务务,还还是是回回滚滚事务。事务。9.2.9 9.2.9 死锁与锁等待死锁与锁等待MySQL数据库基础与实例教程数据库基础与实例教程123事务的任务是保证一系列更事务的任务是保证一系列更新语句的原子性,锁的任务新语句的原子性,锁的任务是解决并发访问可能导致的是解决并发访问可能导致的数据不一致问题。如果事务数据不一致问题。如果事务与事务之间存在并发操作,与事务之间存在并发操作,此时可以通过隔离级别实现此时可以通过隔离级别实现事务的隔离性,从而实现数事务的隔离性,从而实现数据的并发访问。据的并发访问。 事事务的隔离的隔离级别与并与并发问题事事务的的ACID特性特性设置

451、事置事务的隔离的隔离级别4使用使用间隙隙锁避免幻避免幻读现象象9.3 9.3 事务的事务的ACIDACID特性特性MySQL数据库基础与实例教程数据库基础与实例教程9.3 9.3 事务的事务的ACIDACID特性特性MySQL数据库基础与实例教程数据库基础与实例教程1 1原子性原子性 (Atomicity ) (Atomicity ) 原子性用于标识事务是否完全地完成。原子性用于标识事务是否完全地完成。2 2一致性一致性( Consistency ) ( Consistency ) 事务的一致性保证了事务完成后,数据库能够处事务的一致性保证了事务完成后,数据库能够处于一致性状态。于一致性状态。

452、9.3 9.3 事务的事务的ACIDACID特性特性MySQL数据库基础与实例教程数据库基础与实例教程3 3隔离性隔离性 ( Isolation) ( Isolation) 同一时刻执行多个事务时,一个事务的执行不能同一时刻执行多个事务时,一个事务的执行不能被其他事务干扰。被其他事务干扰。4 4持久性持久性 ( (DurabililyDurabilily) ) 持久性意味着事务一旦成功执行,在系统中产生持久性意味着事务一旦成功执行,在系统中产生的所有变化将是永久的。的所有变化将是永久的。9.3 9.3 事务的事务的ACIDACID特性特性MySQL数据库基础与实例教程数据库基础与实例教程SQL

453、SQL标准定义了四种隔离级别:标准定义了四种隔离级别:read read uncommitteduncommitted(读取未提交的数据)、(读取未提交的数据)、read read committedcommitted(读取提交的数据)、(读取提交的数据)、repeatable repeatable readread(可重复读)以及(可重复读)以及serializableserializable(串行化)。(串行化)。四种隔离级别逐渐增强,其中四种隔离级别逐渐增强,其中read uncommittedread uncommitted的隔离级别最低,的隔离级别最低,serializableser

454、ializable的隔离级别最高。的隔离级别最高。 9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程1 1read uncommittedread uncommitted(读取未提交的数据)(读取未提交的数据)在该隔离级别,所有事务都可以看到其他未提交在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。该隔离级别很少用于实际应用,事务的执行结果。该隔离级别很少用于实际应用,并且它的性能也不比其他隔离级别好多少。并且它的性能也不比其他隔离级别好多少。2 2read committedread committed(读取

455、提交的数据)(读取提交的数据)这是大多数数据库系统的默认隔离级别(但不是这是大多数数据库系统的默认隔离级别(但不是MySQLMySQL默认的)。它满足了隔离的简单定义:一个默认的)。它满足了隔离的简单定义:一个事务只能看见已提交事务所做的改变。事务只能看见已提交事务所做的改变。9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程3 3repeatable readrepeatable read(可重复读)(可重复读)这是这是MySQLMySQL默认的事务隔离级别,它确保同一事务默认的事务隔离级别,它确保同一事务内相同的查询语

456、句,执行结果一致。内相同的查询语句,执行结果一致。9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程4 4serializableserializable(串行化)(串行化)这是最高的隔离级别,它通过强制事务排序,使这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突。换言之,它会在每条之不可能相互冲突。换言之,它会在每条selectselect语句后自动加上语句后自动加上lock in share modelock in share mode,为每个查,为每个查询操作施加一个共享锁。在这个级别,可能导致询操作施加一

457、个共享锁。在这个级别,可能导致大量的锁等待现象。该隔离级别主要用于大量的锁等待现象。该隔离级别主要用于InnoDBInnoDB存储引擎的分布式事务。存储引擎的分布式事务。9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程低级别的事务隔离可以提高事务的并发访问性能,低级别的事务隔离可以提高事务的并发访问性能,却可能导致较多的并发问题(例如脏读、不可重复却可能导致较多的并发问题(例如脏读、不可重复读、幻读等并发问题);高级别的事务隔离可以有读、幻读等并发问题);高级别的事务隔离可以有效避免并发问题,但会降低事务的并发访问性能,

458、效避免并发问题,但会降低事务的并发访问性能,可能导致出现大量的锁等待、甚至死锁现象。可能导致出现大量的锁等待、甚至死锁现象。 脏读脏读( (DrityDrity Read) Read):一个事务可以读到另一个事务:一个事务可以读到另一个事务未提交的数据,脏读问题违背了事务的隔离性原则。未提交的数据,脏读问题违背了事务的隔离性原则。9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程不可重复读不可重复读(Non-repeatable read)(Non-repeatable read):同一个事务:同一个事务内两条相同的查询语

459、句,查询结果不一致。内两条相同的查询语句,查询结果不一致。幻读幻读(Phantom Read)(Phantom Read):同一个事务内,两条相同:同一个事务内,两条相同的查询语句,查询结果应该相同。但是,如果另的查询语句,查询结果应该相同。但是,如果另一个事务同时提交了新数据,本事务再更新时,一个事务同时提交了新数据,本事务再更新时,就会就会“惊奇的惊奇的”发现了这些新数据,貌似之前读发现了这些新数据,貌似之前读到的数据是到的数据是“鬼影鬼影”一样的幻觉。一样的幻觉。9.3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程9.

460、3.2 9.3.2 事务的隔离级别与并发问题事务的隔离级别与并发问题MySQL数据库基础与实例教程数据库基础与实例教程MySQLMySQL支持支持4 4种事务隔离级别,在种事务隔离级别,在InnoDBInnoDB存储引擎存储引擎中,可以使用以下命令设置事务的隔离级别。中,可以使用以下命令设置事务的隔离级别。set global | session transaction set global | session transaction isolation level isolation level read uncommitted | read committed | read uncommi

461、tted | read committed | repeatable read | repeatable read | serializableserializable 9.3.3 9.3.3 设置事务的隔离级别设置事务的隔离级别MySQL数据库基础与实例教程数据库基础与实例教程合理地设置事务的隔离级别,可以有效避免脏读、合理地设置事务的隔离级别,可以有效避免脏读、不可重复读、幻读等并发问题。不可重复读、幻读等并发问题。9.3.3 9.3.3 设置事务的隔离级别设置事务的隔离级别MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置13:完成本书场景描述:完成本书场景描述14:脏读

462、现象的:脏读现象的任务要求。任务要求。任务布置任务布置14:完成本书场景描述:完成本书场景描述15:不可重复读:不可重复读现象的任务要求。现象的任务要求。任务布置任务布置15:完成本书场景描述:完成本书场景描述16:幻读现象的:幻读现象的任务要求。任务要求。任务布置任务布置16:完成本书场景描述:完成本书场景描述17:并发访问性:并发访问性能问题的任务要求。能问题的任务要求。9.3.3 9.3.3 设置事务的隔离级别设置事务的隔离级别MySQL数据库基础与实例教程数据库基础与实例教程MySQL默认的事务隔离级别为默认的事务隔离级别为repeatableread,保持事务的隔离级别,保持事务的隔

463、离级别repeatableread不变,利不变,利用间隙锁的特点,对查询结果集施加共享锁用间隙锁的特点,对查询结果集施加共享锁(lockinsharemode)或者排他锁()或者排他锁(forupdate),同样可以避免幻读现象,同时也不至),同样可以避免幻读现象,同时也不至于降低于降低MySQL的并发访问性能。的并发访问性能。 任务布置任务布置17:完成本书场景描述:完成本书场景描述18的任务要求。的任务要求。9.3.4 9.3.4 使用间隙锁避免幻读现象使用间隙锁避免幻读现象MySQL数据库基础与实例教程数据库基础与实例教程请参看本书的内容请参看本书的内容9.4 9.4 事务与锁机制注意事

464、项事务与锁机制注意事项Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之网上选课系统的开发网上选课系统的开发1 12 23 3 结合之前章节开结合之前章节开发的发的“选课系统选课系统”数据库,借助软件数据库,借助软件工程的思想,本章工程的思想,本章选用选用PHP脚本语言脚本语言开发网上选课系统。开发网上选课系统。4 4网上网上选课系系统的开的开发PHP预备知识预备知识网上网上选课系系统的系的系统规划划网上网上选课系系统的系的系统分析分析5 5网上网上选课系系统的系的系统设计内容一览内容一览 6 67 7结合之前章节开结合之前章节开发的发的“选课系统选课系

465、统”数据库,借助软件数据库,借助软件工程的思想,本章工程的思想,本章选用选用PHP脚本语言脚本语言开发网上选课系统。开发网上选课系统。8 8网上网上选课系系统的系的系统实施施界面界面设计与与MVC模式模式网上网上选课系系统的系的系统测试内容一览内容一览 1 12 23 3PHP是一种被广是一种被广泛应用的、免费泛应用的、免费开源的、服务器开源的、服务器端的、跨平台的、端的、跨平台的、HTML内嵌式的内嵌式的多用途脚本语言多用途脚本语言PHP脚本脚本语言概述言概述为何何选用用B/S结构以及构以及PHP脚本脚本语言言PHP脚本程序的工作流程脚本程序的工作流程45WEB服服务器的部署器的部署注意事注

466、意事项10.1 PHP10.1 PHP预备知识预备知识MySQL数据库基础与实例教程数据库基础与实例教程为何选用为何选用B/S结构:结构:受众更广。受众更广。客户端的开发、维护成本较低。客户端的开发、维护成本较低。业务扩展简单方便。业务扩展简单方便。10.1.1 10.1.1 为何选用为何选用B/SB/S结构以及结构以及PHPPHP脚本语言脚本语言MySQL数据库基础与实例教程数据库基础与实例教程为何选用为何选用PHP脚本语言脚本语言:PHP开发环境易于部署。开发环境易于部署。PHP易学好用易学好用平台无关性(跨平台)。平台无关性(跨平台)。良好的数据库支持。良好的数据库支持。10.1.1 1

467、0.1.1 为何选用为何选用B/SB/S结构以及结构以及PHPPHP脚本语言脚本语言MySQL数据库基础与实例教程数据库基础与实例教程例如例如PHP脚本程序代码。脚本程序代码。这是我的第一个这是我的第一个PHP程序:程序:10.1.2 PHP10.1.2 PHP脚本语言概述脚本语言概述MySQL数据库基础与实例教程数据库基础与实例教程10.1.3 PHP10.1.3 PHP脚本程序的工作流程脚本程序的工作流程MySQL数据库基础与实例教程数据库基础与实例教程为了便于读者快速部署为了便于读者快速部署Apache服务器,本书使服务器,本书使用的用的WampServer版本号是版本号是2.0i,读者

468、可以到人,读者可以到人民邮电出版社教学服务与资源网下载民邮电出版社教学服务与资源网下载WampServer2.0i。另外,还可以通过百度网盘下载。另外,还可以通过百度网盘下载。百度网盘网址:百度网盘网址:http:/ WEB10.1.4 WEB服务器的部署服务器的部署MySQL数据库基础与实例教程数据库基础与实例教程一:启动本机的一:启动本机的MySQL5.6.0服务服务二:开启二:开启WampServer自带的自带的Apache服务服务三:部署数据库服务器与三:部署数据库服务器与WEB服务器服务器10.1.5 10.1.5 注意事项注意事项10.2 10.2 软件开发生命周期软件开发生命周期

469、SDLC SDLC 1 12 23 3系系统统规规划划的的目目标标是是规规划划项项目目范范围围并并做做出出项项目目计计划划。系系统统规规划划的的主主要要任任务务是是定定义义目目标标,确确认认项项目目可可行行性性,制制定定项项目目的的进进度度表表以以及及人人员分工等。员分工等。网上网上选课系系统的可行性分析的可行性分析网上网上选课系系统的目的目标网上网上选课系系统的的项目目进度表度表4网上网上选课系系统的人的人员分工分工10.3 10.3 网上选课系统的系统规划网上选课系统的系统规划MySQL数据库基础与实例教程数据库基础与实例教程加快课程申报、课程审核以及选课的进度,还加快课程申报、课程审核以

470、及选课的进度,还可以避免人为统计可能产生的错误。可以避免人为统计可能产生的错误。通过引入数据库技术,可以实现课程信息的并通过引入数据库技术,可以实现课程信息的并发访问,允许多个学生在同一个时间段内对同一发访问,允许多个学生在同一个时间段内对同一门课程进行选课、退课甚至调课等,更大程度的门课程进行选课、退课甚至调课等,更大程度的保证数据的并发访问。保证数据的并发访问。 10.3.1 10.3.1 网上选课系统的目标网上选课系统的目标MySQL数据库基础与实例教程数据库基础与实例教程网上选课系统的可行性分析可以从以下网上选课系统的可行性分析可以从以下3个角度进个角度进行分析。行分析。 1技术可行性

471、技术可行性2经济可行性经济可行性3法律可行性法律可行性10.3.2 10.3.2 网上选课系统的可行性分析网上选课系统的可行性分析MySQL数据库基础与实例教程数据库基础与实例教程10.3.3 10.3.3 网上选课系统的项目进度表网上选课系统的项目进度表MySQL数据库基础与实例教程数据库基础与实例教程任务布置任务布置2:上机操作,完成本书场景描述:上机操作,完成本书场景描述3的任务要求,理解复合类型的用法。的任务要求,理解复合类型的用法。注意:注意:MySQL模式对复合类型数据的影响。模式对复合类型数据的影响。3.1.5 3.1.5 MySQLMySQL复合类型复合类型MySQL数据库基础

472、与实例教程数据库基础与实例教程 方法一:由一个人完成软件开发生命周期的方法一:由一个人完成软件开发生命周期的所有任务。所有任务。 方法二:由教师担任项目经理,安排方法二:由教师担任项目经理,安排3 35 5人人为一个软件开发小组,每组指定一名组长统筹项为一个软件开发小组,每组指定一名组长统筹项目开发过程中遇到的所有问题;组长指定一名小目开发过程中遇到的所有问题;组长指定一名小组成员为需求调研员,负责收集网上选课系统的组成员为需求调研员,负责收集网上选课系统的功能需求等信息;指定一名界面开发人员、一名功能需求等信息;指定一名界面开发人员、一名程序开发人员、一名数据库管理员以及若干测试程序开发人员

473、、一名数据库管理员以及若干测试人员,共同参与网上选课系统的开发。人员,共同参与网上选课系统的开发。 10.3.4 10.3.4 网上选课系统的人员分工网上选课系统的人员分工系统分析的任务是系统分析的任务是收集相关信息并确收集相关信息并确定系统需求,系统定系统需求,系统分析阶段着重考虑分析阶段着重考虑的是的是“系统做什么系统做什么”的问题。的问题。1 12 2网上网上选课系系统的非功能需求分析的非功能需求分析网上网上选课系系统的功能需求分析的功能需求分析10.4 10.4 网上选课系统的系统分析网上选课系统的系统分析MySQL数据库基础与实例教程数据库基础与实例教程从用户(游客、教师、管理员以及

474、学生)的角度从用户(游客、教师、管理员以及学生)的角度分析网上选课系统的功能需求。分析网上选课系统的功能需求。 10.4.1 10.4.1 网上选课系统的功能需求分析网上选课系统的功能需求分析从从游游客客的的角角度度MySQL数据库基础与实例教程数据库基础与实例教程10.4.1 10.4.1 网上选课系统的功能需求分析网上选课系统的功能需求分析从从教教师师、的的角角度度MySQL数据库基础与实例教程数据库基础与实例教程10.4.1 10.4.1 网上选课系统的功能需求分析网上选课系统的功能需求分析从从学学生生的的角角度度MySQL数据库基础与实例教程数据库基础与实例教程10.4.1 10.4.

475、1 网上选课系统的功能需求分析网上选课系统的功能需求分析从从、管管理理员员的的角角度度MySQL数据库基础与实例教程数据库基础与实例教程非功能需求分析定义了系统的开发环境以及运非功能需求分析定义了系统的开发环境以及运行环境(软件及硬件环境)、性能、安全性、可行环境(软件及硬件环境)、性能、安全性、可用性、可维护性以及可扩展性等内容。用性、可维护性以及可扩展性等内容。10.4.1 10.4.1 网上选课系统的非功能需求分析网上选课系统的非功能需求分析MySQL数据库基础与实例教程数据库基础与实例教程1软件及硬件环境:对于网上选课系统而言,该软件及硬件环境:对于网上选课系统而言,该系统在系统在Wi

476、ndows操作系统环境下开发和运行,系操作系统环境下开发和运行,系统开发时所使用的语言为统开发时所使用的语言为PHP(5.0以上版本),以上版本),所使用的浏览器包括所使用的浏览器包括IE浏览器和浏览器和Firefox浏览器,浏览器,所使用的数据库管理系统为所使用的数据库管理系统为MySQL5.6,所使用,所使用的的WEB服务器为服务器为Apache(2.0以上版本)。对于以上版本)。对于网上选课系统而言,在系统开发阶段,主流的电网上选课系统而言,在系统开发阶段,主流的电脑配置都可满足开发要求。脑配置都可满足开发要求。10.4.1 10.4.1 网上选课系统的非功能需求分析网上选课系统的非功能

477、需求分析MySQL数据库基础与实例教程数据库基础与实例教程2性能:性能的衡量指标主要是响应时间、资源性能:性能的衡量指标主要是响应时间、资源使用率、并发用户数以及吞吐量。使用率、并发用户数以及吞吐量。响应时间:用户发出请求到用户接收到系统返回响应时间:用户发出请求到用户接收到系统返回的响应之间的时间间隔。网上选课系统要求系统的响应之间的时间间隔。网上选课系统要求系统的响应时间少于的响应时间少于0.5秒。秒。资源利用率:指系统各种资源的使用情况,如资源利用率:指系统各种资源的使用情况,如CPU占用率为占用率为68%,内存占用率为,内存占用率为55%,使用,使用“资源实际使用资源实际使用/总的资源

478、可用量总的资源可用量”计算资源利用率。计算资源利用率。10.4.1 10.4.1 网上选课系统的非功能需求分析网上选课系统的非功能需求分析MySQL数据库基础与实例教程数据库基础与实例教程并发用户数:同时在线的最大用户数,反应的是并发用户数:同时在线的最大用户数,反应的是系统的并发处理能力。网上选课系统要求同时在系统的并发处理能力。网上选课系统要求同时在线人数为线人数为200人。人。10.4.1 10.4.1 网上选课系统的非功能需求分析网上选课系统的非功能需求分析MySQL数据库基础与实例教程数据库基础与实例教程吞吐量:对于软件系统来说,吞吐量:对于软件系统来说,“吞吞”进去的是请进去的是请

479、求,求,“吐吐”出来的是结果。具体说来,就是指软出来的是结果。具体说来,就是指软件系统在单位时间内处理用户请求的数量。从业件系统在单位时间内处理用户请求的数量。从业务角度看,吞吐量可以用:请求数务角度看,吞吐量可以用:请求数/秒、页面数秒、页面数/秒、秒、人数人数/天或处理业务数天或处理业务数/小时等单位来衡量。从数据小时等单位来衡量。从数据库的角度看,吞吐量指的是单位时间内,不同库的角度看,吞吐量指的是单位时间内,不同SQL语句的执行数量。从网络角度看,吞吐量可语句的执行数量。从网络角度看,吞吐量可以用:字节以用:字节/秒来衡量。秒来衡量。10.4.1 10.4.1 网上选课系统的非功能需求

480、分析网上选课系统的非功能需求分析MySQL数据库基础与实例教程数据库基础与实例教程3安全性:衡量指标主要是核心数据是否加密,安全性:衡量指标主要是核心数据是否加密,系统对权限设置是否严密,应用服务器、数据库系统对权限设置是否严密,应用服务器、数据库服务器以及网络环境是否安全。服务器以及网络环境是否安全。4可用性:强调的是可用性:强调的是“以人为本以人为本”,可用性考虑,可用性考虑最多的是用户的主观感受。例如简单大方、格式最多的是用户的主观感受。例如简单大方、格式统一的用户界面可以给用户一个比较好的用户体统一的用户界面可以给用户一个比较好的用户体验。验。10.4.1 10.4.1 网上选课系统的

481、非功能需求分析网上选课系统的非功能需求分析MySQL数据库基础与实例教程数据库基础与实例教程5可维护性:衡量指标主要是程序结构是不是有可维护性:衡量指标主要是程序结构是不是有条理,代码是否符合编写规范,注释是否清晰,条理,代码是否符合编写规范,注释是否清晰,文档是否齐全、代码是否结果严格的测试。文档是否齐全、代码是否结果严格的测试。6可扩展性:可扩展性决定了软件系统适应未来可扩展性:可扩展性决定了软件系统适应未来发展的能力。做好可扩展性,首先要做好可维护发展的能力。做好可扩展性,首先要做好可维护性。性。10.4.1 10.4.1 网上选课系统的非功能需求分析网上选课系统的非功能需求分析系统设计

482、的目标是:根据系统分析阶段得到的需系统设计的目标是:根据系统分析阶段得到的需求模型(例如求模型(例如E-R图、数据流程图等),建立系图、数据流程图等),建立系统解决方案的模型。系统设计的任务是阐述系统统解决方案的模型。系统设计的任务是阐述系统如何使用计算机技术、信息技术、网络技术,构如何使用计算机技术、信息技术、网络技术,构建系统的解决方案。系统设计阶段着重考虑的是建系统的解决方案。系统设计阶段着重考虑的是“系统怎么做系统怎么做”的问题。的问题。10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计系统设计包括应用程序结构的设计、程序流程的系统设计包括应用程序结构的设计、程序流程的设

483、计、数据库规范化设计、图形用户界面的设计、设计、数据库规范化设计、图形用户界面的设计、网络模型的设计、系统接口的设计等内容。系统网络模型的设计、系统接口的设计等内容。系统设计使用到的模型主要包括系统流程图、程序流设计使用到的模型主要包括系统流程图、程序流程图、数据库物理模型、图形用户界面、网络拓程图、数据库物理模型、图形用户界面、网络拓扑图等模型。扑图等模型。10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计这里仅仅以系统流程图为例,从宏观的角度,描这里仅仅以系统流程图为例,从宏观的角度,描述网上选课系统各个应用程序之间的依赖关系。述网上选课系统各个应用程序之间的依赖关系。系统流

484、程图描述了系统内计算机程序之间所有控系统流程图描述了系统内计算机程序之间所有控制流程。制流程。10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计游游客客的的系系统统流流程程图图10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计学学生生的的系系统统流流程程图图10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计教教师师的的系系统统流流程程图图10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计管管理理员员的的系系统统流流程程图图10.5 10.5 网上选课系统的系统设计网上选课系统的系统设计请自学本书内容,并上机操作。请自学本书内容,并上机操作

485、。10.6 10.6 网上选课系统的实施网上选课系统的实施网上选课系统的这种编程思想源于网上选课系统的这种编程思想源于MVC模式,模式,MVC全名是全名是ModelViewController,是模型层,是模型层视图层控制器层的缩写。视图层控制器层的缩写。10.6 10.6 网上选课系统的实施网上选课系统的实施10.7 10.7 界面设计与界面设计与MVCMVC模式模式网上选课系统的测试网上选课系统的测试包括功能测试、性能测试、包括功能测试、性能测试、安全性测试、易用性测试等。安全性测试、易用性测试等。10.8 10.8 网上选课系统的系统测试网上选课系统的系统测试网上选课系统的测试网上选课系

486、统的测试包括功能测试、性能测试、包括功能测试、性能测试、安全性测试、易用性测试等。安全性测试、易用性测试等。10.8 10.8 网上选课系统的系统测试网上选课系统的系统测试10.8 10.8 网上选课系统的系统测试网上选课系统的系统测试10.8 10.8 网上选课系统的系统测试网上选课系统的系统测试Thanks孔祥盛孔祥盛MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之资源说明资源说明1 12 23 34 4本书的特点本书的特点说在前面的话说在前面的话本书的提供的资源本书的提供的资源浅谈学习方法浅谈学习方法5 5解决问题方法解决问题方法6 6小结小结内容一览内容一览 教教师师

487、教教学学好好比比导导演演拍拍摄摄一一部部电电影影,不不仅仅需需要要演演员员(学学生生)的的配配合合,还还需需要要挑挑选选好好的的剧剧本(书籍)。本(书籍)。好好的的剧剧本本可可以以让让导导演演(教教师师)、所所有有演演员员(学学生生)更更顺顺利利地地融融入入剧剧情情,不不仅仅可可以以节节省省导导演演(教教师师)的的精精力力,缩缩短短拍拍摄摄周周期期,节节省省拍拍摄摄成成本本,还还可可以以让让所所有有演演员员(学学生生)真真正正地成为地成为“剧情剧情”中的主角。中的主角。1. 1. 说在前面的话说在前面的话本书使用量身定制的案例全面讲解本书使用量身定制的案例全面讲解MySQL基础知识以及基础知识

488、以及MySQL5.6新特性,新特性,InnoDB全全文检索、触发器、存储过程、函数、事务、文检索、触发器、存储过程、函数、事务、锁等概念,全部融入该案例。锁等概念,全部融入该案例。本书尽量将抽象问题形象化、图形化,复本书尽量将抽象问题形象化、图形化,复杂问题简单化。即便读者没有任何数据库基杂问题简单化。即便读者没有任何数据库基础,也丝毫不会影响数据库知识的学习。础,也丝毫不会影响数据库知识的学习。2. 2. 本书的特点本书的特点曾曾经经看看到到有有一一种种极极端端的的说说法法:中中国国不不缺缺好好的的导导演演、好好的的演演员员,而而是是缺缺少少好好的的剧剧本本,对对于学习亦是如此。于学习亦是如

489、此。笔笔者者一一直直认认为为:中中国国不不缺缺乏乏好好的的导导演演(教教师师),也也不不缺缺乏乏好好的的演演员员(学学生生),缺缺乏乏的的是是能能够够让让导导演演(教教师师)和和演演员员(学学生生)快快速速地融入剧情的剧本(教材)。地融入剧情的剧本(教材)。1. 1. 说在前面的话说在前面的话对于学习,亦是如此。学习数据库,尤其对于学习,亦是如此。学习数据库,尤其是学习是学习MySQL,笔者试图编写这样一部,笔者试图编写这样一部“剧剧本本”:让教师、学生快速地融入:让教师、学生快速地融入“剧情剧情”,并且变并且变“学生被动学习学生被动学习”为为“学生主动学习学生主动学习”。笔笔者者相相信信:M

490、ySQL数数据据库库基基础础与与实实例例教教程程就就是是一一本本能能够够满满足足导导演演(教教师师)、演演员员(学学生生)拍拍摄摄要要求求(教教学学要要求求)的的剧剧本本(教教材)。材)。1. 1. 说在前面的话说在前面的话本书选择的案例易于理解、开发,非常适本书选择的案例易于理解、开发,非常适合教学。合教学。本书使用该案例,通过本书使用该案例,通过10个章节的内容,个章节的内容,贯穿贯穿MySQL所有知识点,内容编排一气呵成,所有知识点,内容编排一气呵成,章节之间循序渐进,内容不冲突、不重复、章节之间循序渐进,内容不冲突、不重复、不矛盾。不矛盾。2. 2. 本书的特点本书的特点为了能让读者将

491、所有的时间、精力放在为了能让读者将所有的时间、精力放在MySQL知识点的学习上,本书使用尽可能少的知识点的学习上,本书使用尽可能少的数据库表讲解数据库表讲解MySQL的所有知识点。的所有知识点。本书所使用的表不超过本书所使用的表不超过10张,经常使用的表张,经常使用的表不超过不超过5张,使用张,使用5张表讲解张表讲解MySQL几乎所有的几乎所有的知识点,很大程度上可以减轻教师、学生的负知识点,很大程度上可以减轻教师、学生的负担。但同时也为笔者构思本书的知识框架带来担。但同时也为笔者构思本书的知识框架带来不少挑战,也希望读者理解笔者一片苦心。不少挑战,也希望读者理解笔者一片苦心。2. 2. 本书

492、的特点本书的特点本本书书注注重重软软件件工工程程在在数数据据库库开开发发过过程程中中的的应应用用。数数据据库库初初学学者者通通常常存存在在致致命命的的缺缺陷陷:重重开开发发,轻轻设设计计。开开发发出出来来的的数数据据库库往往往往成成了倒立的金字塔,头重脚轻。了倒立的金字塔,头重脚轻。真真正正的的数数据据库库开开发发,首首先先强强调调的的是是设设计计,其其次次是是开开发发。正正因因为为如如此此,本本书书将将数数据据库库设设计计的的内内容容进进行行详详细细地地讲讲解解,并并且且在在本本书书第第一一章进行了详细讲解。章进行了详细讲解。2. 2. 本书的特点本书的特点撰撰写写本本书书时时,为为了了向向

493、读读者者还还原原笔笔者者真真实实的的开开发发过过程程,本本书书在在内内容容组组织织上上使使用用、保保留留了了一一定定数数量量的的截截图图显显示示执执行行结结果果,有有些些截截图图至至关关重重要要,读读者者甚甚至至必必须须从从截截图图中中得得到到一一些些结结论论。当当然然这这些些截截图图无无疑疑增增加加了了本本书书的的版版面面,希望读者谅解。希望读者谅解。2. 2. 本书的特点本书的特点截至目前,本书提供的资源都是截至目前,本书提供的资源都是免费免费资源资源其中包括:所有其中包括:所有安装程序安装程序、PPT课件课件、教教学大纲学大纲、MySQL源代码源代码、PHP源代码源代码。其它资源(例如其

494、它资源(例如教学计划教学计划、视频视频等)正在等)正在开发中,根据需要,这些资源也将开发中,根据需要,这些资源也将免费免费向读向读者提供。读者也可以时刻者提供。读者也可以时刻关注本书资源更新关注本书资源更新情况。情况。3. 3. 本书提供的资源本书提供的资源本书提供的资源可以到人民邮电出版社教本书提供的资源可以到人民邮电出版社教学服务与资源网下载。学服务与资源网下载。出版社网址:出版社网址:http:/ 3. 本书提供的资源本书提供的资源浅谈学习方法浅谈学习方法安装本书提供的软件安装本书提供的软件按照章节顺序学习、预习按照章节顺序学习、预习仔细观看老师讲解、操作仔细观看老师讲解、操作课后翻看教

495、科书课后翻看教科书自己上机操作自己上机操作“善待善待”本书资源本书资源4. 4. 浅谈学习方法浅谈学习方法如果如果SQL代码运行出错,首先试图在书中代码运行出错,首先试图在书中找到答案;找到答案;如果书中没有答案,建议通过通过百度知如果书中没有答案,建议通过通过百度知道、谷歌搜索引擎找到问题所在(意在锻炼道、谷歌搜索引擎找到问题所在(意在锻炼学生的自学能力、自己解决问题的能力);学生的自学能力、自己解决问题的能力);如果问题依旧没有解决,首先考虑与其他如果问题依旧没有解决,首先考虑与其他同学协商解决(意在锻炼协同能力),直至同学协商解决(意在锻炼协同能力),直至请教老师,解决该问题。请教老师,

496、解决该问题。5. 5. 解决问题方法解决问题方法个人观点个人观点1:因为遗忘,学会自学比学会知:因为遗忘,学会自学比学会知识更重要,会学知识比学会知识更重要。识更重要,会学知识比学会知识更重要。“学会知识学会知识”层次较低。即学会了某个具层次较低。即学会了某个具体的知识。体的知识。“会学知识会学知识”层次较高。意在强调自学能层次较高。意在强调自学能力。力。5. 5. 解决问题方法解决问题方法个人观点个人观点2:学会如何找到知识比掌握知识:学会如何找到知识比掌握知识细节更重要。细节更重要。我们遇到问题时,我们往往不是第一个发我们遇到问题时,我们往往不是第一个发现该问题的人!更不是第一个解决该问题的现该问题的人!更不是第一个解决该问题的人!人!记住:我们往往不是第一个吃螃蟹的人!记住:我们往往不是第一个吃螃蟹的人!要学会使用搜索引擎解决问题。要学会使用搜索引擎解决问题。5. 5. 解决问题方法解决问题方法6. 6. 小结小结

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号