• 1. MySQL基础教程 适合新手,适合老手!
  • 2. 孔祥盛MySQL数据库基础与实例教程 之 数据库设计概述
  • 3. 123 本章抛开MySQL讲解关系数据库设计的相关知识,以“选课系统”为例,讲解“选课系统”数据库的设计流程。 4内容一览 数据库设计的相关知识数据库概述 E-R图关系数据库设计
  • 4. 123 简单地说:数据库(Database或DB)是存储、管理数据的容器; 严格地说:数据库是“按照某种数据结构对数据进行组织、存储和管理的容器”。 总结:数据永远是数据库的核心。关系数据库关系数据库管理系统结构化查询语言SQL1.1 数据库概述
  • 5. 1.1.1 关系数据库管理系统 通过“数据库管理系统”,数据库用户可以轻松地实现数据库容器中各种数据库对象的访问(增、删、改、查等操作),并可以轻松地完成数据库的维护工作(备份、恢复、修复等操作)
  • 6. 数据库用户无法直接通过操作系统获取数据库文件中的具体内容; 数据库管理系统通过调用操作系统的进程管理、内存管理、设备管理以及文件管理等服务,为数据库用户提供管理、控制数据库容器中各种数据库对象、数据库文件的接口。1.1.1 关系数据库管理系统
  • 7. 添加标题添加标题
  • 8. 层次模型面向对象模型网状模型关系模型数据库管理 系统常用的 数学模型
  • 9. 添加标题 基于“关系模型”的数据库管理系统称为关系数据库管理系统(简称为RDBMS)。随着关系数据库管理系统的日臻完善,目前关系数据库管理系统已占据主导地位。 1.1.1 关系数据库管理系统https://www.vertabelo.com/blog/jdd-2013-what-we-found-out-about-databases
  • 10. 2014年2月数据库流行度排行榜截至目前,MySQL已经成功逆袭!1.1.1 关系数据库管理系统
  • 11. 2014年3月数据库流行度排行榜1.1.1 关系数据库管理系统
  • 12. 2014年4月数据库流行度排行榜1.1.1 关系数据库管理系统
  • 13. 开源MySQL源代码免费下载简单MySQL体积小,便于安装MySQL性能足够与商业数据库媲美功能强大MySQL提供的功能足够与商业数据库媲美逆袭原因性能优越1.1.1 关系数据库管理系统
  • 14. 关系数据库中所谓的“关系”,实质上是一张二维表。请看下面的课程表。字段名(列名)第1个字段(列)第1条记录第2条记录第3条记录第4条记录第5条记录第3个字段(列)第2个字段(列)第4个字段(列)1.1.2 关系数据库
  • 15. 作为数据库中最为重要的数据库对象,数据库表的设计过程并非一蹴而就,上述课程表根本无法满足“选课系统”的功能需求。 事实上,数据库表的设计过程并非如此简单,本章的重点就是讨论如何设计结构良好的数据库表。1.1.2 关系数据库
  • 16. 结构化查询语言(Structured Query Language或简称为SQL)是一种应用最为广泛的关系数据库语言,该语言定义了操作关系数据库的标准语法,几乎所有的关系数据库管理系统都支持SQL。1.1.3 结构化查询语言SQL
  • 17. 学习重点
  • 18. 123 数据库设计是一个“系统工程”,要求数据库开发人员: 熟悉“商业领域”的商业知识。 利用“管理学”的知识与其他开发人员进行有效沟通。 掌握一些数据库设计辅助工具。数据库设计辅助工具商业知识和沟通技能“选课系统”概述45定义问题域编码规范1.2 数据库设计的相关知识
  • 19. 数据库技术解决的是“商业领域”的“商业问题”。 数据库开发人员有必要成为该“商业领域”的专家,与其他开发人员(包括最终用户)一起工作,继而使用数据库技术解决该“商业领域”的“商业问题” 。1.2.1 商业知识和沟通技能
  • 20. 1.2.2 数据库设计辅助工具工具模型技术业务模型面向对象分析和设计技术 结构化分析和设计技术 软件测试技术 关系数据库设计技术 Erwin PowerDesigner Rational Rose Visio VC++6.0 Visual studio Eclipse NetBeans 单元测试工具 功能测试工具 性能测试 工具程序流程图 DFD 时序图 状态图CASE工具 IDE工具 测试工具数据模型类图E-R图
  • 21. 限于篇幅,在不影响“选课系统”核心功能的基础上,适当地对该系统进行“定制”、“扩展”以及“瘦身”。 1.2.3 “选课系统”概述
  • 22. 定义问题域是数据库设计过程中重要的活动,它的目标是准确定义要解决的商业问题。 “选课系统”亟需解决的“商业”问题有哪些?1.2.4 定义问题域
  • 23. 在编程的时候会考虑代码的可读性吗?你觉得代码可读性是需要考虑的问题吗? 1. 代码不仅要自己能读懂,还要别人也能看懂? 2. 尽量做到可读,但时间紧任务重的时候就顾不上了? 3. 代码只要自己能读懂就可以了? 4. 代码写完就完了,不用管以后是否能读懂? 5. 不知道,没有想过这个问题?1.2.5 编码规范
  • 24. 请记住:尽最大努力把方便留给别人和将来的自己。 建议大家遵循本书罗列的常用编程规范!
  • 25. 123关系实体和属性E-R图的设计原则 E-R图设计的质量直接决定了关系数据库设计的质量。 1.3 E-R图
  • 26. 实体不是某一个具体事物,而是某一种类别所有事物的统称。 属性通常用于表示实体的某种特征,也可以使用属性表示实体间关系的特征实体属性属性1.3.1 实体和属性
  • 27. E-R图中的关系用于表示实体间存在的联系,在E-R图中,实体间的关系通常使用一条线段表示。 E-R图中实体间的关系是双向的。关系关系1.3.2 关系
  • 28. 基数表示一个实体到另一个实体之间关联的数目,基数是针对关系之间的某个方向提出的概念,基数可以是一个取值范围,也可以是某个具体数值基数可选基数强制1.3.2 关系
  • 29. 元表示关系所关联的实体个数。二元关系二元关系一元关系1.3.2 关系
  • 30. 使用关联(Association)表示实体间关系的属性。关联关联1.3.2 关系
  • 31. 123实体是一个单独的个体,不能存在于另一个实体中,成为另一个实体的属性。属性应该存在于、且只存在于某一个地方(实体或者关联)。同一个实体在同一个E-R图内,仅出现一次。 数据库开发人员通常采用“一事一地”的原则从系统的功能描述中抽象出来E-R图。1.3.3 E-R图的设计原则
  • 32. 1.为E-R图中的每个实体建立一张表。 2.为每张表定义一个主键(如果需要,可以向表添加一个没有实际意义的字段作为该表的主键) 3.增加外键表示一对多关系。 4.建立新表表示多对多关系。 5.为字段选择合适的数据类型。 6.定义约束条件(如果需要)。 7.评价关系的质量,并进行必要的改进。1.4 关系数据库设计
  • 33. student(student_no,student_name,student_contact) course(course_name,up_limit,description,status) teacher(teacher_no,teacher_name,teacher_contact) classes(class_name,department_name) 1.4.1 为每个实体建立一张数据库表
  • 34. 关键字(key):用以唯一标识表中的每行记录。 主键(Primary Key):在所有的关键字中选择一个关键字,作为该表的主关键字,简称主键。1.4.2 为每张表定义一个主键
  • 35. 主键有以下两个特征: (1)表的主键可以是一个字段,也可以是多个字段的组合(这种情况称为复合主键)。 (2)表中主键的值具有唯一性且不能取空值(NULL);当表中的主键由多个字段构成时,每个字段的值都不能取NULL。 主键设计技巧,请参看本书内容。1.4.2 为每张表定义一个主键
  • 36. student(student_no,student_name,student_contact) course(course_no,course_name,up_limit,description,status) teacher(teacher_no,teacher_name,teacher_contact) classes(class_no,class_name,department_name) 1.4.2 为每张表定义一个主键
  • 37. 外键(Foreign Key):如果表A中的一个字段a对应于表B的主键b,则字段a称为表A的外键,此时存储在表A中字段a的值,要么是NULL,要么是来自于表B主键b的值。1.4.3 增加外键表示一对多关系
  • 38. 情形一:如果实体间的关系为一对多关系,则需要将“一”端实体的主键放到“多”端实体中,然后作为“多”端实体的外键,通过该外键即可表示实体间的一对多关系。1.4.3 增加外键表示一对多关系
  • 39. 让学生记住所在班级,远比班级“记住”所有学生容易的多 。1.4.3 增加外键表示一对多关系
  • 40. 情形二:实体间的一对一关系,可以看成一种特殊的一对多关系:将“一”端实体的主键放到另“一”端的实体中,并作为另“一”端的实体的外键,然后将外键定义为唯一性约束(Unique Constraint)。1.4.3 增加外键表示一对多关系
  • 41. PK1.4.3 增加外键表示一对多关系
  • 42. PK后的方案:student(student_no,student_name, student_contact,class_no) course(course_no,course_name,up_limit, description,status,teacher_no) teacher(teacher_no,teacher_name,teacher_contact) classes(class_no,class_name,department_name)1.4.3 增加外键表示一对多关系
  • 43. 情形三:如果两个实体间的关系为多对多关系,则需要添加新表表示该多对多关系,然后将该关系涉及到的实体的“主键”分别放入到新表中(作为新表的外键),并将关系自身的属性放入到新表中作为新表的字段。1.4.4 建立新表表示多对多关系
  • 44. teacher(teacher_no,teacher_name, teacher_contact) classes(class_no,class_name,department_name) course(course_no,course_name,up_limit, description,status,teacher_no) student(student_no,student_name, student_contact,class_no) choose(choose_no,student_no,course_no,score,choose_time)1.4.4 建立新表表示多对多关系
  • 45. 1.4.4 建立新表表示多对多关系
  • 46. 1.4.5 为字段选择合适的数据类型
  • 47. 常用的约束条件有6种: 主键(Primary Key)约束 外键(Foreign Key)约束 唯一性(Unique)约束 默认值(Default)约束 非空(Not NULL)约束 检查(Check)约束。1.4.6 定义约束(Constraint)条件
  • 48. 设计数据库时,有两个不争的事实。  数据库中冗余的数据需要额外的维护,因此质量好的一套表应该尽量“减少冗余数据”。  数据库中经常发生变化的数据需要额外的维护,因此质量好的一套表应该尽量“避免数据经常发生变化”。1.4.7 评价数据库表设计的质量
  • 49. 冗余的数据需要额外的维护,并且容易导致“数据不一致”、“插入异常”以及“删除异常”等问题的发生。1.4.8 使用规范化减少数据冗余
  • 50. 场景一:插入异常。 场景二:修改复杂。 场景三:删除异常。1.4.8 使用规范化减少数据冗余
  • 51. 规范化是通过最小化数据冗余来提升数据库设计质量的过程,规范化是基于函数依赖以及一系列范式定义的,最为常用的是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。1.4.8 使用规范化减少数据冗余
  • 52. 函数依赖:一张表内两个字段值之间的一一对应关系称为函数依赖。 第一范式:如果一张表内同类字段不重复出现,该表就满足第一范式的要求。1.4.8 使用规范化减少数据冗余
  • 53. 第一范式1.4.8 使用规范化减少数据冗余
  • 54. 第二范式:一张表在满足第一范式的基础上,如果每个“非关键字”字段“仅仅”函数依赖于主键,那么该表满足第二范式的要求。1.4.8 使用规范化减少数据冗余
  • 55. 第二范式1.4.8 使用规范化减少数据冗余
  • 56. 第三范式:如果一张表满足第二范式的要求,并且不存在“非关键字”字段函数依赖于任何其他“非关键字”字段,那么该表满足第三范式的要求。1.4.8 使用规范化减少数据冗余
  • 57. 第三范式1.4.8 使用规范化减少数据冗余
  • 58. 统计学生的个人资料时,如果读者是一名数据库开发人员,应该让学生上报年龄信息,还是让学生上报出生日期? 如何确保每一门课程选报学生的人数,不超过人数上限? 1.4.9 避免数据经常发生变化
  • 59. 方案一: course(course_no, course_no,course_name, up_limit,description,status,teacher_no, available) 方案二:数据库表无需进行任何更改。 1.4.9 避免数据经常发生变化
  • 60. 任务1:描述“选课系统”的问题域。 任务2:将本书图1-7中“团购网站、顾客以及房源之间的三元关系表示方法 ”E-R图转化为关系(模式)。 任务3:使用笔纸或者word绘图工具,绘制“选课系统”的E-R图。 任务4:将“选课系统”的E-R图转化为关系(模式)。任务布置
  • 61. Thanks
  • 62. (本页无文本内容)
  • 63. 孔祥盛MySQL数据库基础与实例教程 之 MySQL基础知识
  • 64. 123 通过本章的学习,读者可以掌握一些常用的MySQL命令,从而对MySQL数据库进行一些简单的管理。 本章知识点较为繁杂,希望保持一份儿耐心。4字符集以及字符序设置MySQL概述 MySQL数据库管理MySQL表管理5系统变量内容一览
  • 65. 123MySQL由瑞典MySQL AB公司开发。 2008年1月MySQL被美国的SUN公司收购。 2009年4月SUN公司又被美国的甲骨文(Oracle)公司收购。MySQL服务的安装MySQL的特点MySQL服务的配置45启动与停止MySQL服务MySQL配置文件2.1 MySQL概述
  • 66. 67MySQL由瑞典MySQL AB公司开发。 2008年1月MySQL被美国的SUN公司收购。 2009年4月SUN公司又被美国的甲骨文(Oracle)公司收购。连接MySQL服务器关系数据库MySQL客户机2.1 MySQL概述
  • 67. MySQL是一个单进程多线程、支持多用户、基于客户机/服务器(Client/Server简称C/S)的关系数据库管理系统 。 性能高效 跨平台支持 简单易用 开源 支持多用户2.1.1 MySQL特点
  • 68. MySQL的使用流程 2.1.1 MySQL特点
  • 69. MySQL其他概念(请参看本书内容): MySQL服务 MySQL服务实例 MySQL服务器 端口号2.1.1 MySQL特点
  • 70. MySQL服务的安装(请参看本书内容)。 建议自学,并上机操作。 注意:本书使用的MySQL为5.6版本。可以到本书指定的网址下载MySQL图形化安装包mysql-5.6.5-m8-win32.msi。 2.1.2 MySQL服务的安装
  • 71. MySQL服务的配置(请参看本书内容)。 建议自学,并上机操作。 配置过程中的其他知识点: OLAP与OLTP Enable Strict Mode选项 字符集/字符序 MySQL超级管理员root账户 my.ini配置文件中 2.1.3 MySQL服务的配置
  • 72. MySQL服务的启动与停止(请参看本书内容)。 建议自学,并上机操作。2.1.4 启动与停止MySQL服务
  • 73. my.ini配置文件包含了多种参数选项组,每个参数选项组通过“[ ]”指定,每个参数选项组可以配置多个参数信息。通常情况下,每个参数遵循“参数名=参数值”这种配置格式,参数名一般是小写字母,参数名大小写敏感。常用的参数选项组有“[client]”、“[mysql]”以及“[mysqld]”参数选项组。2.1.5 MySQL配置文件
  • 74. [client]参数选项组: 配置了MySQL自带的MySQL5.6 命令行窗口可以读取的参数信息。 常用的参数是port(默认值是3306)。 修改该port值会导致新打开的MySQL5.6 命令行窗口无法连接MySQL服务器。2.1.5 MySQL配置文件
  • 75. [mysql]参数选项组: 配置了MySQL客户机程序mysql.exe可以读取的参数信息。 常用的参数有“prompt”、 “default-character-set=gbk”。 修改 “[mysql]”参数选项组中的参数值,将直接影响新打开的MySQL客户机。2.1.5 MySQL配置文件
  • 76. [mysqld]参数选项组: 配置了MySQL服务程序mysqld.exe可以读取的参数信息,mysqld.exe启动时,将[mysqld]参数选项组的参数信息加载到服务器内存,继而生成MySQL服务实例。2.1.5 MySQL配置文件
  • 77. [mysqld]参数选项组: 常用的参数有“port”、“basedir”、“datadir”、“character-set-server”、“sql_mode”、“max_connections”以及“default_storage_engine”等。2.1.5 MySQL配置文件
  • 78. [mysqld]参数选项组: 修改“[mysqld]”参数选项组的参数值,只有重新启动MySQL服务,将修改后的配置文件参数信息加载到服务器内存后,新配置文件才会在新的MySQL服务实例中生效。 如果“[mysqld]”参数选项组的参数信息出现错误,将会导致MySQL服务无法启动。2.1.5 MySQL配置文件
  • 79. MySQL客户机(本书使用前两个): MySQL5.6命令行窗口 CMD命令提示符窗口 WEB浏览器(例如phpMyAdmin) 第三方客户机程序(例如MySQL-Front、MySQL Manager for MySQL等)2.1.6 MySQL客户机
  • 80. phpMyAdmin2.1.6 MySQL客户机
  • 81. MySQL-Front2.1.6 MySQL客户机
  • 82. MySQL Manager for MySQL2.1.6 MySQL客户机
  • 83. 2.1.6 MySQL客户机HeidiSQL
  • 84. MySQL客户机连接MySQL服务器须提供: 合法的登录主机:解决“from”的问题。 合法的账户名以及密码:解决“who”的问题。 MySQL服务器主机名(或IP地址):解决“to”的问题。 端口号:解决“多卡多待”的问题。 MySQL客户机与MySQL服务器是同一台主机时,主机名可以使用localhost(或者127.0.0.1)。2.1.7 连接MySQL服务器
  • 85. 当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 连接MySQL服务器
  • 86. 2.1.7 连接MySQL服务器
  • 87. 123 MySQL由瑞典MySQL AB公司开发,默认情况下MySQL使用的是latin1字符集。 由此可能导致MySQL数据库不够支持中文字符串查询或者发生中文字符串乱码等问题。 MySQL字符集与字符序字符集及字符序概念MySQL的字符集转换过程45MySQL字符集的设置SQL脚本文件2.2 字符集以及字符序设置
  • 88. 字符(Character)是人类语言最小的表义符号,例如‘A’、‘B’等。给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这个数值就是字符的编码(Character Encoding)。 给定一系列字符并赋予对应的编码后,所有这些“字符和编码对”组成的集合就是字符集(Character Set)。 2.2.1 字符集及字符序概念
  • 89. 2.2.1 字符集及字符序概念
  • 90. 字符序(Collation)是指在同一字符集内字符之间的比较规则。一个字符集包含多种字符序,每个字符序唯一对应一种字符集。 MySQL字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci、cs或bin结尾。 ci表示大小写不敏感,cs表示大小写敏感,bin表示按二进制编码值比较。2.2.1 字符集及字符序概念
  • 91. 使用MySQL命令show character set; 即可查看当前MySQL服务实例支持的字符集、字符集默认的字符序以及字符集占用的最大字节长度等信息 latin1支持西欧字符、希腊字符等 gbk支持中文简体字符 big5支持中文繁体字符 utf8几乎支持世界所有国家的字符。2.2.2 MySQL字符集及字符序
  • 92. 使用MySQL命令 show variables like 'character%'; 即可查看当前MySQL服务实例使用的字符集。2.2.2 MySQL字符集及字符序
  • 93. character_set_client:MySQL客户机字符集。 character_set_connection:数据通信链路字符集,当MySQL客户机向服务器发送请求时,请求数据以该字符集进行编码。 character_set_database:数据库字符集。 character_set_filesystem:MySQL服务器文件系统字符集,该值是固定的binary。2.2.2 MySQL字符集及字符序
  • 94. character_set_results:结果集的字符集,MySQL服务器向MySQL客户机返回执行结果时,执行结果以该字符集进行编码。 character_set_server:MySQL服务实例字符集。 character_set_system:元数据(字段名、表名、数据库名等) 的字符集,默认值为utf8。2.2.2 MySQL字符集及字符序
  • 95. 使用MySQL命令“show collation;”即可查看当前MySQL服务实例支持的字符序。2.2.2 MySQL字符集及字符序
  • 96. 2.2.3 MySQL字符集的转换过程
  • 97. 方法1:修改my.ini配置文件,可修改MySQL默认的字符集。 方法2:MySQL提供下列MySQL命令可以“临时地”修改MySQL“当前会话的”字符集以及字符序。2.2.4 MySQL字符集的设置
  • 98. set character_set_client = gbk; set character_set_connection = gbk; set character_set_database = gbk; set character_set_results = gbk; set character_set_server = gbk; set collation_connection = gbk_chinese_ci ; set collation_database = gbk_chinese_ci ; set collation_server = gbk_chinese_ci ;2.2.4 MySQL字符集的设置
  • 99. 方法3:使用MySQL命令 “set names gbk;”可以“临时一次性地”设置character_set_client、character_set_connection以及character_set_results的字符集为gbk 方法4:连接MySQL服务器时指定字符集 mysql --default-character-set=字符集 -h 服务器IP地址 -u 账户名 –p密码2.2.4 MySQL字符集的设置
  • 100. SQL基本的执行方法(两种): \. C:\mysql\init.sql source C:\mysql\init.sql2.2.5 SQL脚本文件
  • 101. 123 数据库是存储数据库对象的容器。MySQL数据库的管理主要包括数据库的创建、选择当前操作的数据库、显示数据库结构以及删除数据库等操作 。查看数据库创建数据库显示数据库结构45选择当前操作的数据库删除数据库2.3 MySQL数据库管理
  • 102. create database choose; 成功创建choose数据库后,数据库根目录下会自动创建数据库目录。2.3.1 创建数据库
  • 103. 使用MySQL命令 show databases; 即可查看MySQL服务实例上所有的数据库 2.3.2 查看数据库
  • 104. 使用MySQL命令 show create database choose; 可以查看choose数据库的相关信息(例如MySQL版本ID号、默认字符集等信息)。2.3.3 显示数据库结构
  • 105. 执行“use choose;”命令后,后续的MySQL命令以及SQL语句将自动操作choose数据库中所有数据库对象。2.3.4 选择当前操作的数据库
  • 106. 删除student数据库,使用SQL语句 drop database student;2.3.5 删除数据库
  • 107. 123表是数据库中最为重要的数据库对象 设置默认的存储引擎MyISAM和InnoDB存储引擎创建数据库表45显示表结构表记录的管理2.4 MySQL表管理
  • 108. 67表是数据库中最为重要的数据库对象 删除表InnoDB表空间2.4 MySQL表管理
  • 109. MySQL提供了插件式(Pluggable)的存储引擎,存储引擎是基于表的,同一个数据库,不同的表,存储引擎可以不同。甚至同一个数据库表,在不同的场合可以应用不同的存储引擎。 2.4.1 MyISAM和InnoDB存储引擎
  • 110. 使用MySQL命令“show engines;”,即可查看MySQL服务实例支持的存储引擎。 2.4.1 MyISAM和InnoDB存储引擎
  • 111. 1.InnoDB存储引擎的特点 支持外键(Foreign Key) 支持事务(Transaction):如果某张表主要提供OLTP支持,需要执行大量的增、删、改操作(insert、delete、update语句),出于事务安全方面的考虑,InnoDB存储引擎是更好的选择。 最新版本的MySQL已经开始支持全文检索。2.4.1 MyISAM和InnoDB存储引擎
  • 112. 2.MyISAM存储引擎的特点 MyISAM具有检查和修复表的大多数工具。 MyISAM表可以被压缩 MyISAM表最早支持全文索引 但MyISAM表不支持事务 但MyISAM表不支持外键(Foreign Key)。 如果需要执行大量的select语句,出于性能方面的考虑,MyISAM存储引擎是更好的选择。2.4.1 MyISAM和InnoDB存储引擎
  • 113. MySQL5.6默认的默认的存储引擎是InnoDB。 使用MySQL命令 set default_storage_engine=MyISAM; 可以“临时地”将MySQL“当前会话的”存储引擎设置为MyISAM,使用MySQL命令“show engines;”可以查看当前MySQL服务实例默认的存储引擎。 2.4.2 设置默认的存储引擎
  • 114. 使用SQL语句“create table表名”即可创建一个数据库表。例如: use choose; set default_storage_engine=InnoDB; create table my_table( today datetime, name char(20) );2.4.3 创建数据库表
  • 115. 成功创建InnoDB存储引擎的my_table表后,MySQL服务实例会在数据库目录choose中自动创建一个名字为表名、后缀名为frm的文件。my_table.frm。2.4.3 创建数据库表
  • 116. 将my_table表的存储引擎修改为MyISAM。 use choose; alter table my_table engine=MyISAM;2.4.3 创建数据库表
  • 117. 使用MySQL命令“des table_name;”即可查看表名为table_name的表结构。2.4.4 显示表结构
  • 118. 使用MySQL命令“show create table table_name;”,查看名为table_name表的详细信息。 2.4.4 显示表结构
  • 119. use choose; insert into my_table values(now(),'a'); insert into my_table values(now(),'a'); insert into my_table values(now(),NULL); insert into my_table values(now(),''); select * from my_table; 2.4.5 表记录的管理
  • 120. 任务布置1:完成本书场景描述1 :MyISAM表记录的管理的任务要求。 任务布置2:完成本书场景描述2:InnoDB表记录的管理的任务要求。2.4.5 表记录的管理
  • 121. 1.共享表空间:MySQL服务实例承载的所有数据库的所有InnoDB表的数据信息、索引信息、各种元数据信息以及事务的回滚(UNDO)信息,全部存放在共享表空间文件中。 默认情况下该文件位于数据库根目录下,文件名是ibdata1,且文件的初始大小为10M。可以使用MySQL命令“show variables like ‘innodb_data_file_path’;”查看该文件的的属性。 2.4.6 InnoDB表空间
  • 122. 2.4.6 InnoDB表空间
  • 123. 2.独享表空间:如果将全局系统变量innodb_file_per_table的值设置为ON(innodb_file_per_table的默认值为OFF),那么之后再创建InnoDB存储引擎的新表,这些表的数据信息、索引信息都将保存到独享表空间文件。2.4.6 InnoDB表空间
  • 124. 独享表空间的设置2.4.6 InnoDB表空间
  • 125. use choose; alter table my_table engine=InnoDB; create table second_table( today datetime, name char(20) );2.4.6 InnoDB表空间
  • 126. 2.4.6 InnoDB表空间
  • 127. 任务布置3:完成本书场景描述3的任务要求。2.4.6 InnoDB表空间
  • 128. 使用SQL语句 drop table table_name; 即可删除名为table_name的表。 删除表后,MySQL服务实例会自动删除该表结构定义文件(例如second_table.frm文件),以及数据、索引信息。该命令慎用! 2.4.7 删除表
  • 129. 123MySQL数据库中,变量分为系统变量(以@@开头)以及用户自定义变量(以@开头)。 查看系统变量的值全局系统变量与会话系统变量设置系统变量的值2.5 系统变量
  • 130. 每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。 会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的拷贝。 2.5.1 全局系统变量与会话系统变量
  • 131. 由于各会话在会话期间所做的操作不尽相同,为了标记各个会话,会话系统变量又新增了12个变量。2.5.1 全局系统变量与会话系统变量
  • 132. 2.5.1 全局系统变量与会话系统变量
  • 133. 使用“show global variables;”命令即可查看MySQL服务器内存中所有的全局系统变量信息(有393项之多)。 使用“show session variables;”命令即可查看与当前会话相关的所有会话系统变量以及所有的全局系统变量(有405项之多),此处session关键字可以省略。 2.5.2 查看系统变量的值
  • 134. MySQL中有一些系统变量仅仅是全局系统变量,例如 innodb_data_file_path。 show global variables like 'innodb_data_file_path'; show session variables like 'innodb_data_file_path'; show variables like 'innodb_data_file_path';2.5.2 查看系统变量的值
  • 135. MySQL中有一些系统变量仅仅是会话系统变量,例如MySQL连接ID会话系统变量pseudo_thread_id。 show session variables like 'pseudo_thread_id'; show variables like 'pseudo_thread_id';2.5.2 查看系统变量的值
  • 136. MySQL中有一些系统变量既是全局系统变量,又是会话系统变量,例如系统变量character_set_client 既是全局系统变量,又是会话系统变量。2.5.2 查看系统变量的值
  • 137. 此时查看会话系统变量的方法: show session variables like 'character_set_client'; show variables like 'character_set_client'; 此时查看全局系统变量的方法: show global variables like 'character_set_client';2.5.2 查看系统变量的值
  • 138. 作为MySQL编码规范,MySQL中的系统变量以两个“@”开头。 @@global仅仅用于标记全局系统变量; @@session仅仅用于标记会话系统变量; @@首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。 2.5.2 查看系统变量的值
  • 139. 任务布置4:完成本书场景描述4的任务要求。2.5.2 查看系统变量的值
  • 140. 方法一:修改MySQL源代码,然后对MySQL源代码重新编译(该方法适用于MySQL高级用户,这里不作阐述)。 方法二:最为简单的方法是通过修改MySQL配置文件,继而修改MySQL系统变量的值(fai方法需要重启MySQL服务)。 方法三:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值。 2.5.2 查看系统变量的值
  • 141. 设置全局系统变量的值的方法: set @@global.innodb_file_per_table = default; set @@global.innodb_file_per_table = ON; set global innodb_file_per_table = ON;2.5.2 查看系统变量的值
  • 142. 设置会话系统变量的值的方法: set @@session.pseudo_thread_id = 5; set session pseudo_thread_id = 5; set @@pseudo_thread_id = 5; set pseudo_thread_id = 5;2.5.2 查看系统变量的值
  • 143. MySQL中还有一些特殊的全局系统变量(例如log_bin、tmpdir、version、datadir),在MySQL服务实例运行期间它们的值不能动态修改,不能使用“set”命令进行重新设置,这种变量称为静态变量。 数据库管理员可以使用方法一或者方法二对静态变量的值重新设置。 2.5.2 查看系统变量的值
  • 144. 步骤1:准备工作 方法一:停止MySQL服务 方法二:使用MySQL命令“flush tables with read lock;”将服务器内存中的数据“刷新”到数据库文件中,同时锁定所有表,以保证备份期间不会有新的数据写入。2.6 MySQL数据库备份和恢复
  • 145. 步骤2:备份文件的选取 如果数据库中全部是MyISAM存储引擎的表,最为简单的数据库备份方法就是直接“备份”整个数据库目录。 如果某个数据库中还存在InnoDB存储引擎的表,此时不仅需要“备份”整个数据库目录,还需要备份ibdata1表空间文件以及重做日志文件ib_logfile0与ib_logfile1。2.6 MySQL数据库备份和恢复
  • 146. 步骤2:备份文件的选取 数据库备份时,建议将MySQL配置文件(例如my.ini配置文件)一并进行备份。2.6 MySQL数据库备份和恢复
  • 147. 步骤3:数据库恢复 首先停止MySQL服务;然后将整个数据库目录、MySQL配置文件(例如my.ini配置文件)、ibdata1共享表空间文件以及重做日志文件ib_logfile0与ib_logfile1复制到新MySQL服务器对应的路径,即可恢复数据库中的数据。2.6 MySQL数据库备份和恢复
  • 148. Thanks
  • 149. (本页无文本内容)
  • 150. 孔祥盛MySQL数据库基础与实例教程 之 MySQL表结构的管理
  • 151. 123 本章详细讲解“选课系统”数据库各个表的实施过程,通过本章的学习,读者可以掌握表结构管理的相关知识。 4创建表MySQL数据类型 修改表结构删除表5索引内容一览
  • 152. 123 MySQL提供的数据类型包括数值类型(整数类型和小数类型)、字符串类型、日期类型、复合类型(复合类型包括enum类型和set类型)以及二进制类型 。MySQL小数类型MySQL整数类型MySQL字符串类型45MySQL日期类型MySQL复合类型3.1 MySQL数据类型
  • 153. 67为字段选择合适的数据类型MySQL二进制类型 MySQL提供的数据类型包括数值类型(整数类型和小数类型)、字符串类型、日期类型、复合类型(复合类型包括enum类型和set类型)以及二进制类型 。3.1 MySQL数据类型
  • 154. 3.1.1 MySQL整数类型
  • 155. 整数类型的数,默认情况下既可以表示正整数又可以表示负整数(此时称为有符号数)。如果只希望表示零和正整数,可以使用无符号关键字“unsigned”对整数类型进行修饰(此时称为无符号整数)。 例如:score tinyint unsigned3.1.1 MySQL整数类型
  • 156. 3.1.1 MySQL整数类型
  • 157. 3.1.2 MySQL小数类型
  • 158. decimal(length, precision)用于表示精度确定(小数点后数字的位数确定)的小数类型,length决定了该小数的最大位数,precision用于设置精度(小数点后数字的位数)。 例如: decimal (5,2)表示小数取值范围:999.99~999.99 decimal (5,0)表示: -99999~99999的整数。3.1.2 MySQL小数类型
  • 159. 3.1.2 MySQL小数类型
  • 160. 字符串类型的数据外观上使用单引号括起来,例如学生姓名'张三'、课程名'java程序设计'等。 3.1.3 MySQL字符串
  • 161. char()与varchar(): 例如对于简体中文字符集gbk的字符串而言,varchar(255)表示可以存储255个汉字,而每个汉字占用两个字节的存储空间。假如这个字符串没有那么多汉字,例如仅仅包含一个‘中’字,那么varchar(255)仅仅占用1个字符(两个字节)的储存空间;而char(255)则必须占用255个字符长度的存储空间,哪怕里面只存储一个汉字。 3.1.3 MySQL字符串类型
  • 162. date表示日期,默认格式为‘YYYY-MM-DD’; time表示时间,格式为‘HH:ii:ss’; year表示年份; datetime与timestamp是日期和时间的混合类型,格式为'YYYY-MM-DD HH:ii:ss' 3.1.4 MySQL日期类型
  • 163. datetime与timestamp都是日期和时间的混合类型,区别在于: 表示的取值范围不同,datetime的取值范围远远大于timestamp的取值范围。 将NULL插入timestamp字段后,该字段的值实际上是MySQL服务器当前的日期和时间。 同一个timestamp类型的日期或时间,不同的时区,显示结果不同。 3.1.4 MySQL日期类型
  • 164. 任务布置1:理解datetime与timestamp之间的区别。 上机操作,完成本书场景描述1以及场景描述2的任务要求,理解datetime与timestamp之间的区别。 学会使用now()函数。 注意:now()函数用于获得MySQL服务器的当前时间,该时间与时区的设置密切相关。 3.1.4 MySQL日期类型
  • 165. MySQL 支持两种复合数据类型:enum枚举类型和set集合类型。 enum类型的字段类似于单选按钮的功能,一个enum类型的数据最多可以包含65535个元素。 set 类型的字段类似于复选框的功能,一个set类型的数据最多可以包含64个元素。3.1.5 MySQL复合类型
  • 166. 任务布置2:上机操作,完成本书场景描述3的任务要求,理解复合类型的用法。 注意:MySQL模式对复合类型数据的影响。3.1.5 MySQL复合类型
  • 167. 二进制类型的字段主要用于存储由‘0’和‘1’组成的字符串,因此从某种意义上将,二进制类型的数据是一种特殊格式的字符串。 二进制类型与字符串类型的区别在于:字符串类型的数据按字符为单位进行存储,因此存在多种字符集、多种字符序;而二进制类型的数据按字节为单位进行存储,仅存在二进制字符集binary。 3.1.6 MySQL二进制类型
  • 168. 3.1.6 MySQL二进制类型
  • 169. 选择合适的数据类型,不仅可以节省储存空间,还可以有效地提升数据的计算性能。 (1)在符合应用要求(取值范围、精度)的前提下,尽量使用“短”数据类型 (2)数据类型越简单越好 (3)在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储日期和时间。3.1.7 选择合适的数据类型
  • 170. (4)尽量采用精确小数类型(例如decimal),而不采用浮点数类型。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间,例如百分比使用decimal(4,2)即可。 (5)尽量避免NULL字段,建议将字段指定为NOT NULL约束。3.1.7 选择合适的数据类型
  • 171. 123create table 表名( 字段名1 数据类型 [约束条件], … [其他约束条件], [其他约束条件] )其他选项(例如存储引擎、字符集等选项)设置自增型字段设置约束其他选项的设置45创建“选课系统”数据库表复制一个表结构3.2 创建表
  • 172. 1.设置主键(Primary Key)约束 (1)如果一个表的主键是单个字段,直接在该字段的数据类型或者其他约束条件后加上“primary key”关键字,即可将该字段设置为主键约束,语法规则如下。 字段名 数据类型 [其他约束条件] primary key 例如: student_no char(11) primary key3.2.1 设置约束
  • 173. 1.设置主键(Primary Key)约束 (2)如果一个表的主键是多个字段的组合(例如字段名1与字段名2共同组成主键),定义完所有的字段后,使用下面的语法规则将(字段名1, 字段名2)设置为复合主键。 primary key (字段名1, 字段名2)3.2.1 设置约束
  • 174. 任务布置:完成本书场景描述4:查看某个表的约束条件的任务要求。 注意:MySQL命令后,“\G”的作用。3.2.1 设置约束
  • 175. 默认情况下,MySQL自增型字段的值从1开始递增,且步长为1。设置自增型字段的语法格式如下。 字段名 数据类型 auto_increment3.2.2 设置自增型字段
  • 176. 1.设置表的存储引擎,语法格式如下。 engine=存储引擎类型 2.设置该表的字符集,语法格式如下。 default charset=字符集类型3.2.3 其他选项的设置
  • 177. 3.设置索引关键字的压缩方式,可以通过设置pack_keys选项实现(注意仅对MyISAM存储引擎的表有效),语法格式如下。 pack_keys=压缩类型 压缩类型值为default:表示只压缩索引中字符串类型的关键字(例如char、varchar、text等字段),但不压缩数值类型的关键字。 压缩类型值为0:表示取消索引关键字的压缩。3.2.3 其他选项的设置
  • 178. 3.设置索引关键字的压缩方式 压缩类型值为1:表示压缩索引中所有关键字的储存空间,这样做通常会使检索速度加快,更新速度变慢。例如索引中第一个关键字的值为“perform”,第二关键字的值为“performance”,那么第二关键字会被存储为“7,ance”。3.2.3 其他选项的设置
  • 179. 任务布置2:书写本书场景描述5:创建“选课系统”数据库表的SQL代码,调试,并运行。3.2.4 创建“选课系统”数据库表
  • 180. 复制一个表结构的实现方法有两种。 方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。 create table 新表名 like 源表3.2.5 复制一个表结构
  • 181. 复制一个表结构的实现方法有两种。 方法二、在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。 create table 新表名 select * from 源表3.2.5 复制一个表结构
  • 182. 123 成熟的数据库设计,数据库的表结构一般不会发生变化。数据库的表结构一旦发生变化,基于该表的视图、触发器、存储过程将直接受到影响,甚至导致应用程序的修改。修改约束条件修改字段相关信息修改表的其他选项4修改表名3.3 修改表结构4
  • 183. 1.删除字段 删除表字段的语法格式如下。 alter table 表名 drop 字段名3.3.1 修改字段相关信息
  • 184. 2.添加新字段 向表添加新字段时,通常需要指定新字段在表中的位置。向表添加新字段的语法格式如下。 alter table 表名 add 新字段名 新数据类型 [ 新约束条件 ] [ first | after 旧字段名]3.3.1 修改字段相关信息
  • 185. 3.修改字段名(或者数据类型) (1)修改表的字段名(及数据类型)的语法格式如下。 alter table 表名 change 旧字段名 新字段名 新数据类型3.3.1 修改字段相关信息
  • 186. 3.修改字段名(或者数据类型) (2)如果仅对字段的数据类型进行修改,可以使用下面的语法格式。 alter table 表名 modify 字段名 新数据类型3.3.1 修改字段相关信息
  • 187. 1.添加约束条件 向表的某个字段添加约束条件的语法格式如下(其中约束类型可以是唯一性约束、主键约束及外键约束)。 alter table 表名 add constraint 约束名 约束类型 (字段名)3.3.2 修改约束条件
  • 188. 2.删除约束条件 (1)删除表的主键约束条件语法格式比较简单,语法格式如下。 alter table 表名 drop primary key (2)删除表的外键约束时,需指定外键约束名称,语法格式如下(注意需指定外键约束名)。 alter table 表名 drop foreign key 约束名3.3.2 修改约束条件
  • 189. 2.删除约束条件 (3)若要删除表字段的唯一性约束,实际上只需删除该字段的唯一性索引即可,语法格式如下(注意需指定唯一性索引的索引名)。3.3.2 修改约束条件
  • 190. alter table 表名 engine=新的存储引擎类型 alter table 表名 default charset=新的字符集 alter table 表名 auto_increment=新的初始值 alter table 表名 pack_keys=新的压缩类型 3.3.3 修改表的其他选项
  • 191. 修改表名的语法格式较为简单,语法格式如下。 rename table旧表名to新表名 该命令等效于:alter table 旧表名 rename 新表名3.3.4 修改表名
  • 192. 删除表的SQL语法格式比较简单,前面也已经讲过,这里不再赘述。这里唯一需要强调的是删除表时,如果表之间存在外键约束关系,此时需要注意删除表的顺序。 3.4 删除表
  • 193. 123 创建数据库表时,初学者通常仅仅关注该表有哪些字段、字段的数据类型及约束条件等信息,数据库表中另一个重要的概念“索引”很容易被忽视。 索引关键字的选取原则理解索引索引与约束45创建索引删除索引3.5 索引
  • 194. 想象一下现代汉语词典的使用方法,理解索引的重要性。 1.索引的本质是什么? 2.MySQL数据库中,数据是如何检索的? 3.一个数据库表只能创建一个索引吗? 4.什么是前缀索引? 5.索引可以是字段的组合吗? 6.能跨表创建索引吗?3.5.1 理解索引
  • 195. 想象一下现代汉语词典的使用方法,理解索引的重要性。 7.索引数据需要额外的存储空间吗? 8.表中的哪些字段适合选作表的索引?什么是主索引?什么是聚簇索引? 9.索引与数据结构是什么关系? 10.索引非常重要,同一个表,表的索引越多越好吗?3.5.1 理解索引
  • 196. 索引的设计往往需要一定的技巧,掌握了这些技巧,可以确保索引能够大幅地提升数据检索效率,弥补索引在数据更新方面带来的缺陷。 原则1:表的某个字段值离散度越高,该字段越适合选作索引的关键字。 原则2:占用储存空间少的字段更适合选作索引的关键字。3.5.2 索引关键字的选取原则
  • 197. 原则3:较频繁地作为where查询条件的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。 原则4:更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。 原则5.最左前缀原则 原则6.尽量使用前缀索引3.5.2 索引关键字的选取原则
  • 198. 约束主要用于保证业务逻辑操作数据库时数据的完整性;约束是逻辑层面的概念。 索引则是将关键字数据以某种数据结构的方式存储到外存,用于提升数据的检索性能;索引既有逻辑上的概念,更是一种物理存储方式,且事实存在、需要耗费一定的储存空间。3.5.3 索引与约束
  • 199. 索引的种类: 主索引、聚簇索引 唯一性索引 普通索引 复合索引 全文索引(fulltext) 3.5.4 创建索引
  • 200. 方法一:创建表的同时创建索引create table 表名( 字段名1 数据类型 [约束条件], … [其他约束条件], … [ unique | fulltext ] index [索引名] ( 字段名 [(长度)] [ asc | desc ] ) ) engine=存储引擎类型 default charset=字符集类型3.5.4 创建索引
  • 201. create table book( isbn char(20) primary key, name char(100) not null, brief_introduction text not null, price decimal(6,2), publish_time date not null, unique index isbn_unique (isbn), index name_index (name (20)), fulltext index brief_fulltext (name,brief_introduction), index complex_index (price,publish_time) ) engine=MyISAM default charset=gbk;3.5.4 创建索引
  • 202. 方法二、在已有表上创建索引 语法格式一: create [ unique | fulltext ] index 索引名 on 表名 ( 字段名 [(长度)] [ asc | desc ] ) 语法格式二: alter table 表名 add [ unique | fulltext ] index 索引名 ( 字段名 [(长度)] [ asc | desc ] )3.5.4 创建索引
  • 203. 删除索引的语法格式如下。 drop index 索引名 on 表名3.5.5 删除索引
  • 204. Thanks
  • 205. (本页无文本内容)
  • 206. 孔祥盛MySQL数据库基础与实例教程 之 表记录的更新操作
  • 207. 123 本章讲解“选课系统”的各种更新操作,一方面是为接下来的章节准备测试数据,另一方面希望读者对“选课系统”的各个表结构有更深刻的认识,便于后续章节的学习。 4表记录的修改表记录的插入表记录的删除MySQL特殊字符序列内容一览
  • 208. 123 向数据库表插入记录时,可以使用insert语句向表中插入一条或者多条记录,也可以使用insert….select语句向表中插入另一个表的结果集。 更新操作与字符集使用insert语句插入新记录关于自增型字段45批量插入多条记录使用insert….select插入结果集6使用replace插入新记录4.1 表记录的插入
  • 209. 语法格式如下。 insert into 表名 [(字段列表)] values (值列表) 任务布置1:完成本书场景描述1:向表的所有字段插入数据的任务要求。 注意:insert语句的返回结果。4.1.1 使用insert语句插入新记录
  • 210. 任务布置2:完成本书场景描述2:在指定的字段插入数据的任务要求。 任务布置3:完成本书场景描述3:在insert语句中使用默认值的任务要求。 注意:外键约束关系 。4.1.1 使用insert语句插入新记录
  • 211. 从本章开始,MySQL客户机与MySQL服务器之间的数据请求、响应变得更加频繁,当请求数据(或者响应数据)中存在中文字符时,字符集的设置变得非常关键。 任务布置4:完成本书场景描述4:更新操作与字符集的任务要求。4.1.2 更新操作与字符集
  • 212. 任务布置5:完成本书场景描述5:关于自增型字段的任务要求。4.1.3 关于自增型字段
  • 213. 使用insert语句可以一次性地向表批量插入多条记录,语法格式如下。 insert into 表名[(字段列表)] values (值列表1), (值列表2), … (值列表n);4.1.4 批量插入多条记录
  • 214. 在insert语句中使用select子句可以将源表的查询结果添加到目标表中,语法格式如下。 insert into 目标表名[(字段列表1)] select (字段列表2) from 源表 where 条件表达式 注意:字段列表1与字段列表2的字段个数必须相同,且对应字段的数据类型尽量保持一致。 如果源表与目标表的表结构完全相同,“(字段列表1)”可以省略。4.1.5 使用insert….select插入结果
  • 215. replace语句的语法格式有三种语法格式。 语法格式1:replace into 表名 [(字段列表)] values (值列表) 语法格式2:replace [into] 目标表名[(字段列表1)] select (字段列表2) from 源表 where 条件表达式4.1.6 使用replace插入新记录
  • 216. replace语句的语法格式有三种语法格式。 语法格式3: replace [into] 表名 set 字段1=值1, 字段2=值24.1.6 使用replace插入新记录
  • 217. replace语句的功能与insert语句的功能基本相同,不同之处在于:使用replace语句向表插入新记录时,如果新纪录的主键值或者唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也不能违背外键约束条件),然后再插入新记录。4.1.6 使用replace插入新记录
  • 218. 使用replace的最大好处就是可以将delete和insert合二为一,形成一个原子操作,这样就无需将delete操作与insert操作置于事务中了。 任务布置6:完成本书场景描述6:replace语句的用法的任务要求。 说明:考虑到数据库移植,不建议使用replace。4.1.6 使用replace插入新记录
  • 219. update 表名 set 字段名1=值1,字段名2=值2,….. ,字段名n=值n [where 条件表达式] where子句指定了表中的哪些记录需要修改。若省略了where子句,则表示修改表中的所有记录。 set子句指定了要修改的字段以及该字段修改后的值。4.2 表记录的修改
  • 220. 12 表记录的删除通常使用delete语句实现,如果要清空某一个表可以使用truncate语句。 使用truncate清空表记录使用delete删除表记录4.3 表记录的删除
  • 221. delete语句的语法格式如下。 delete from 表名 [where 条件表达式] 说明:如果没有指定where子句,那么该表的所有记录都将被删除,但表结构依然存在。4.3.1 使用delete删除表记录
  • 222. truncate table用于完全清空一个表,语法格式如下。 truncate [table] 表名4.3.2 使用truncate清空表记录
  • 223. 从逻辑上说,truncate语句与“delete from 表名”语句作用相同,但是在某些情况下,两者在使用上有所区别。 例如:清空记录的表如果是父表,那么truncate命令将永远执行失败。如果使用truncate table成功清空表记录,那么会重新设置自增型字段的计数器。truncate table语句不支持事务的回滚,并且不会触发触发器程序的运行。4.3.2 使用truncate清空表记录
  • 224. 任务布置7:完成本书场景描述7:truncate与delete的区别的任务要求。 4.3.2 使用truncate清空表记录
  • 225. MySQL中,当字符串中存在8个特殊字符序列时,字符序列被转义成对应的字符(每个字符序列以反斜线符号“\”开头,且字符序列大小写敏感)。4.4 MySQL特殊字符序列
  • 226. 向表中插入两条学生信息 4.4 MySQL特殊字符序列
  • 227. Thanks
  • 228. (本页无文本内容)
  • 229. 孔祥盛MySQL数据库基础与实例教程 之 表记录的检索
  • 230. 123 本章详细讲解select语句检索表记录的方法,并结合“选课系统”,讨论该系统部分问题域的实现方法。4使用where子句过滤结果集select语句概述使用order by子句对结果集排序使用聚合函数汇总结果集5使用group by子句对记录分组统计内容一览
  • 231. 678 本章详细讲解select语句检索表记录的方法,并结合“选课系统”,讨论该系统部分问题域的实现方法。9子查询合并结果集选课系统综合查询使用正则表达式模糊查询10全文检索内容一览
  • 232. 5.1 select语句概述
  • 233. select语句的语法格式如下。 select 字段列表 from 数据源 [ where条件表达式 ] [ group by 分组字段 [ having条件表达式 ] ] [ order by 排序字段 [ asc | desc ] ]123使用谓词限制记录的行数使用select子句指定字段列表使用from子句指定数据源4多表连接5.1 select语句概述
  • 234. 使用以下几种方式指定字段列表:5.1.1 使用select子句指定字段列表
  • 235. 可以为字段列表中的字段名或表达式指定别名,中间使用as关键字分隔即可(as关键字可以省略)。 多表查询时,同名字段前必须添加表名前缀,中间使用“.”分隔。5.1.1 使用select子句指定字段列表
  • 236. MySQL中的两个谓词distinct和limit可以限制记录的行数。 (1)使用谓词distinct过滤结果集中的重复记录 数据库表中不允许出现重复的记录,但这不意味着select的查询结果集中不会出现记录重复的现象。如果需要过滤结果集中重复的记录,可以使用谓词关键字distinct,语法格式如下。 distinct 字段名5.1.2 使用谓词限制记录的行数
  • 237. (2)使用谓词limit查询某几行记录 查询前几条或者中间某几条记录,可以使用谓词关键字limit实现。语法格式如下。 select字段列表 from数据源 limit [start,]length; start表示从第几行记录开始检索,length表示检索多少行记录。表中第一行记录的start值为0。5.1.2 使用谓词限制记录的行数
  • 238. 例如: select * from student limit 0,3; 该SQL语句等效于: select * from student limit 3; 例如检索choose表中从第2条记录开始的3条记录信息,可以使用下面的SQL语句。 select * from choose limit 1,3;5.1.2 使用谓词限制记录的行数
  • 239. 多张数据库表(或者视图)“缝补”成一个结果集时,需要指定“缝补”条件,该“缝补”条件称为连接条件。 指定连接条件的方法有两种:第一种方法是在where子句中指定连接条件(稍后讲解)。第二种方法是在from子句中使用连接(join)运算将多个数据源按照某种连接条件“缝补”在一起。 5.1.3 使用from子句指定数据源
  • 240. 第二种方法from子句的语法格式如下。 from 表名1 [ 连接类型 ] join 表名2 on 表1和表2之间的连接条件 说明:SQL标准中的连接类型主要分为inner连接(内连接)和outer连接(外连接),而外连接又分为left(左外连接,简称为左连接)、right(右外连接,简称为右连接)以及full(完全外连接,简称完全连接)。5.1.3 使用from子句指定数据源
  • 241. (本页无文本内容)
  • 242. 1.内连接(inner join) 内连接将两个表中满足指定连接条件的记录连接成新的结果集,舍弃所有不满足连接条件的记录。内连接是最常用的连接类型,也是默认的连接类型,可以在from子句中使用inner join(inner关键字可以省略)实现内连接,语法格式如下。 from 表1 [inner] join 表2 on 表1和表2之间的连接条件5.1.3 使用from子句指定数据源
  • 243. 任务布置1:完成本书场景描述1的任务要求。 说明:使用内连接连接两个数据库表时,连接条件会同时过滤表1与表2的记录信息。5.1.3 使用from子句指定数据源
  • 244. 2.外连接(outer join) 外连接又分为左连接(left join)、右连接(right join)和完全连接(full)。与内连接不同,外连接(左连接或右连接)的连接条件只过滤一个表,对另一个表不进行过滤(该表的所有记录出现在结果集中); 注意:MySQL暂不支持完全连接 。5.1.3 使用from子句指定数据源
  • 245. (1)左连接的语法格式 from 表1 left join 表2 on 表1和表2之间的连接条件 说明:语法格式中表1左连接表2,意味着查询结果集中须包含表1的全部记录,然后表1按指定的连接条件与表2进行连接,若表2中没有满足连接条件的记录,则结果集中表2相应的字段填入NULL。5.1.3 使用from子句指定数据源
  • 246. 任务布置2:完成本书场景描述2的任务要求。 5.1.3 使用from子句指定数据源
  • 247. (2)右连接的语法格式 from 表1 right join 表2 on 表1和表2之间的连接条件 说明:语法格式中表1右连接表2,意味着查询结果集中须包含表2的全部记录,然后表2按指定的连接条件与表1进行连接,若表1中没有满足连接条件的记录,则结果集中表1相应的字段填入NULL。 5.1.3 使用from子句指定数据源
  • 248. 任务布置3:完成本书场景描述3的任务要求。 5.1.3 使用from子句指定数据源
  • 249. 以3个表为例,语法格式如下。 from 表1 [连接类型] join 表2 on 表1和表2之间的连接条件 [连接类型] join 表3 on 表2和表3之间的连接条件5.1.4 多表连接
  • 250. (本页无文本内容)
  • 251. 数据库中存储着海量数据,数据库用户往往需要的是满足特定条件的记录,where子句可以实现结果集的过滤筛选。 where子句的语法格式: where 条件表达式123is NULL运算符使用单一的条件过滤结果集select语句与字符集4使用逻辑运算符5使用like进行模糊查询5.2 使用where子句过滤结果集
  • 252. 单一的过滤条件可以使用下面的布尔表达式表示。 表达式1 比较运算符 表达式2 说明:“表达式1”和“表达式2”可以是一个字段名、常量、变量、函数甚至是子查询。 比较运算符用于比较两个表达式的值,比较的结果是一个布尔值(true或者false)。5.2.1 使用单一的条件过滤结果集
  • 253. 常用的比较运算符有=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)。 如果表达式的结果是数值,则按照数值的大小进行比较;如果表达式的结果是字符串,则需要参考字符序collation的设置进行比较。5.2.1 使用单一的条件过滤结果集
  • 254. is NULL用于判断表达式的值是否为空值NULL(is not 恰恰相反),is NULL的语法格式如下。 表达式 is [ not ] NULL 说明:不能将“score is NULL”写成“score = NULL;”,原因是NULL是一个不确定的数,不能使用“=”、“!=”等比较运算符与NULL进行比较。 5.2.2 is NULL运算符
  • 255. 任务布置4:完成本书场景描述4:MySQL客户机显示结果集时出现乱码问题的任务要求。 任务布置5:完成本书场景描述5:查询结果失败问题的任务要求。 任务布置6:完成本书场景描述6:SQL语句解析错误问题的任务要求。5.2.3 select语句与字符集
  • 256. where子句中可以包含多个查询条件,使用逻辑运算符可以将多个查询条件组合起来,完成更为复杂的过滤筛选。常用的逻辑运算符包括逻辑与(and)、逻辑或(or)以及逻辑非(!),其中逻辑非(!)为单目运算符。 5.2.4 使用逻辑运算符
  • 257. 1.逻辑非(!) 逻辑非(!)为单目运算符,逻辑非(!)的使用方法较为简单,如下所示。使用逻辑非(!)操作布尔表达式时,布尔表达式的值为true时,整个逻辑表达式的结果为false,反之亦然。 !布尔表达式5.2.4 使用逻辑运算符
  • 258. 2.and逻辑运算符 使用and逻辑运算符连接两个布尔表达式时,只有两个布尔表达式的值都为true时,整个逻辑表达式的结果才为true。语法格式如下。 布尔表达式1 and 布尔表达式2 5.2.4 使用逻辑运算符
  • 259. 另外MySQL还支持between…and…运算符,between…and…运算符用于判断一个表达式的值是否位于指定的取值范围内,between…and…的语法格式如下。 表达式 [not] between 起始值 and 终止值5.2.4 使用逻辑运算符
  • 260. 3.使用or逻辑运算符 使用or逻辑运算符连接两个布尔表达式时,只有两个表达式的值都为false时,整个逻辑表达式的结果才为false。语法格式如下。 布尔表达式1 or 布尔表达式2 5.2.4 使用逻辑运算符
  • 261. 另外MySQL还支持in运算符,in运算符用于判定一个表达式的值是否位于一个离散的数学集合内,in的语法格式如下。 表达式 [not] in (数学集合)5.2.4 使用逻辑运算符
  • 262. like运算符用于判断一个字符串是否与给定的模式相匹配。 模式是一种特殊的字符串,特殊之处在于不仅包含普通字符,还包含有通配符。在实际应用中,如果不能对字符串进行精确查询,此时可以使用like运算符与通配符实现模糊查询,like运算符的语法格式如下。 字符串表达式 [ not ] like 模式5.2.5 使用like进行模糊查询
  • 263. 模式是一个字符串,其中包含普通字符和通配符。在MySQL中常用的通配符如表所示。5.2.5 使用like进行模糊查询
  • 264. 模糊查询“%”或者“_”字符时,需要将“%”或者“_”字符转义,例如检索学生姓名中所有带“_”的学生信息,可以使用下面的SQL语句,其中new_student表在表记录的更新操作章节中创建。执行结果如图5-23所示。 select * from new_student where student_name like '%\_%';5.2.5 使用like进行模糊查询
  • 265. 如果不想使用“\”作为转义字符,可以使用escape关键字自定义一个转义字符,例如下面的SQL语句使用字符“!”作为转义字符。 select * from new_student where student_name like '%!_%' escape '!';5.2.5 使用like进行模糊查询
  • 266. select语句的查询结果集的排序由数据库系统动态确定,往往是无序的,order by子句用于对结果集排序。在select语句中添加order by子句,就可以使结果集中的记录按照一个或多个字段的值进行排序,排序的方向可以是升序(asc)或降序(desc)。order by子句的语法格式如下。 order by 字段名1 [asc|desc] [ … ,字段名n [asc|desc] ]5.3 使用order by子句对结果集排序
  • 267. 聚合函数用于对一组值进行计算并返回一个汇总值,常用的聚合函数有累加求和sum()函数、平均值avg()函数、统计记录的行数count()函数、最大值max()函数和最小值min()函数等。5.4 使用聚合函数汇总结果集
  • 268. 使用count()对NULL值统计时,count()函数将忽略NULL值。sum()函数、avg()函数、max()以及min()函数等统计函数,统计数据时也将忽略NULL值。5.4 使用聚合函数汇总结果集
  • 269. group by子句将查询结果按照某个字段(或多个字段)进行分组(字段值相同的记录作为一个分组。123group by子句与having子句group by子句与聚合函数group by子句与group_concat()函数4group by子句与with rollup选项5.5 使用group by子句对记录分组统计
  • 270. group by子句通常与聚合函数一起使用。 group by子句的语法格式如下。 group by 字段列表 [ having条件表达式 ] [ with rollup ] 任务布置7:完成本书场景描述7的任务要求。 5.5 使用group by子句对记录分组统计
  • 271. 例如统计每一个班的学生人数。 例如统计每个学生已经选修多少门课程,该生的最高分、最低分、总分及平均成绩。5.5.1 group by子句与聚合函数
  • 272. having子句用于设置分组或聚合函数的过滤筛选条件,having子句通常与group by子句一起使用。having子句语法格式与where子句语法格式类似,having子句语法格式如下。 having条件表达式 其中条件表达式是一个逻辑表达式,用于指定分组后的筛选条件。5.5.2 group by子句与having子句
  • 273. 例如检索平均成绩高于70分的学生信息及平均成绩。5.5.2 group by子句与having子句
  • 274. 下面select语句的语法格式中,select语句的执行过程为:首先使用where子句对结果集进行过滤筛选,接着group by子句分组where子句的输出,最后having子句从分组的结果中再进行筛选。 select 字段列表 from 数据源 where条件表达式 group by 分组字段 having条件表达式 5.5.2 group by子句与having子句
  • 275. group_concat()函数的功能是将集合中的字符串连接起来,此时group_concat()函数的功能与字符串连接函数concat()的功能相似。5.5.3 group by子句与group_concat()函数
  • 276. group_concat()函数的功能是将集合中的字符串连接起来,此时group_concat()函数的功能与字符串连接函数concat()的功能相似。 例如下面SQL语句中的group_concat()函数以及concat()函数负责将集合中('java', '程序', '设计')三个字符串连接起来。 select group_concat('java','程序','设计'), concat('java','程序','设计');5.5.3 group by子句与group_concat()函数
  • 277. group_concat()函数还可以按照分组字段,将另一个字段的值(NULL值除外)使用逗号连接起来。 concat()却函数没有提供这样的功能。 5.5.3 group by子句与group_concat()函数
  • 278. group by子句将结果集分为若干个组,使用聚合函数可以对每个组内的数据进行信息统计,有时需要对各个组进行汇总运算,则需要在每个分组后加上一条汇总记录,这个任务可以通过with rollup选项实现。5.5.4 group by子句与with rollup选项
  • 279. 5.6 合并结果集 使用union可以将多个select 语句的查询结果集组合成一个结果集。 select 字段列表1 from table1 union [all] select 字段列表2 from table2... 说明:字段列表1与字段列表2的字段个数必须相同,且具有相同的数据类型。合并产生的新结果集的字段名与字段列表1中的字段名对应。
  • 280. union 与 union all 的区别: 当使用union时,MySQL 会筛选掉select结果集中重复的记录(在结果集合并后会对新产生的结果集进行排序运算,效率稍低)。而使用union all时,MySQL会直接合并两个结果集,效率高于union。如果可以确定合并前的两个结果集中不包含重复的记录,建议使用union all。5.6 合并结果集
  • 281. 如果一个select语句能够返回单个值或者一列值,且该select语句嵌套在另一个SQL语句中(例如select语句、insert语句、update语句或者delete语句)中,那么该select语句称为子查询(也叫内层查询),包含子查询的SQL语句称为主查询(也叫外层查询)。为了标记子查询与主查询之间的关系,通常将子查询写在小括号内。 子查询分为相关子查询与非相关子查询。 5.7 子查询
  • 282. 子查询一般用在主查询的where子句或having子句中,与比较运算符或者逻辑运算符一起构成where筛选条件或having筛选条件。 123子查询与in运算符子查询与比较运算符子查询与exists逻辑运算符4子查询与any运算符5子查询与all运算符5.7 子查询
  • 283. 如果子查询返回单个值,则可以将一个表达式的值与子查询的结果集进行比较。 子查询可以仅仅使用自己定义的数据源,也可以“直接引用”主查询中的数据源,但两者意义完全不同。5.7.1 子查询与比较运算符
  • 284. 如果子查询中仅仅使用了自己定义的数据源,这种查询是非相关子查询,非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给主查询。 如果子查询中使用了主查询的数据源,这种查询是相关子查询,此时主查询的执行与相关子查询的执行相互依赖。5.7.1 子查询与比较运算符
  • 285. 子查询经常与in运算符一起使用,用于将一个表达式的值与子查询返回的一列值进行比较,如果表达式的值是此列中的任何一个值,则条件表达式的结果为true;否则为false。5.7.2 子查询与in运算符
  • 286. exists逻辑运算符用于检测子查询的结果集是否包含有记录,如果结果集中至少包含一条记录,则exists的结果为true;否则为false。在exists前面加上not时,与上述结果恰恰相反。5.7.3 子查询与exists逻辑运算符
  • 287. any运算符通常与比较运算符一起使用。使用any运算符时,通过比较运算符将一个表达式的值与子查询返回的一列值逐一进行比较,若某次的比较结果为true,则整个表达式的值为true;否则为false。any逻辑运算符的语法格式如下。 表达式 比较运算符 any(子查询)5.7.4 子查询与any运算符
  • 288. 举例来说:当比较运算符为大于号(>)时,“表达式 > any(子查询)”表示至少大于子查询结果集中的某一个值(或者说大于结果集中的最小值),那么整个表达式的结果为true。5.7.4 子查询与any运算符
  • 289. all运算符通常与比较运算符一起使用。使用all运算符时,通过比较运算符将一个表达式的值与子查询返回的一列值逐一进行比较,若每次的比较结果都为true,则整个表达式的值为true;否则为false。any逻辑运算符的语法格式如下。 表达式 比较运算符 all(子查询)5.7.5 子查询与all运算符
  • 290. 举例来说:当比较运算符为大于号(>)时,“表达式 > all(子查询)”表示大于子查询结果集中的任何一个值(或者说大于结果集中的最大值),那么整个表达式的结果为true。5.7.5 子查询与all运算符
  • 291. 任务布置8:书写本章节的select代码。5.8 选课系统综合查询
  • 292. 5.9 使用正则表达式模糊查询 与like运算符相似,正则表达式主要用于判断一个字符串是否与给定的模式匹配,但正则表达式的模式匹配功能比like运算符的模式匹配功能更为强大,且更加灵活。使用正则表达式进行模糊查询时,需要使用regexp关键字,语法格式如下。 字段名 [not] regexp [binary] '正则表达式'
  • 293. 5.9 使用正则表达式模糊查询 正则表达式由一些普通字符和一些元字符构成,普通字符包括大写字母、小写字母和数字,而元字符具有特殊的含义。在最简单的情况下,一个正则表达式是一个不包含元字符的字符串。例如正则表达式'testing'中没有包含任何元字符,它可以匹配'testing'、'123testing'等字符串。
  • 294. 5.9 使用正则表达式模糊查询常用的元字符
  • 295. 例如检索含有“java”的课程信息,可以使用下面的SQL语句。 select * from course where course_name regexp 'java';5.9 使用正则表达式模糊查询
  • 296. 例如检索以“程序设计”结尾的课程信息,可以使用下面的SQL语句。 select * from course where course_name regexp '程序设计$';5.9 使用正则表达式模糊查询
  • 297. 例如检索以“j”开头,以“程序设计”结尾的课程信息,可以使用下面的SQL语句。 select * from course where course_name regexp '^j.*程序设计$';5.9 使用正则表达式模糊查询
  • 298. 例如检索学生联系方式中以15开头或者18开头,且后面跟着9位数字的学生信息,可以使用下面的SQL语句。 select * from student where student_contact regexp '^1[58][0-9]{9}';5.9 使用正则表达式模糊查询
  • 299. 大多数时候,使用like关键字或者正则表达式对字符串进行模糊查询,需要对表进行全表扫描,检索效率较低。 通过全文检索,可以有效提升字符串检索效率。5.10 全文检索
  • 300. 简单地说,MySQL全文检索使用特定的分词技术、利用查询关键字和查询字段内容之间的相关度进行检索,通过全文索引提高文本匹配的速度。全文检索的语法格式如下。 select字段列表 from 表名 where match (全文索引字段1,全文索引字段2,...) against (搜索关键字 [ 全文检索方式 ])5.10 全文检索
  • 301. 在2011年发布的5.6版本中InnoDB存储引擎表实现了全文检索的支持,这将大幅提升InnoDB存储引擎的字符串检索效率,实现更快速、更高质量的模糊查询。 123全文检索方式全文检索的简单应用布尔检索模式的复杂应用4MySQL全文检索的注意事项5InnoDB表的全文检索5.10 全文检索
  • 302. create table book( isbn char(20) primary key, name char(100) not null, brief_introduction text not null, price decimal(6,2), publish_time date not null, unique index isbn_unique (isbn), index name_index (name (20)), fulltext index brief_fulltext (name,brief_introduction), index complex_index (price,publish_time) ) engine=MyISAM default charset=gbk; 创建书籍book表(注意该表为MyISAM存储引擎),在book表中的字段组合(name, brief_introduction)创建一个全文索引 。5.10.1 全文检索的简单应用
  • 303. insert into book(isbn,name,brief_introduction,price,publish_time) values ('978-7-115-25626-3','PHP Fundamentals & Practices','Web Database Applications MySQL offers web developers a mixture of theoretical and practical information on creating web database applications. ','42.0','2012-7-1'), ('978-7-115-25626-4','MySQL COOKBOOK','The MySQL database management system has become quite popular in recent years.','128.0','2008-1-1'), ('978-7-115-25626-5','Beginning MySQL',' MySQL is especially heavily used in combination with a web server for constructing database-backed web sites that involve dynamic content generation.','98.0','2008-1-1'); 向book表插入测试数据。5.10.1 全文检索的简单应用
  • 304. 例如检索书名或者简介中涉及到practices单词的所有图书信息,可以使用下面的SQL语句。 select * from book where match (name,brief_introduction) against ('practices')\G5.10.1 全文检索的简单应用
  • 305. 例如检索书名或者简介中涉及到practices或者cookbook单词的所有图书信息,可以使用下面的SQL语句。 select * from book where match (name,brief_introduction) against ('practices cookbook')\G5.10.1 全文检索的简单应用
  • 306. 检索书名或者简介中涉及到mysql单词的所有图书信息,将检索失败。 MySQL在进行全文检索时,默认情况下将忽略权重超过50%的记录,50%称为阈值(注意读作:yù zhí), 因此检索失败。5.10.1 全文检索的简单应用
  • 307. 如果希望忽略阈值的因素,例如检索书名或者简介中涉及到“mysql”单词的所有图书信息,可以使用下面的SQL语句,执行结果如图5-66所示,该SQL语句使用了布尔检索模式(稍后讲解)。 select * from book where match (name,brief_introduction) against ('mysql' in boolean mode)\G5.10.1 全文检索的简单应用
  • 308. 检索书名或者简介中涉及到php单词的所有图书信息,将检索失败。 这是由于MySQL全文检索对搜索关键字的最小(默认值为4)以及最大长度(默认值为84)进行了设置。5.10.1 全文检索的简单应用
  • 309. 检索书名或者简介中涉及到that单词的所有图书信息,将检索失败。 这是由于MySQL内置了(built-in)545个停用词,其中包括has、all、be、been、that等单词。 5.10.1 全文检索的简单应用
  • 310. 常用的全文检索方式有三种:自然语言检索、布尔检索以及查询括展检索。 (1)自然语言检索(in natural language mode) 自然语言检索是全文检索中的默认类型,只能进行单表查询,但存在阈值的限制。5.10.2 全文检索方式
  • 311. (2)布尔检索(in boolean mode) 布尔检索没有阈值的限制,且可以进行多表查询,还可以包含特定意义的操作符,如 +、-、<、>等。5.10.2 全文检索方式
  • 312. (3)查询括展检索(with query expansion) 查询括展检索是对自然语言检索的一种改动(自动关联度反馈),当查询短语太短时有用。先进行自然语言检索,然后把关联度较高的记录中的词添加到搜索关键字中进行二次自然语言检索,然后返回查询结果集。5.10.2 全文检索方式
  • 313. 布尔检索模式的against子句中,可以在搜索关键字前添加特定意义的操作符,进行复杂语法的全文检索,常用的全文检索操作符如表所示。5.10.3 布尔检索模式的复杂应用
  • 314. 禁用自定义的停用字,重启MySQL服务器,并重建全文索引后,检索书名或者简介中涉及“mysql”但不涉及“php”单词的的所有图书信息,可以使用下面的SQL语句。 select * from book where match (name,brief_introduction) against ('+mysql -php' in boolean mode)\G5.10.3 布尔检索模式的复杂应用
  • 315. MySQL并不支持中文全文索引。 在自然语言检索中,只能检索被全文索引的那些字段,如果要对索引的多个字段进行某一字段的检索,必须对该字段创建单独的全文索引。布尔检索可以在非全文索引的字段上进行,但检索效率会降低。5.10.4 MySQL全文检索的注意事项
  • 316. 全文检索没有记录关键词在字符串中的位置,排序算法比较单一。 全文检索不支持前缀索引。 全文检索会降低更新操作(insert、update以及delete)的效率。5.10.4 MySQL全文检索的注意事项
  • 317. InnoDB与MyISAM存储引擎实现全文检索的方法不同,同样的全文检索SQL语句,同样结构的表,相同的表记录,全文检索的返回结果可能不同。 任务布置9:完成本书场景描述8的任务要求。并分析InnoDB全文检索与MyISAM全文检索的区别。5.10.5 InnoDB表的全文检索
  • 318. Thanks
  • 319. (本页无文本内容)
  • 320. 孔祥盛MySQL数据库基础与实例教程 之 MySQL编程基础
  • 321. 为了便于MySQL代码维护,以及提高MySQL代码的重用性,MySQL开发人员经常将频繁使用的业务逻辑封装成存储程序,MySQL的存储程序分为四类:函数、触发器、存储过程以及事件。 内容一览
  • 322. 123 本章首先介绍了MySQL编程的基础知识,然后讲解了自定义函数的实现方法,接着介绍了MySQL常用的系统函数,最后结合“选课系统”,编写自定义函数模拟实现了中文全文检索。 4自定义函数MySQL编程基础知识系统函数中文全文检索的模拟实现内容一览
  • 323. 123 MySQL程序设计结构是在SQL标准的基础上增加了一些程序设计语言的元素,其中包括常量、变量、运算符、表达式、流程控制以及函数等内容。 用户自定义变量常量运算符与表达式45begin-end语句块重置命令结束标记6.1 MySQL编程基础知识
  • 324. 按照MySQL的数据类型进行划分,可以将常量划分为字符串常量、数值常量、十六进制常量、日期时间常量、二进制常量以及NULL。6.1.1 常量
  • 325. 1.字符串常量 字符串常量是指用单引号或双引号括起来的字符序列。select 'I\'m a \teacher' as col1, "you're a stude\nt" as col2; 由于大多编程语言(例如Java、C等)使用双引号表示字符串,为了便于区分,在MySQL数据库中推荐使用单引号表示字符串。6.1.1 常量
  • 326. 2.数值常量 数值常量可以分为整数常量(例如2013)和小数常量(例如5.26、101.5E5),这里不再赘述。6.1.1 常量
  • 327. 3.日期时间常量 日期时间常量是一个符合特殊格式的字符串。例如'14:30:24'是一个时间常量,'2008-05-12 14:28:24'是一个日期时间常量。日期时间常量的值必须符合日期、时间标准,例如'1996-02-31'是错误的日期常量。6.1.1 常量
  • 328. 3.日期时间常量 日期时间常量是一个符合特殊格式的字符串。例如'14:30:24'是一个时间常量,'2008-05-12 14:28:24'是一个日期时间常量。日期时间常量的值必须符合日期、时间标准,例如'1996-02-31'是错误的日期常量。6.1.1 常量
  • 329. 4. 布尔值 布尔值只包含两个可能的值:true和false。 说明:使用select语句显示布尔值true或者false时,会将其转换为字符串“0”或者字符串“1”。6.1.1 常量
  • 330. 5.二进制常量 二进制常量由数字“0”和“1”组成。二进制常量的表示方法:前缀为“b”,后面紧跟一个“二进制”字符串。例如下面的select语句输出三个字符。其中b‘111101’表示“等号”,b‘1’表示“笑脸”,b‘11’表示“心”。 select b'111101',b'1', b'11';6.1.1 常量
  • 331. 6.十六进制常量 十六进制常量由数字“0”到“9”及字母“a”到“f”或“A”到“F”组成(字母不区分大小写)。十六进制常量有两种表示方法。6.1.1 常量
  • 332. 6.十六进制常量 第一种表示方法:前缀为大写字母“X”或小写字母“x”,后面紧跟一个“十六进制”字符串。 例如select X'41', x'4D7953514C'; 其中X'41'表示大写字母A。x'4D7953514C'表示字符串MySQL。6.1.1 常量
  • 333. 6.十六进制常量 第二种表示方法:前缀为“0x”,后面紧跟一个“十六进制数”(不用引号)。 例如select 0x41, 0x4D7953514C ; 其中0x41表示大写字母A。0x4D7953514C表示字符串MySQL。6.1.1 常量
  • 334. 小结:可以看到,使用select语句显示十六进制数时,会将十六进制数自动转换为“字符串”再进行显示。 如果需要将一个字符串或数字转换为十六进制格式的字符串,可以用hex()函数实现。 例如select hex('MySQL'); hex()函数将“MySQL”字符串转换为十六进制数4D7953514C。6.1.1 常量
  • 335. 小结:十六进制数与字符之间存在一一对应关系,利用这个特点,可以模拟实现中文全文检索。 7. NULL值 NULL值可适用于各种字段类型,它通常用来表示“值不确定”、“没有值”等意义,NULL值参与算术运算、比较运算以及逻辑运算时,结果依然为NULL。6.1.1 常量
  • 336. 变量分为系统变量(以@@开头)以及用户自定义变量。 用户自定义变量分为用户会话变量(以@开头)以及局部变量(不以@开头) 。 6.1.2 用户自定义变量
  • 337. 1.用户会话变量 MySQL客户机1定义了会话变量,会话期间,该会话变量一直有效;MySQL客户机2不能访问MySQL客户机1定义的会话变量;MySQL客户机1关闭或者MySQL客户机1与服务器断开连接后,MySQL客户机1定义的所有会话变量将自动释放,以便节省MySQL服务器的内存空间。6.1.2 用户自定义变量
  • 338. 用户会话变量6.1.2 用户自定义变量
  • 339. 1.用户会话变量 系统会话变量与用户会话变量的共同之处在于:变量名大小写不敏感。系统会话变量与用户会话变量的区别在于:1.用户会话变量一般以一个“@”开头;系统会话变量以两个“@”开头。2.系统会话变量无需定义可以直接使用。6.1.2 用户自定义变量
  • 340. (1)用户会话变量的定义与赋值 一般情况下,用户会话变量的定义与赋值会同时进行。用户会话变量的定义与赋值有两种方法:使用set命令或者使用select语句。 方法一:使用set命令定义用户会话变量,并为其赋值,语法格式如下: set @user_variable1=expression1 [,@user_variable2= expression2 , …]6.1.2 用户自定义变量
  • 341. 说明:用户会话变量的数据类型是根据赋值运算符“=”右边表达式的计算结果自动分配的。也就是说,等号右边的值(包括字符集和字符序)决定了用户会话变量的数据类型(包括字符集和字符序)。6.1.2 用户自定义变量
  • 342. 方法二:使用select语句定义用户会话变量,并为其赋值,语法格式有两种。 第一种语法格式:select @user_variable1:=expression1 [,user_variable2:= expression2 , …] 第二种语法格式:select expression1 into @user_variable1, expression2 into @user_variable2,…6.1.2 用户自定义变量
  • 343. 方法二:使用select语句定义用户会话变量,说明: 第一种语法格式中需要使用“:=”赋值语句,原因在于“=”是为“比较”保留的。 第一种与第二种语法格式的区别在于:第一种语法格式中的select语句会产生结果集,第二种语法格式中的select语句,仅仅用于会话变量的定义及赋值(但不会产生结果集)。6.1.2 用户自定义变量
  • 344. 2.用户会话变量与SQL语句 任务布置1:上机操作,完成本书场景描述1:用户会话变量与SQL语句的任务要求。 注意:哪些方法的select语句产生结果集?哪些方法的select语句不产生结果集?6.1.2 用户自定义变量
  • 345. 3.局部变量 declare命令专门用于定义局部变量及对应的数据类型。局部变量必须定义在存储程序中(例如函数、触发器、存储过程以及事件中),并且局部变量的作用范围仅仅局限于存储程序中,脱离存储程序,局部变量没有丝毫意义。局部变量主要用于下面三种场合。6.1.2 用户自定义变量
  • 346. 3.局部变量 场合一:局部变量定义在存储程序的begin-end语句块(稍后介绍)之间。此时局部变量首先必须使用declare命令定义,并且必须指定局部变量的数据类型。只有定义局部变量后,才可以使用set命令或者select语句为其赋值。6.1.2 用户自定义变量
  • 347. 3.局部变量 场合二:局部变量作为存储过程或者函数的参数使用,此时虽然不需要使用declare命令定义,但需要指定参数的数据类型。6.1.2 用户自定义变量
  • 348. 3.局部变量 场合三:局部变量也可以用在SQL语句中。数据检索时,如果select语句的结果集是单个值,可以将select语句的返回结果赋予局部变量,局部变量也可以直接嵌入到select、insert、update以及delete语句的条件表达式中。6.1.2 用户自定义变量
  • 349. 4.局部变量与用户会话变量的区别 (1)用户会话变量名以“@”开头,而局部变量名前面没有“@”符号。6.1.2 用户自定义变量
  • 350. (2)局部变量使用declare命令定义(存储过程参数、函数参数除外),定义时必须指定局部变量的数据类型;局部变量定义后,才可以使用set命令或者select语句为其赋值。 用户会话变量使用set命令或select语句定义并进行赋值,定义用户会话变量时无需指定数据类型。诸如“declare @student_no int;”的语句是错误语句,用户会话变量不能使用declare命令定义。6.1.2 用户自定义变量
  • 351. 4.局部变量与用户会话变量的区别 (3)用户会话变量的作用范围与生存周期大于局部变量。局部变量如果作为存储过程或者函数的参数,此时在整个存储过程或函数内中有效;如果定义在存储程序的begin-end语句块中,此时仅在当前的begin-end语句块中有效。用户会话变量在本次会话期间一直有效,直至关闭服务器连接。6.1.2 用户自定义变量
  • 352. 4.局部变量与用户会话变量的区别 (4)如果局部变量嵌入到SQL语句中,由于局部变量名前没有“@”符号,这就要求局部变量名不能与表字段名同名,否则将出现无法预期的结果。6.1.2 用户自定义变量
  • 353. 关于局部变量的其他说明: 在MySQL数据库中,由于局部变量涉及begin-end语句块、函数、存储过程等知识,局部变量的具体使用方法将结合这些知识稍后一块儿进行讲解。 declare命令尽量写在begin-end语句块的开头,尽量写在任何其他语句的前面。6.1.2 用户自定义变量
  • 354. 根据运算符功能的不同,可将MySQL的运算符分为算术运算符、比较运算符、逻辑运算符以及位操作运算符。 1.算术运算符 算术运算符用于两个操作数之间执行算术运算。常用的算术运算符有:+(加)、-(减)、*(乘)、/(除)、%(求余)以及div(求商)等6种运算符。6.1.3 运算符与表达式
  • 355. 2.比较运算符 比较运算符(又称关系运算符)用于比较操作数之间的大小关系,其运算结果要么为true、要么为false、要么为NULL(不确定)。6.1.3 运算符与表达式
  • 356. select 'ab '='ab', ' ab'='ab', 'b'>'a', NULL=NULL,NULL<=>NULL, NULL is NULL; 结论:字符串进行比较时,会截掉字符串尾部的空格字符,然后进行比较。6.1.3 运算符与表达式
  • 357. 3.逻辑运算符 逻辑运算符(又称布尔运算符)对布尔值进行操作,其运算结果要么为true、要么为false、要么为NULL(不确定)。 6.1.3 运算符与表达式
  • 358. 4.位运算符 位运算符对二进制数据进行操作(如果不是二进制类型的数,将进行类型自动转换),其运算结果为二进制数。使用select语句显示二进制数时,会将其自动转换为十进制数显示。 6.1.3 运算符与表达式
  • 359. 4.位运算符6.1.3 运算符与表达式
  • 360. [开始标签:] begin [局部]变量的声明; 错误触发条件的声明; 游标的声明; 错误处理程序的声明; 业务逻辑代码; end[结束标签];6.1.5 重置命令结束标记
  • 361. delimiter $$ select * from student where student_name like '张_'$$ delimiter ; select * from student where student_name like '张_';6.1.4 begin-end语句块
  • 362. 123函数可以看作是一个“加工作坊”,这个“加工作坊”接收“调用者”传递过来的“原料”(实际上是函数的参数),然后将这些“原料”“加工处理”成“产品”(实际上是函数的返回值),再把“产品”返回给“调用者”。 函数的创建与调用创建自定义函数的语法格式函数的维护45条件控制语句循环语句6.2 定义函数
  • 363. create function 函数名(参数1,参数2,…)returns 返回值的数据类型 [函数选项] begin 函数体; return 语句; end;6.2.1 创建自定义函数的语法格式
  • 364. 函数选项由以下一种或几种选项组合而成。 language sql | [not] deterministic | { contains sql | no sql | reads sql data | modifies sql data } | sql security { definer | invoker } | comment '注释'6.2.1 创建自定义函数的语法格式
  • 365. 函数选项说明: language sql:默认选项,用于说明函数体使用SQL语言编写。6.2.1 创建自定义函数的语法格式
  • 366. deterministic(确定性):当函数返回不确定值时,该选项是为了防止“复制”时的不一致性。如果函数总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“不确定”的。例如函数返回系统当前的时间,返回值是不确定的。如果既没有给定deterministic也没有给定not deterministic,默认的就是not deterministic。6.2.1 创建自定义函数的语法格式
  • 367. contains sql:表示函数体中不包含读或写数据的语句(例如set命令等)。 no sql:表示函数体中不包含SQL语句。 reads sql data:表示函数体中包含select查询语句,但不包含更新语句。6.2.1 创建自定义函数的语法格式
  • 368. modifies sql data:表示函数体包含更新语句。如果上述选项没有明确指定,默认是contains sql。 sql security:用于指定函数的执行许可。 definer:表示该函数只能由创建者调用。 invoker:表示该函数可以被其他数据库用户调用。默认值是definer。 comment:为函数添加功能说明等注释信息。6.2.1 创建自定义函数的语法格式
  • 369. 任务布置2:上机操作,完成本书场景描述2:简单的自定义函数(空参数)的任务要求。 任务布置3:上机操作,完成场景描述3:自定义函数可以操作数据库中的数据的任务要求。 任务布置4:上机操作,完成场景描述4:将查询结果赋予变量的任务要求。6.2.2 函数的创建与调用
  • 370. 函数的维护包括查看函数的定义、修改函数的定义以及删除函数的定义等内容。6.2.3 函数的维护
  • 371. 1.查看函数的定义 (1)查看当前数据库中所有的自定义函数信息,可以使用MySQL命令“show function status;”。如果自定义函数较多,使用MySQL命令“show function status like 模式;”可以进行模糊查询。 6.2.3 函数的维护
  • 372. 1.查看函数的定义 (2)查看指定数据库(例如choose数据库)中的所有自定义函数名,可以使用下面的SQL语句,如图6-28所示。 select name from mysql.proc where db = 'choose' and type = 'function' ;6.2.3 函数的维护
  • 373. 1.查看函数的定义 (3)使用MySQL命令“show create function 函数名;”可以查看指定函数名的详细信息。例如查看get_name_fn()函数的详细信息,可以使用“show create function get_name_fn\G” 6.2.3 函数的维护
  • 374. 1.查看函数的定义 (4)函数的信息都保存在information_schema数据库中的routines表中,可以使用select语句检索routines表,查询函数的相关信息。 select * from information_schema.routines where routine_name='get_name_fn'\G6.2.3 函数的维护
  • 375. 2.函数定义的修改 由于函数保存的仅仅是函数体,而函数体实际上是一些MySQL表达式,因此函数自身不保存任何用户数据。当函数的函数体需要更改时,可以使用drop function语句暂时将函数的定义删除,然后使用create function语句重新创建相同名字的函数即可。这种方法对于存储过程、视图、触发器的修改同样适用。6.2.3 函数的维护
  • 376. 3.函数定义的删除 使用MySQL命令“drop function函数名”删除自定义函数。例如删除get_name_fn()函数可以使用“drop function get_name_fn;” 。6.2.3 函数的维护
  • 377. 条件控制语句分为两种,一种是if语句,另一种是case语句。6.2.4 条件控制语句
  • 378. 1.if语句 if语句根据条件表达式的值确定执行不同的语句块,if语句的用法格式如下。 if 条件表达式1 then 语句块1; [elseif 条件表达式2 then语句块2] ... [else语句块n] end if; 说明:end if后必须以“;”结束。6.2.4 条件控制语句
  • 379. 6.2.4 条件控制语句
  • 380. 2.case语句 case语句用于实现比if语句分支更为复杂的条件判断,case语句的语法格式如下。 说明:MySQL中的case语句与C语言、Java语言等高级程序设计语言不同,在高级程序设计语言中,每个case的分支需使用“break”跳出,而MySQL无需使用“break”语句。6.2.4 条件控制语句
  • 381. 2.case语句 case 表达式 when value1 then 语句块1; when value2 then 语句块2; … else 语句块n; end case;6.2.4 条件控制语句
  • 382. 6.2.4 条件控制语句
  • 383. MySQL提供了三种循环语句,分别是while、repeat以及loop。除此以外,MySQL还提供了iterate语句以及leave语句用于循环的内部控制。6.2.5 循环语句
  • 384. 1.while语句 当条件表达式的值为true时,反复执行循环体,直到条件表达式的值为false,while语句的语法格式如下。 [循环标签:]while 条件表达式 do 循环体; end while [循环标签]; 说明:end while后必须以“;”结束。6.2.5 循环语句
  • 385. 6.2.5 循环语句
  • 386. 2.leave语句 leave语句用于跳出当前的循环语句(例如while语句),语法格式如下。 leave 循环标签; 说明:leave 循环标签后必须以“;”结束。6.2.5 循环语句
  • 387. 3.iterate语句 iterate语句用于跳出本次循环,继而进行下次循环。iterate语句的语法格式如下。 iterate 循环标签; 说明:iterate循环标签后必须以“;”结束。6.2.5 循环语句
  • 388. 4.repeat语句 当条件表达式的值为false时,反复执行循环,直到条件表达式的值为true,repeat语句的语法格式如下。6.2.5 循环语句
  • 389. 4.repeat语句 [循环标签:]repeat 循环体; until 条件表达式 end repeat [循环标签]; 说明:end repeat后必须以“;”结束。6.2.5 循环语句
  • 390. 5.loop语句的语法格式 由于loop循环语句本身没有停止循环的语句,因此loop通常使用leave语句跳出loop循环,loop的语法格式如下。6.2.5 循环语句
  • 391. 5.loop语句的语法格式 [循环标签:] loop 循环体; if 条件表达式 then leave [循环标签]; end if; end loop; 说明:end loop后必须以“;”结束。6.2.5 循环语句
  • 392. 123 MySQL功能强大的一个重要原因是MySQL内置了许多功能丰富的函数。字符串函数数学函数数据类型转换函数45条件控制函数系统信息函数6.3 系统函数
  • 393. 67 本章讲解的所有函数f(x)对数据x进行操作时,都会产生返回结果,并且数据x的值以及x的数据类型都不会发生丝毫变化。 日期和时间函数其他常用的MySQL函数6.3 系统函数
  • 394. 为了便于读者学习,本书将数学函数归纳为三角函数,指数函数及对数函数,求近似值函数,随机函数,二进制、十六进制函数等。6.3.1 数学函数
  • 395. 1.三角函数 MySQL提供了pi()函数计算圆周率;radians(x)函数负责将角度x转换为弧度;degrees(x)函数负责将弧度x转换为角度。 MySQL还提供了三角函数,正弦函数sin(x)、余弦函数cos(x)、tan(x)正切函数、余切函数cot(x)、反正弦函数asin(x)、反余弦函数acos(x)以及反正切函数atan(x)。 6.3.1 数学函数
  • 396. 2.指数函数及对数函数 MySQL中常用的指数函数有sqrt()平方根函数、pow(x,y) 幂运算函数(计算x的y次方)以及exp(x)函数(计算e的x次方)。 说明:pow(x,y) 幂运算函数还有一个别名函数:power(x,y),实现相同的功能。 6.3.1 数学函数
  • 397. 2.指数函数及对数函数 MySQL中常用的对数函数有log(x)函数(计算x的自然对数)以及log10(x)函数(计算以10为底的对数)。 6.3.1 数学函数
  • 398. 3.求近似值函数 MySQL提供的round(x)函数负责计算离x最近的整数,round(x,y)函数负责计算离x最近的小数(小数点后保留y位);truncate(x,y)函数负责返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入);6.3.1 数学函数
  • 399. 3.求近似值函数 format(x,y)函数负责返回小数点后保留y位的x(进行四舍五入);ceil(x)函数负责返回大于等于x的最小整数;floor(x)函数负责返回小于等于x的最大整数。 6.3.1 数学函数
  • 400. 4.随机函数 MySQL提供了rand()函数负责返回随机数。 6.3.1 数学函数
  • 401. 5.二进制、十六进制函数 bin(x)函数、oct(x)函数和hex(x)函数分别返回x的二进制、八进制和十六进制数;ascii(c)函数返回字符c的ASCII码(ASCII码介于0~255);char (c1,c2,c3,…) 函数将c1、c2……的ASCII码转换为字符,然后返回这些字符组成的字符串;conv(x,code1,code2)函数将code1进制的x变为code2进制数。6.3.1 数学函数
  • 402. 为便于学习,可以将字符串函数归纳为字符串基本信息函数、加密函数、字符串连接函数、修剪函数、子字符串操作函数、字符串复制函数、字符串比较函数以及字符串逆序函数等。6.3.2 字符串函数
  • 403. 注意:字符串函数在对字符串操作时,字符集、字符序的设置至关重要。同一个字符串函数,对同一个字符串进行操作,如果字符集或者字符序设置不同,操作结果可能不同。6.3.2 字符串函数
  • 404. 1.字符串基本信息函数 字符串基本信息函数包括获取字符串字符集的函数、获取字符串长度以及获取字符串占用字节数的函数等。 (1)关于字符串字符集的函数 charset(x)函数返回x的字符集;collation(x)函数返回x的字符序。 6.3.2 字符串函数
  • 405. 1.字符串基本信息函数 (1)关于字符串字符集的函数 convert(x using charset)函数返回x的charset字符集数据(注意x的字符集没有变化)。 6.3.2 字符串函数
  • 406. 1.字符串基本信息函数 (2)获取字符串长度以及获取字符串占用字节数函数 char_length(x)函数用于获取字符串x的长度;length(x)函数用于获取字符串x的占用的字节数。 6.3.2 字符串函数
  • 407. 2.加密函数 加密函数包括不可逆加密函数以及加密-解密函数。 (1)不可逆加密函数 password(x)函数用于对x进行加密,默认返回41位的加密字符串;md5(x)函数用于对x进行加密,默认返回32位的加密字符串。 6.3.2 字符串函数
  • 408. 2.加密函数 (2)加密-解密函数 MySQL提供了两对加密-解密函数分别是:encode(x,key)函数与decode(password, key)函数以及aes_encrypt(x,key) 函数与aes_decrypt(password,key) 函数。其中key为加密密钥(注意读作mìyuè),需要牢记加密时的密钥才能实现密码的解密。6.3.2 字符串函数
  • 409. 2.加密函数 (2)加密-解密函数 encode(x,key)函数使用密钥key对x进行加密,默认返回值是一个二进制数(二进制的位数由x的字节长度决定);decode(password, key)函数使用密钥key对密码password进行解密。 6.3.2 字符串函数
  • 410. 2.加密函数 (2)加密-解密函数 aes_encrypt(x,key)函数使用密钥key对x进行加密,默认返回值是一个128位的二进制数;aes_decrypt(password, key)函数使用密钥key对密码password进行解密。 6.3.2 字符串函数
  • 411. 3.字符串连接函数 concat(x1,x2,….)函数用于将x1、x2等若干个字符串连接成一个新字符串;concat_ws(x,x1,x2,….)函数使用x将x1、x2等若干个字符串连接成一个新字符串。 6.3.2 字符串函数
  • 412. 4.修剪函数 修剪函数包括字符串裁剪函数、字符串大小写转换函数、填充字符串函数等函数。 (1)字符串裁剪函数 ltrim(x)函数用于去掉字符串x开头的所有空格字符;rtrim(x)函数用于去掉字符串x结尾的所有空格字符;trim(x)函数用于去掉字符串x开头以及结尾的所有空格字符。6.3.2 字符串函数
  • 413. 4.修剪函数 (1)字符串裁剪函数 trim([leading | both | trailing] x1 from x2)函数用于从x2字符串的前缀或者(以及)后缀中去掉字符串x1。 6.3.2 字符串函数
  • 414. 4.修剪函数 (1)字符串裁剪函数 left(x,n)函数以及righ(x,n)函数也用于截取字符串。其中left(x,n)函数返回字符串x的前n个字符;right(x,n)函数返回字符串x的后n个字符。 6.3.2 字符串函数
  • 415. 4.修剪函数 (2)字符串大小写转换函数 upper(x)函数以及ucase(x)函数将字符串x中的所有字母变成大写字母,字符串x并没有发生变化;lower(x)函数以及lcase(x)函数将字符串x中的所有字母变成小写字母,字符串x并没有发生变化。 6.3.2 字符串函数
  • 416. 4.修剪函数 (3)填充字符串函数 lpad(x1,len,x2)函数将字符串x2填充到x1的开始处,使字符串x1的长度达到len;rpad(x1,len,x2)函数将字符串x2填充到x1的结尾处,使字符串x1的长度达到len。 6.3.2 字符串函数
  • 417. 5.子字符串操作函数 子字符串操作函数包括取出指定位置的子字符串函数、在字符串中查找指定子字符串的位置函数、子字符串替换函数等。 (1) 取出指定位置的子字符串函数 substring(x,start,length)函数与mid(x,start,length)函数都是从字符串x的第n个位置开始获取length长度的字符串。 6.3.2 字符串函数
  • 418. 5.子字符串操作函数 (2)在字符串中查找指定子字符串的位置函数 locate(x1,x2)函数、position(x1 in x2)函数以及instr(x2,x1)函数都是用于从字符串x2中获取x1的开始位置。 find_in_set(x1,x2)函数也可以获取字符串x2中x1的开始位置(第几个逗号处的位置),不过该函数要求s2是一个用英文的逗号分隔的字符串。 6.3.2 字符串函数
  • 419. 5.子字符串操作函数 (3)子字符串替换函数 MySQL提供了两个子字符串替换函数insert(x1,start,length,x2)和replace(x1,x2,x3)。insert(x1,start,length,x2)函数将字符串x1中从start位置开始、长度为length的子字符串替换为x2。replace(x1,x2,x3)函数用字符串x3替换x1中所有出现的字符串x2,最后返回替换后的字符串。 6.3.2 字符串函数
  • 420. 6.字符串复制函数 字符串复制函数包括repeat(x,n)函数以及space(n)函数。其中repeat(x,n)函数产生一个新字符串,该字符串的内容是字符串x的n次复制;space(n)函数产生一个新字符串,该字符串的内容是空格字符的n次复制。 6.3.2 字符串函数
  • 421. 7.字符串比较函数 strcmp(x1,x2)函数用于比较两个字符串x1和x2,如果x1>x2函数返回值为1;如果x1=x2函数返回值为0;如果x1
  • 422. 8.字符串逆序函数 reverse(x)函数返回一个新字符串,该字符串为字符串x的逆序。 6.3.2 字符串函数
  • 423. 最为常用的数据类型转换函数是convert(x,type)与cast(x as type)函数,另外MySQL还提供了“十六进制字符串”转换为“十六进制数”的函数unhex(x)。 (1)convert()函数 convert()函数有两种用法格式:convert(x using charset)函数返回x的charset字符集数据(刚刚讲过,这里不再赘述)。 6.3.3 数据类型转换函数
  • 424. convert()函数还有另外一种语法格式:convert(x,type),可以实现数据类型的转换。convert(x,type)函数以type数据类型返回x数据(注意x的数据类型没有变化)。除此以外cast(x as type)函数也实现了convert(x,type)函数相同的功能。 6.3.3 数据类型转换函数
  • 425. (2)unhex(x)函数负责将十六进制字符串x转换为十六进制的数值。 6.3.3 数据类型转换函数
  • 426. 条件控制函数的功能是根据条件表达式的值返回不同的值,MySQL中常用的条件控制函数有if()、ifnull()以及case函数。与先前讲解的if语句以及case语句不同,这些函数可以在MySQL客户机中直接调用,可以像max()统计函数一样直接融入到SQL语句中。6.3.4 条件控制函数
  • 427. (1)if()函数 if(condition,v1,v2)函数中condition为条件表达式,当condition的值为true时,函数返回v1的值,否则返回v2的值。 6.3.4 条件控制函数
  • 428. (2)ifnull()函数 ifnull(v1,v2)函数中,如果v1的值为NULL,则该函数返回v2的值;如果v1的值不为NULL,则该函数返回v1的值。6.3.4 条件控制函数
  • 429. (3)case函数 case函数的语法格式如下。如果表达式的值等于when语句中某个“值n”,则case函数返回值为“结果n”;如果与所有的“值n”都不相等,case函数返回值为“其他值”。 case 表达式 when 值1 then 结果1 [ when 值2 then 结果2 ]… [ else 其他值 ] end6.3.4 条件控制函数
  • 430. 1.关于MySQL服务实例的函数 version()函数用于获取当前MySQL服务实例使用的MySQL版本号,该函数的返回值与@@version静态变量的值相同。6.3.5 系统信息函数
  • 431. 2.关于MySQL服务器连接的函数 (1)有关MySQL服务器连接的函数 connection_id()函数用于获取当前MySQL服务器的连接ID,该函数的返回值与@@pseudo_thread_id系统变量的值相同;database()函数与schema()函数用于获取当前操作的数据库。 6.3.5 系统信息函数
  • 432. 2.关于MySQL服务器连接的函数 (2)获取数据库用户信息的函数 user()函数用于获取通过哪一台登录主机、使用什么账户名成功连接MySQL服务器,system_user()函数与session_user()函数是user()函数的别名。current_user()函数用于获取该账户名允许通过哪些登录主机连接MySQL服务器。6.3.5 系统信息函数
  • 433. 1.获取MySQL服务器当前日期或时间函数 (1)curdate()函数、current_date()函数用于获取MySQL服务器当前日期;curtime()函数、current_time()函数用于用于获取MySQL服务器当前时间; 6.3.6 日期和时间函数
  • 434. now()函数、current_timestamp()函数、localtime()函数以及sysdate()函数用于获取MySQL服务器当前日期和时间,这四个函数允许传递一个整数值(小于等于6)作为函数参数,从而获取更为精确的时间信息。 6.3.6 日期和时间函数
  • 435. curdate()函数、current_date()函数、curtime()函数、current_time()函数、now()函数、current_timestamp()函数、localtime()函数以及sysdate()函数的返回值与时区的设置有关。 6.3.6 日期和时间函数
  • 436. (2)获取MySQL服务器当前UNIX时间戳函数 unix_timestamp()函数用于获取MySQL服务器当前UNIX时间戳。 unix_timestamp(datetime)函数将日期时间datetime以UNIX时间戳返回,而from_unixtime(timestamp)函数可以将UNIX时间戳以日期时间格式返回。需要注意的是,这些函数的返回值与时区的设置有关。6.3.6 日期和时间函数
  • 437. (3)获取MySQL服务器当前UTC日期和时间函数 utc_date()函数用于获取UTC日期;utc_time()函数用于获取UTC时间。UTC即世界标准时间,中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。这些函数的返回值与时区的设置无关。6.3.6 日期和时间函数
  • 438. 2.获取日期或时间的某一具体信息的函数 (1)获取年、月、日、时、分、秒、微秒等信息的函数 year(x)函数、month(x)函数、dayofmonth(x)函数、hour(x)函数、minute(x)函数、second(x)函数以及microsecond(x)函数分别用于获取日期时间x的年、月、日、时、分、秒、微秒等信息。 6.3.6 日期和时间函数
  • 439. 另外MySQL还提供了extract(type from x)函数用于获取日期时间x的年、月、日、时、分、秒、微秒等信息,其中type可以分别指定为year、month、day、hour、minute、second、microsecond。 6.3.6 日期和时间函数
  • 440. (2)获取月份、星期等信息的函数 monthname(x)函数用于获取日期时间x的月份信息。dayname(x)函数与weekday(x) 函数用于获取日期时间x的星期信息;dayofweek(x) 函数用于获取日期时间x是本星期的第几天(星期日为第一天,以此类推)。 6.3.6 日期和时间函数
  • 441. (3)获取年度信息的函数 quarter(x)函数用于获取日期时间x在本年是第几季度;week(x)函数与weekofyear(x)函数用于获取日期时间x在本年是第几个星期;dayofyear(x)函数用于获取日期时间x在本年是第几天。 6.3.6 日期和时间函数
  • 442. 3.时间和秒数之间的转换函数 time_to_sec(x)函数用于获取时间x在当天的秒数;sec_to_time(x)函数用于获取当天的秒数x对应的时间。 6.3.6 日期和时间函数
  • 443. 4.日期间隔、时间间隔函数 (1)日期间隔函数 to_days(x)函数用于计算日期x距离0000年1月1日的天数;from_days(x)函数用于计算从0000年1月1日开始n天后的日期;6.3.6 日期和时间函数
  • 444. datediff(x1,x2)函数用于计算日期x1与x2之间的相隔天数;adddate(d,n)函数返回起始日期d加上n天的日期;subdate(d,n)函数返回起始日期d减去n天的日期。 6.3.6 日期和时间函数
  • 445. (2)时间间隔函数 addtime(t,n)函数返回起始时间t加上n秒的时间;subtime(t,n)函数返回起始时间t减去n秒的时间。 6.3.6 日期和时间函数
  • 446. (3)计算指定日期指定间隔的日期函数 date_add(date,interval 间隔 间隔类型)函数返回指定日期date指定间隔的日期。 说明:interval是时间间隔关键字,间隔可以为正数或者负数(建议使用两个单引号括起来)6.3.6 日期和时间函数
  • 447. 6.3.6 日期和时间函数
  • 448. 5.日期和时间格式化函数 (1)时间格式化函数 time_format(t,f)函数按照表达式f的要求显示时间t,表达式f中定义了时间的显示格式,显示格式以%开头。6.3.6 日期和时间函数
  • 449. 6.3.6 日期和时间函数
  • 450. (2)日期和时间格式化函数 date_format(d,f)函数按照表达式f的要求显示日期和时间t,表达式f中定义了日期和时间的显示格式,显示格式以%开头。6.3.6 日期和时间函数
  • 451. 6.3.6 日期和时间函数
  • 452. 1.获得当前MySQL会话最后一次自增字段值 last_insert_id()函数返回当前MySQL会话最后一次insert或update语句设置的自增字段值。 6.3.7 其他常用的MySQL函数
  • 453. last_insert_id()函数的返回结果遵循一定的原则。 (1)last_insert_id()函数仅仅用于获取当前MySQL会话时insert或update语句设置的自增字段值,该函数的返回值与系统会话变量@@last_insert_id的值一致。 (2)自增字段值如果是数据库用户自己指定,而不是自动生成,那么last_insert_id()函数的返回值为0。6.3.7 其他常用的MySQL函数
  • 454. last_insert_id()函数的返回结果遵循一定的原则。 (3)假如使用一条insert语句插入多行记录,last_insert_id()函数只返回第一条记录的自增字段值。 (4)last_insert_id()函数与表无关。如果向表A插入数据后再向表B插入数据,last_insert_id()函数返回表B的自增字段值。6.3.7 其他常用的MySQL函数
  • 455. 2.IP地址与整数相互转换函数 inet_aton(ip)函数用于将IP地址(字符串数据)转换为整数;inet_ntoa(n)函数用于将整数转换为IP地址(字符串数据)。 6.3.7 其他常用的MySQL函数
  • 456. 3.基准值函数 benchmark(n,expression)函数将表达式expression重复执行n次,返回结果为0。 6.3.7 其他常用的MySQL函数
  • 457. 4.uuid()函数 uuid()函数可以生成一个128位的通用唯一识别码UUID(Universally Unique Identifier)。6.3.7 其他常用的MySQL函数
  • 458. 4.uuid()函数 UUID码由5个段构成,其中前3个段与服务器主机的时间有关(精确到微秒);第4段是一个随机数,在当前的MySQL服务实例中该随机数不会变化,除非重启MySQL服务;第5段是通过网卡MAC地址转换得到,同一台MySQL服务器运行多个MySQL服务实例时,该值相等。 6.3.7 其他常用的MySQL函数
  • 459. 任务布置5:上机操作,完成场景描述5:中文全文检索的模拟实现的任务要求。6.4 中文全文检索的模拟实现
  • 460. Thanks
  • 461. (本页无文本内容)
  • 462. 孔祥盛MySQL数据库基础与实例教程 之 视图触发器
  • 463. 123 本章首先讲解了视图以及触发器的管理及使用,然后结合“选课系统”分别介绍视图以及触发器在该系统中的应用。 4触发器视图临时表派生表(Derived Table)5视图、子查询、临时表、派生表内容一览
  • 464. 视图与表有很多相似的地方,视图也是由若干个字段以及若干条记录构成,视图也可以作为select语句的数据源。甚至在某些特定条件下,可以通过视图对表进行更新操作。7.1 视图
  • 465. 123 视图中保存的仅仅是一条select语句,视图中的源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚表。 查看视图的定义创建视图视图在“选课系统”中的应用45视图的作用删除视图7.1 视图
  • 466. 67 视图中保存的仅仅是一条select语句,视图中的源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚表。 检查视图local与cascade检查视图7.1 视图
  • 467. 创建视图的语法格式如下。 create view 视图名 [ (视图字段列表) ] as select语句 7.1.1 创建视图
  • 468. 任务布置1:上机操作,完成本书场景描述1的任务要求,理解“对于经常使用的、结构复杂的select语句,建议将其封装为视图 ” 。7.1.1 创建视图
  • 469. 可以使用下面四种方法查看视图的定义。 1.在choose数据库中成功地创建了视图available_course_view后,该视图的定义默认保存在数据库目录(例如choose目录)下,文件名为available_course_view.frm。使用记事本打开该文件,即可查看该视图的定义。7.1.2 查看视图的定义
  • 470. 可以使用下面四种方法查看视图的定义。 2.视图是一个虚表,也可以使用查看表结构的方式查看视图的定义。 3.MySQL命令“show tables;”命令不仅显示当前数据库中所有的基表,也会将所有的视图罗列出来。7.1.2 查看视图的定义
  • 471. 可以使用下面四种方法查看视图的定义。 4.MySQL系统数据库information_schema的views表存储了所有视图的定义,使用下面的select语句查询该表的所有记录,也可以查看所有视图的详细信息。 select * from information_schema.views\G7.1.2 查看视图的定义
  • 472. 从现在开始,本书将选择“方案一”实现学生选课功能。方案一与方案二的唯一区别在于:方案一中的课程course表比方案二中的课程course表多了一个“剩余的学生名额”available字段。 任务布置2:上机操作,完成本书场景描述2的任务要求。7.1.3 视图在“选课系统”中的应用
  • 473. 1.使操作变得简单 2.避免数据冗余 3.增强数据安全性 4.提高数据的逻辑独立性7.1.4 视图的作用
  • 474. 如果某个视图不再使用,可以使用drop view语句将该视图删除,语法格式如下。 drop view 视图名7.1.5 删除视图
  • 475. 视图分为普通视图与检查视图。 通过检查视图更新基表数据时,只有满足检查条件的更新语句才能成功执行。创建检查视图的语法格式如下。 create view 视图名 [ (视图字段列表) ] as select语句 with [ local | cascaded ] check option7.1.6 检查视图
  • 476. 任务布置3:上机操作,完成本书场景描述3:普通视图与更新操作的任务要求。 任务布置4:上机操作,完成本书场景描述4:检查视图与更新操作的任务要求。 然后分析普通视图与检查视图之间的区别。7.1.6 检查视图
  • 477. 检查视图分为local检查视图与cascade检查视图。 with_check_option的值为1时表示local(local视图), 值为2时表示cascade(级联视图,在视图的基础上再次创建另一个视图)。7.1.6 local与cascade检查视图
  • 478. local 检查视图与 cascade检查视图7.1.6 local与cascade检查视图
  • 479. 123触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。 使用触发器实现检查约束准备工作使用触发器维护冗余数据45使用触发器模拟外键级联选项查看触发器的定义7.2 触发器
  • 480. 67触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。 删除触发器使用触发器的注意事项7.2 触发器
  • 481. 7.2 触发器
  • 482. 使用create trigger语句可以创建一个触发器,语法格式如下。 create trigger 触发器名 触发时间 触发事件 on 表名 for each row begin 触发程序 end7.2.1 准备工作
  • 483. MySQL的触发事件有三种: insert:将新记录插入表时激活触发程序,例如通过insert、load data和replace语句,可以激活触发程序运行。7.2.1 准备工作
  • 484. MySQL的触发事件有三种: update:更改某一行记录时激活触发程序,例如通过update语句,可以激活触发程序运行。 delete:从表中删除某一行记录时激活触发程序,例如通过delete和replace语句,可以激活触发程序运行。7.2.1 准备工作
  • 485. 触发器的触发时间有两种:before与after。 before表示在触发事件发生之前执行触发程序。 after表示在触发事件发生之后执行触发器。因此严格意义上讲一个数据库表最多可以设置六种类型的触发器。7.2.1 准备工作
  • 486. for each row表示行级触发器。 目前MySQL仅支持行级触发器,不支持语句级别的触发器(例如create table等语句)。for each row表示更新(insert、update或者delete)操作影响的每一条记录都会执行一次触发程序。7.2.1 准备工作
  • 487. 触发程序中可以使用old关键字与new关键字。 当向表插入新记录时,在触发程序中可以使用new关键字表示新记录,当需要访问新记录的某个字段值时,可以使用“new.字段名”的方式访问。7.2.1 准备工作
  • 488. 触发程序中可以使用old关键字与new关键字。 当从表中删除某条旧记录时,在触发程序中可以使用old关键字表示旧记录,当需要访问旧记录的某个字段值时,可以使用“old.字段名”的方式访问。7.2.1 准备工作
  • 489. 触发程序中可以使用old关键字与new关键字。 当修改表的某条记录时,在触发程序中可以使用old关键字表示修改前的旧记录、使用new关键字表示修改后的新记录。当需要访问旧记录的某个字段值时,可以使用“old.字段名”的方式访问。当需要访问修改后的新记录的某个字段值时,可以使用“new.字段名”的方式访问。7.2.1 准备工作
  • 490. 触发程序中可以使用old关键字与new关键字。 old记录是只读的,可以引用它,但不能更改它。在before触发程序中,可使用“set new.col_name = value”更改new记录的值。7.2.1 准备工作
  • 491. 前面曾经提到,MySQL可以使用复合数据类型set或者enum对字段的取值范围进行检查约束,使用复合数据类型可以实现离散的字符串数据的检查约束,对于数值型的数不建议使用set或者enum实现检查约束,可以使用触发器实现。7.2.2 使用触发器实现检查约束
  • 492. 任务布置5:上机操作,完成本书场景描述5:使用触发器实现检查约束的任务要求。7.2.2 使用触发器实现检查约束
  • 493. 冗余的数据需要额外的维护,维护冗余数据时,为了避免数据不一致问题的发生(例如:剩余的学生名额+已选学生人数≠课程的人数上限),冗余的数据应该尽量避免交由人工维护,建议冗余的数据交由应用系统(例如触发器)自动维护。7.2.3 使用触发器维护冗余数据
  • 494. 任务布置6:上机操作,完成本书场景描述6:使用触发器自动维护课程available的字段值的任务要求。7.2.3 使用触发器维护冗余数据
  • 495. 对于InnoDB存储引擎的表而言,由于支持外键约束,在定义外键约束时,通过设置外键的级联选项cascade、set null或者no action(restrict),外键约束关系可以交由InnoDB存储引擎自动维护。7.2.4 使用触发器模拟外键级联选项
  • 496. 任务布置7:上机操作,完成本书场景描述7:使用InnoDB存储引擎维护外键约束关系的任务要求。 任务布置8:上机操作,完成本书场景描述8:使用触发器模拟外键级联选项的任务要求。 7.2.4 使用触发器模拟外键级联选项
  • 497. 可以使用下面四种方法查看触发器的定义。 1.使用show triggers命令查看触发器的定义7.2.5 查看触发器的定义
  • 498. 可以使用下面四种方法查看触发器的定义。 2.查询information_schema数据库中的triggers表,可以查看触发器的定义 MySQL中所有触发器的定义都存放在information_schema数据库下的triggers表中,查询triggers表,可以查看所有数据库中所有触发器的详细信息,查询语句如下: select * from information_schema.triggers\G7.2.5 查看触发器的定义
  • 499. 可以使用下面四种方法查看触发器的定义。 3.使用“show create trigger”命令可以查看某一个触发器的定义。 例如使用“show create trigger organization_delete_before_trigger\G”命令可以查看触发器organization_delete_before_trigger的定义。7.2.5 查看触发器的定义
  • 500. 可以使用下面四种方法查看触发器的定义。 4.成功创建触发器后,MySQL自动在数据库目录下创建TRN以及TRG触发器文件,以记事本方式打开这些文件,可以查看触发器的定义。7.2.5 查看触发器的定义
  • 501. 可以使用drop trigger语句将该触发器删除,语法格式如下。 drop trigger 触发器名7.2.6 删除触发器
  • 502. 1.触发程序中如果包含select语句,该select语句不能返回结果集。 2.同一个表不能创建两个相同触发时间、触发事件的触发程序。 3.触发程序中不能使用以显式或隐式方式打开、开始或结束事务的语句,如start transaction、commit、rollback或者set autocommit=0等语句。7.2.7 使用触发器的10条注意事项
  • 503. 4.MySQL触发器针对记录进行操作,当批量更新数据时,引入触发器会导致更新操作性能降低。 5.在MyISAM存储引擎中,触发器不能保证原子性。InnoDB存储引擎支持事务,使用触发器可以保证更新操作与触发程序的原子性,此时触发程序和更新操作是在同一个事务中完成。7.2.7 使用触发器的10条注意事项
  • 504. 6.InnoDB存储引擎实现外键约束关系时,建议使用级联选项维护外键数据;MyISAM存储引擎虽然不支持外键约束关系时,但可以使用触发器实现级联修改和级联删除,进而维护“外键”数据,模拟实现外键约束关系。7.2.7 使用触发器的10条注意事项
  • 505. 7.使用触发器维护InnoDB外键约束的级联选项时,数据库开发人员究竟应该选择after触发器还是before触发器?答案是:应该首先维护子表的数据,然后再维护父表的数据,否则可能出现错误。 7.2.7 使用触发器的10条注意事项
  • 506. 8.MySQL的触发程序不能对本表进行更新语句(例如update语句)。触发程序中的更新操作可以直接使用set命令替代,否则可能出现错误信息,甚至陷入死循环。 9.在before触发程序中,auto_increment字段的new值为0,不是实际插入新记录时自动生成的自增型字段值。7.2.7 使用触发器的10条注意事项
  • 507. 10.添加触发器后,建议对其进行详细的测试,测试通过后再决定是否使用触发器。7.2.7 使用触发器的10条注意事项
  • 508. 123按照MySQL临时表的存储位置可以将其分为内存临时表(in-memory)以及外存临时表(on-disk)。 按照MySQL临时表的创建时机可以将其分为自动创建的临时表以及手动创建的临时表。 “选课系统”中临时表的使用临时表的创建、查看与删除使用临时表的注意事项7.3 临时表
  • 509. 1.手动创建临时表 手动创建临时表很容易,给正常的create table语句加上temporary关键字即可。 2.查看临时表的定义可以使用MySQL语句“show create table 临时表名;”。 7.3.1 临时表的创建、查看与删除
  • 510. 3.断开MySQL服务器的连接,临时表frm表结构定义文件以及表记录将被清除。使用drop命令也可以删除临时表,语法格式如下。 drop temporary table 临时表表名7.3.1 临时表的创建、查看与删除
  • 511. 任务布置9:上机操作,完成本书场景描述9的任务要求。7.3.2 “选课系统”中临时表的使用
  • 512. 使用存储程序可以实现表数据的复杂加工处理,有时需要将select语句的查询结果集临时地保存到存储程序(例如函数、存储过程)的变量中,不过目前MySQL并不支持表类型变量。临时表可以模拟实现表类型变量的功能。 7.3.2 使用临时表的注意事项
  • 513. 临时表如果与基表重名,那么基表将被隐藏,除非删除临时表,基表才能被访问。 Memory、MyISAM、Merge或者InnoDB存储引擎的表都支持临时表。 临时表不支持聚簇索引、触发器。7.3.2 使用临时表的注意事项
  • 514. show tables 命令不会显示临时表的信息。 不能用rename来重命名一个临时表。但可以使用alter table重命名临时表。 在同一条select语句中,临时表只能引用一次。例如下面的select语句将抛出“ERROR 1137 (HY000): Can't reopen table: 't1'”错误信息。 select * from temp as t1, temp as t2;7.3.2 使用临时表的注意事项
  • 515. 派生表与视图一样,一般在from子句中使用,其语法格式如下(粗体字代码为派生表代码)。 ….from (select子句) 派生表名…. 派生表必须是一个有效的表,因此它必须遵守以下规则: 每个派生表必须有自己的别名。 派生表中的所有字段必须要有名称,字段名必须唯一。7.4 派生表(Derived Table)
  • 516. 任务布置10:完成本书场景描述10的任务要求。7.4 派生表(Derived Table)
  • 517. 子查询一般在主查询语句中的where子句或者having子句中使用。 视图通常在主查询语句中的from子句中使用。7.5 子查询、视图、临时表、派生表
  • 518. 视图本质是一条select语句,执行的是某一个数据源某个字段的查询操作,如果视图的“主查询”语句是update语句、delete语句或者insert语句,且“主查询”语句执行了该数据源该字段的更新操作,那么主查询语句将出错。 原因非常简单:在对某个表的某个字段操作时,查询操作(select语句)不能与更新操作(update语句、delete语句或者insert语句)同时进行。7.5 子查询、视图、临时表、派生表
  • 519. 与视图相似,临时表一般在from子句中使用。临时表与视图的区别在于: 临时表本质也是一条select语句,执行的是某一个数据源某个字段的查询操作,但由于临时表会先执行完毕,并且将查询结果集提前置放到服务器内存。因此“临时表”的“主查询”语句(例如update、delete或者insert语句)执行字段的更新操作时,不会产生“ERROR 1443 (HY000)”错误。7.5 子查询、视图、临时表、派生表
  • 520. 派生表与临时表的功能基本相同,它们之间的最大区别在于生命周期不同。 临时表如果是手工创建,那么临时表的生命周期在MySQL服务器连接过程中有效; 而派生表的生命周期仅在本次select语句执行的过程中有效,本次select语句执行结束,派生表立即清除。因此,如果希望延长查询结果集的生命周期,可以选用临时表;反之亦然。7.5 子查询、视图、临时表、派生表
  • 521. 另外,通过视图虽然可以更新基表的数据,但本书并不建议这样做。原因在于:通过视图更新基表数据,并不会触发触发器的运行。 7.5 子查询、视图、临时表、派生表
  • 522. Thanks
  • 523. (本页无文本内容)
  • 524. 孔祥盛MySQL数据库基础与实例教程 之 存储过程与游标
  • 525. 123本章主要讲解如何在MySQL中使用存储过程,并结合“选课系统”讲解存储过程在该系统中的应用,最后本章对存储程序做了总结。 4错误触发条件和错误处理存储过程游标预处理SQL语句5存储程序的说明内容一览
  • 526. 123存储过程也可以看作是一个“加工作坊”,它接收“调用者”传递过来的“原料”( in参数),然后将这些“原料”“加工处理”成“产品”( 存储过程的out参数或inout参数),再把“产品”返回给“调用者”。 存储过程的调用创建存储过程的语法格式“选课系统”的存储过程45查看存储过程的定义删除存储过程6存储过程与函数的比较8.1 存储过程
  • 527. 创建存储过程的语法格式如下。 create procedure 存储过程名(参数1,参数2,…) [存储过程选项] begin 存储过程语句块; end;8.1.1 创建存储过程的语法格式
  • 528. 存储过程选项由以下一种或几种选项组合而成。具体含义请查看函数选项的内容。 language sql | [not] deterministic | { contains sql | no sql | reads sql data | modifies sql data } | sql security { definer | invoker } | comment '注释'8.1.1 创建存储过程的语法格式
  • 529. 与函数相同之处在于:存储过程的参数也是局部变量,也需要提供参数的数据类型;与函数不同的是,存储过程有三种类型的参数:in参数、out参数以及inout参数。8.1.1 创建存储过程的语法格式
  • 530. in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定; out代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序; inout代表即是输入参数,又是输出参数,表示该参数的值即可以由调用程序指定,又可以将inout参数的计算结果返回给调用程序。8.1.1 创建存储过程的语法格式
  • 531. 例如下面的存储过程:delimiter $$ create procedure get_choose_number_proc(in student_no1 int,out choose_number int) reads sql data begin select count(*) into choose_number from choose where student_no=student_no1; end $$ delimiter ;8.1.1 创建存储过程的语法格式
  • 532. 调用存储过程须使用call关键字,另外还要向存储过程传递in参数、out参数或者inout参数。 例如: set @student_no = '2012001'; set @choose_number = 0; call get_choose_number_proc(@student_no,@choose_number); select @choose_number;8.1.2 存储过程的调用
  • 533. 存储过程get_choose_number_proc()中的in参数与out参数的数据类型都为整数,也可以将这两个参数简化为一个inout参数。 8.1.2 存储过程的调用
  • 534. delimiter $$ create procedure get_choose_number1_proc(inout number int) reads sql data begin select count(*) into number from choose where student_no=number ; end $$ delimiter ;8.1.2 存储过程的调用
  • 535. set @number = '2012001'; call get_choose_number1_proc(@number); select @number;8.1.2 存储过程的调用
  • 536. 任务布置1:上机操作,完成本书场景描述1的任务要求。 任务布置2:上机操作,完成本书场景描述2的任务要求。 任务布置3:上机操作,完成本书场景描述3的任务要求。8.1.3 “选课系统”的存储过程
  • 537. 可以使用下面四种方法查看存储过程的定义、权限、字符集等信息。 1.使用show procedure status命令查看存储过程的定义。 2.查看某个数据库(例如choose数据库)中的所有存储过程名,可以使用下面的SQL语句。 select name from mysql.proc where db = 'choose' and type = 'procedure';8.1.4 查看存储过程的定义
  • 538. 3.使用MySQL命令“show create procedure 存储过程名;”可以查看指定数据库指定存储过程的详细信息。 例如查看get_choose_number_proc()存储过程的详细信息,可以使用“show create procedure get_choose_number_proc\G” 8.1.4 查看存储过程的定义
  • 539. 4.存储过程的信息都保存在information_schema数据库中的routines表中,可以使用select语句查询存储过程的相关信息. 例如下面的SQL语句查看的是get_choose_number_proc()存储过程的相关信息。 select * from information_schema.routines where routine_name= 'get_choose_number_proc'\G8.1.4 查看存储过程的定义
  • 540. 存储过程与函数之间的共同特点在于: 应用程序调用存储过程或者函数时,只需要提供存储过程名或者函数名,以及参数信息,无需将若干条MySQL命令或SQL语句发送到MySQL服务器,节省了网络开销。 8.1.6 存储过程与函数的比较
  • 541. 存储过程与函数之间的共同特点在于: 存储过程或者函数可以重复使用,可以减少数据库开发人员,尤其是应用程序开发人员的工作量。 使用存储过程或者函数可以增强数据的安全访问控制。可以设定只有某些数据库用户才具有某些存储过程或者函数的执行权。8.1.6 存储过程与函数的比较
  • 542. 存储过程与函数之间的不同之处在于: 函数必须有且仅有一个返回值,且必须指定返回值数据类型(返回值类型目前仅仅支持字符串、数值类型)。存储过程可以没有返回值,也可以有返回值,甚至可以有多个返回值,所有的返回值需要使用out或者inout参数定义。 8.1.6 存储过程与函数的比较
  • 543. 存储过程与函数之间的不同之处在于: 函数体内可以使用select…into语句为某个变量赋值,但不能使用select语句返回结果(或者结果集)。存储过程则没有这方面的限制,存储过程甚至可以返回多个结果集。8.1.6 存储过程与函数的比较
  • 544. 存储过程与函数之间的不同之处在于: 函数可以直接嵌入到SQL语句(例如select语句中)或者MySQL表达式中,最重要的是函数可以用于扩展标准的SQL语句。存储过程一般需要单独调用,并不会嵌入到SQL语句中使用(例如select语句中),调用时需要使用call关键字。8.1.6 存储过程与函数的比较
  • 545. 存储过程与函数之间的不同之处在于: 函数中的函数体限制比较多,比如函数体内不能使用以显式或隐式方式打开、开始或结束事务的语句,如start transaction、commit、rollback或者set autocommit=0等语句;不能在函数体内使用预处理SQL语句(稍后讲解)。存储过程的限制相对就比较少,基本上所有的SQL语句或MySQL命令都可以在存储过程中使用。8.1.6 存储过程与函数的比较
  • 546. 存储过程与函数之间的不同之处在于: 应用程序(例如Java、PHP等应用程序)调用函数时,通常将函数封装到SQL字符串(例如select语句)中进行调用;应用程序(例如Java、PHP等应用程序)调用存储过程时,必须使用call关键字进行调用,如果应用程序希望获取存储过程的返回值,应用程序必须给存储过程的out参数或者inout参数传递MySQL会话变量,才能通过该会话变量获取存储过程的返回值。8.1.6 存储过程与函数的比较
  • 547. 默认情况下,存储程序运行过程中(例如存储过程或者函数)发生错误时,MySQL将自动终止存储程序的执行。存储程序运行过程中发生错误时,数据库开发人员有时希望自己控制程序的运行流程,并不希望MySQL将自动终止存储程序的执行,MySQL的错误处理机制可以帮助数据库开发人员自行控制程序流程。8.2 错误触发条件和错误处理
  • 548. 123存储程序运行过程中(例如存储过程或者函数)发生错误时 MySQL的错误处理机制可以帮助数据库开发人员自行控制程序流程。自定义错误触发条件自定义错误处理程序自定义错误处理程序说明8.2 错误触发条件和错误处理
  • 549. 自定义错误处理程序时需要使用declare关键字,语法格式如下。 declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;8.2.1 自定义错误处理程序
  • 550. 错误处理类型的取值要么是continue,要么是exit。 当错误处理类型是continue时,表示错误发生后,MySQL立即执行自定义错误处理程序,然后忽略该错误继续执行其他MySQL语句。 当错误处理类型是exit时,表示错误发生后,MySQL立即执行自定义错误处理程序,然后立刻停止其他MySQL语句的执行。8.2.1 自定义错误处理程序
  • 551. 错误触发条件:表示满足什么条件时,自定义错误处理程序开始运行,错误触发条件定义了自定义错误处理程序运行的时机。 错误触发条件有3种取值:MySQL错误代码、ANSI标准错误代码以及自定义错误触发条件。例如1452是MySQL错误代码,它对应于ANSI标准错误代码23000,自定义错误触发条件稍后讲解。8.2.1 自定义错误处理程序
  • 552. 自定义错误处理程序:错误发生后,MySQL会立即执行自定义错误处理程序中的MySQL语句,自定义错误处理程序也可以是一个begin-end语句块。 任务布置4:上机操作,完成本书场景描述4:自定义错误处理程序的任务要求。8.2.1 自定义错误处理程序
  • 553. 自定义错误触发条件允许数据库开发人员为MySQL错误代码或者ANSI标准错误代码命名,语法格式如下。 declare 错误触发条件 condition for MySQL错误代码或者ANSI标准错误代码;8.2.2 自定义错误触发条件
  • 554. 例如代码片段: … declare continue handler for 1452 begin set @error1 = '外键约束错误!'; end; … 可以替换成代码片段:8.2.2 自定义错误触发条件
  • 555. … declare foreign_key_error condition for sqlstate '23000'; declare continue handler for foreign_key_error begin set @error1 = '外键约束错误!'; end; …8.2.2 自定义错误触发条件
  • 556. 自定义错误触发条件以及自定义错误处理程序可以在触发器、函数以及存储过程中使用。 参与软件项目的多个数据库开发人员,如果每个人都自建一套错误触发条件以及错误处理程序,极易造成MySQL错误管理混乱。实际开发过程中,建议数据库开发人员建立清晰的错误处理规范,必要时可以将自定义错误触发条件、自定义错误处理程序封装在一个存储程序中。8.2.3 自定义错误处理程序说明
  • 557. 12 数据库开发人员编写存储过程(或者函数)等存储程序时,有时需要存储程序中的MySQL代码扫描select结果集中的数据,并对结果集中的每条记录进行简单处理,通过MySQL的游标机制可以解决此类问题。游标在“网络选课” 系统中的使用使用游标8.3 游标
  • 558. 游标的使用可以概括为声明游标、打开游标、从游标中提取数据以及关闭游标。8.3.1 使用游标
  • 559. (本页无文本内容)
  • 560. 1.声明游标 声明游标需要使用declare语句,其语法格式如下。 declare 游标名 cursor for select语句 使用declare语句声明游标后,此时与该游标对应的select语句并没有执行,MySQL服务器内存中并不存在与select语句对应的结果集。8.3.1 使用游标
  • 561. 2.打开游标 打开游标需要使用open语句,其语法格式如下。 open 游标名 使用open语句打开游标后,与该游标对应的select语句将被执行,MySQL服务器内存中将存放与select语句对应的结果集。8.3.1 使用游标
  • 562. 3.从游标中提取数据 从游标中提取数据需要使用fetch语句,其语法格式如下。 fetch 游标名 into 变量名1,变量名2,… 说明:变量名的个数必须与声明游标时使用的select语句结果集中的字段个数保持一致。8.3.1 使用游标
  • 563. 第一次执行fetch语句时,fetch语句从结果集中提取第一条记录,再次执行fetch语句时,fetch语句从结果集中提取第二条记录,…以此类推。 fetch语句每次从结果集中仅仅提取一条记录,因此fetch语句需要循环语句的配合,才能实现整个“结果集”的遍历。8.3.1 使用游标
  • 564. 当使用fetch语句从游标中提取最后一条记录后,再次执行fetch语句时,将产生“ERROR 1329 (02000): No data to FETCH”错误信息,数据库开发人员可以针对MySQL错误代码1329,自定义错误处理程序以便结束“结果集”的遍历。 注意:游标错误处理程序应该放在声明游标语句之后。游标通常结合错误处理程序一起使用,用于结束“结果集”的遍历。8.3.1 使用游标
  • 565. 4.关闭游标 关闭游标使用close语句,其语法格式如下。 close 游标名 关闭游标的目的在于释放游标打开时产生的结果集,节省MySQL服务器的内存空间。游标如果没有被明确地关闭,游标将在它被声明的begin-end语句块的末尾关闭。8.3.1 使用游标
  • 566. 任务布置5:上机操作,完成本书场景描述5的任务要求,理解游标的用法。8.3.2 游标在“网络选课”系统中的使用
  • 567. 123 运行期间,如果SQL语句不能发生动态地变化,这种SQL语句称为静态SQL语句。 运行期间,如果SQL语句或SQL所带的参数可以发生动态变化,这种SQL语句称为动态SQL语句或者预处理SQL语句 。“选课系统”中预处 理SQL语句的使用预处理SQL语句 使用步骤预处理SQL语句 的复杂应用4静态SQL语句与 预处理SQL语句8.4 预处理SQL语句
  • 568. MySQL支持预处理SQL语句,预处理SQL语句的使用主要包含三个步骤:创建预处理SQL语句、执行预处理SQL语句以及释放预处理SQL语句。 1.创建预处理SQL语句 创建预处理SQL语句的语法格式如下。 prepare 预处理SQL语句名 from SQL字符串8.4.1 预处理SQL语句使用步骤
  • 569. 2.执行预处理SQL语句 使用execute命令可以执行预处理SQL语句中定义的SQL语句,其语法格式如下。 execute 预处理名 [using 填充数据 [,填充数据...]]8.4.1 预处理SQL语句使用步骤
  • 570. 3.释放预处理SQL语句 当预处理SQL语句不再使用时,可以使用deallocate语句将该预处理SQL语句释放。其语法格式如下。 deallocate prepare 预处理名8.4.1 预处理SQL语句使用步骤
  • 571. 任务布置6:上机操作,完成本书场景描述6的任务要求,理解预处理SQL语句的用法。8.4.2 “选课系统”中预处理SQL语句的使用
  • 572. 任务布置7:上机操作,完成本书场景描述7的任务要求,理解预处理SQL语句的用法。 任务布置8:上机操作,完成本书场景描述8的任务要求,理解预处理SQL语句的用法。 8.4.3 预处理SQL语句的复杂应用
  • 573. 对于静态SQL语句而言,每次将其发送到MySQL服务实例时,MySQL服务实例都会对其进行解析、执行,然后将执行结果返回给MySQL客户机。 对于预处理SQL语句而言,预处理SQL语句创建后,第一次运行预处理SQL语句时,MySQL服务实例会对其解析,解析成功后,将其保存到MySQL服务器缓存中,为今后每一次地执行作好准备(今后无需再次解析)。8.4.4 静态SQL语句与预处理SQL语句
  • 574. 对于某些SQL语句,如果满足“一次创建,多次执行”的条件,可以考虑将其封装为预处理SQL语句,发挥其“一次解析,多次执行”的性能优势。当然预处理SQL语句如果使用不当,也会导致性能下降,甚至不如静态SQL语句。8.4.4 静态SQL语句与预处理SQL语句
  • 575. 无论初学者还是有经验的数据库开发人员,都要对自己开发的存储程序进行严格的测试,并尽量保存测试步骤、测试数据以及测试结果。 8.5 存储程序的说明
  • 576. 与应用程序(Java或者.NET或者PHP等应用程序)相比,存储程序可维护性高,更新存储程序通常比更改、测试以及重新部署应用程序需要更少的时间和精力。 使用存储程序与使用大量离散的SQL语句写出的应用程序相比,更易于代码优化、重用和维护。8.5 存储程序的说明
  • 577. 当然存储程序并不是神话,不能将所有的业务逻辑代码全部封装成存储程序,把业务处理的所有负担全部压在数据库服务器上。 事实上数据库服务器的核心任务是存储数据,保证数据的安全性、完整性以及一致性,如果数据库承担了过多业务逻辑方面的工作,势必会对数据库服务器的性能造成负面影响。8.5 存储程序的说明
  • 578. 对于简单的业务逻辑,在不影响数据库性能的前提下,为了节省网络资源,可以将业务逻辑封装成存储程序。 对于较为复杂的业务逻辑,建议使用高级语言(Java或者.NET或者PHP等)实现,让应用服务器(例如Apache、IIS等)承担更多的业务逻辑,保持负载均衡。8.5 存储程序的说明
  • 579. Thanks
  • 580. (本页无文本内容)
  • 581. 孔祥盛MySQL数据库基础与实例教程 之 事务机制和锁机制
  • 582. 123 本章探讨了数据库中事务与锁机制的必要性,讲解了如何在数据库中使用事务与锁机制实现数据库的一致性以及并发性,并结合“选课系统”讲解事务与锁机制在该系统中的应用。 4锁机制事务机制事务的ACID特性事务与锁机制注意事项内容一览
  • 583. 事务通常包含一系列更新操作,这些更新操作是一个不可分割的逻辑工作单元。如果事务成功执行,那么该事务中所有的更新操作都会成功执行、并将执行结果提交到数据库文件中,成为数据库永久的组成部分。如果事务中某条更新操作执行失败,那么事务中的所有操作均被撤销。 9.1 事务机制
  • 584. 123简言之:事务中的更新操作要么都执行,要么都不执行,这个特征叫做事务的原子性。 关闭MySQL自动提交事务的必要性回滚45提交事务9.1 事务机制
  • 585. 67简言之:事务中的更新操作要么都执行,要么都不执行,这个特征叫做事务的原子性。 保存点“选课系统”中的事务9.1 事务机制
  • 586. 对于银行系统而言,转账业务是银行最基本的、且最常用的业务,有必要将转账业务封装成存储过程,调用该存储过程后即可实现两个银行账户间的转账。 任务布置1:上机操作,完成本书场景描述1的任务要求,理解事务的必要性。9.1.1 事务机制的必要性
  • 587. 关闭自动提交的方法有两种:一种是显示地关闭自动提交,一种是隐式地关闭自动提交。 方法一:显示地关闭自动提交 使用MySQL命令“set autocommit=0;”,可以显示地关闭MySQL自动提交。 9.1.2 关闭MySQL自动提交
  • 588. 方法二:隐式地关闭自动提交 使用MySQL命令“start transaction;”可以隐式地关闭自动提交。隐式地关闭自动提交,不会修改系统会话变量@@autocommitte的值。 推荐使用方法二。9.1.2 关闭MySQL自动提交
  • 589. 关闭MySQL自动提交后,数据库开发人员可以根据需要回滚(也叫撤销)更新操作。 任务布置2:上机操作,完成本书场景描述2以及场景描述3的任务要求,理解回滚的作用。9.1.3 回滚
  • 590. MySQL自动提交一旦关闭,数据库开发人员需要“提交”更新语句,才能将更新结果提交到数据库文件中,成为数据库永久的组成部分。自动提交关闭后,MySQL的提交方式分为显示地提交与隐式地提交。 9.1.4 提交
  • 591. 显示地提交:MySQL自动提交关闭后,使用MySQL命令“commit;”可以显示地提交更新语句。 隐式地提交:MySQL自动提交关闭后,使用下面的MySQL语句,可以隐式地提交更新语句。 9.1.4 提交
  • 592. begin、set autocommit=1、 start transaction、rename table、 truncate table等语句; 数据定义(create、alter、drop)语句,例如create database、create table、 create index、create function、 create procedure、alter table、 alter function、alter procedure、 drop database、drop table、 drop function、drop index、 drop procedure等语句;9.1.4 提交
  • 593. 权限管理和账户管理语句: 例如grant、revoke、set password、 create user、drop user、rename user等语句); 锁语句(lock tables、unlock tables)。9.1.4 提交
  • 594. 任务布置3:上机操作,完成本书场景描述2以及场景描述4的任务要求,理解提交的作用。9.1.4 提交
  • 595. 使用MySQL命令“start transaction;”可以开启一个事务,该命令开启事务的同时,会隐式地关闭MySQL自动提交。 使用commit命令可以提交事务中的更新语句;使用rollback命令可以回滚事务中的更新语句。 9.1.5 事务
  • 596. (本页无文本内容)
  • 597. 任务布置4:上机操作,完成本书场景描述5的任务要求,理解事务的作用。9.1.5 事务
  • 598. 保存点(也称为检查点)可以实现事务的“部分”提交或者“部分”撤销。 使用MySQL命令“savepoint 保存点名;”可以在事务中设置一个保存点,使用MySQL命令“rollback to savepoint 保存点名;”可以将事务回滚到保存点状态。9.1.6 保存点
  • 599. (本页无文本内容)
  • 600. 任务布置5:上机操作,完成本书场景描述6的任务要求,理解保存点的作用。9.1.6 保存点
  • 601. 说明:“rollback to savepoint B”仅仅是让数据库回到事务中的某个“一致性状态B”,而“一致性状态B”仅仅是一个“临时状态”,该“临时状态”并没有将更新回滚,也没有将更新提交。事务回滚必须借助于rollback(而不是“rollback to savepoint B”),事务的提交需借助于commit。9.1.6 保存点
  • 602. 使用MySQL命令“release savepoint 保存点名;”可以删除一个事务的保存点。 如果该保存点不存在,该命令将出现错误信息:ERROR 1305 (42000): SAVEPOINT does not exist。如果当前的事务中存在两个相同名字的保存点,旧保存点将被自动丢弃。9.1.6 保存点
  • 603. “选课系统”中,最为复杂的业务逻辑莫过于“学生选课”以及“学生调课”功能的实现,之前的章节已经编写了choose_proc()存储过程实现了学生的选课功能。本章将借用事务的概念编写调课存储过程replace_course_proc(),实现“选课系统”的调课功能。9.1.7 “选课系统”中的事务
  • 604. 任务布置6:上机操作,完成本书场景描述7的任务要求。9.1.7 “选课系统”中的事务
  • 605. 123同一时刻,多个并发用户同时访问同一个数据时,仅仅通过事务机制,无法保证多用户同时访问同一数据的数据一致性,有必要引入锁机制实现MySQL的并发访问,锁机制是实现多用户并发访问的基石。 MySQL锁机制的基础知识锁机制的必要性MyISAM表的表级锁45InnoDB表的行级锁“选课系统”中的行级锁9.2 锁
  • 606. 678同一时刻,多个并发用户同时访问同一个数据时,仅仅通过事务机制,无法保证多用户同时访问同一数据的数据一致性,有必要引入锁机制实现MySQL的并发访问,锁机制是实现多用户并发访问的基石。 InnoDB行级锁 与索引之间的关系InnoDB表的意向锁间隙锁与死锁9死锁与锁等待9.2 锁
  • 607. 并发用户访问同一数据,锁机制可以避免数据不一致问题的发生。以场景描述2为例。9.2.1 锁机制的必要性
  • 608. 1.锁的粒度 锁的粒度是指锁的作用范围。 锁的粒度可以分为服务器级锁(server-level locking)和存储引擎级锁(storage-engine-level locking)。 MyISAM存储引擎支持表锁。 InnoDB存储引擎支持表锁以及行级锁。9.2.2 MySQL锁机制的基础知识
  • 609. 2.隐式锁与显式锁 MySQL锁分为隐式锁以及显式锁。 MySQL自动加锁称为隐式锁。 数据库开发人员手动加锁称为显式锁。9.2.2 MySQL锁机制的基础知识
  • 610. 3.锁的类型 锁的类型包括读锁(read lock)和写锁(write lock),其中读锁也称为共享锁,写锁也称为排他锁或者独占锁。9.2.2 MySQL锁机制的基础知识
  • 611. 读锁允许其它MySQL客户机对数据同时“读”,但不允许其它MySQL客户机对数据任何“写” 。9.2.2 MySQL锁机制的基础知识
  • 612. 写锁不允许其它MySQL客户机对数据同时读,也不允许其它MySQL客户机对数据同时写 。9.2.2 MySQL锁机制的基础知识
  • 613. 4.锁的钥匙 多个MySQL客户机并发访问同一个数据时,如果MySQL客户机A对该数据成功地施加了锁,那么只有MySQL客户机A拥有这把锁的“钥匙”,也就是说:只有MySQL客户机A能够对该锁进行解锁操作。9.2.2 MySQL锁机制的基础知识
  • 614. 5.锁的生命周期 锁的生命周期是指在同一个MySQL服务器连接内,对数据加锁到解锁之间的时间间隔。 9.2.2 MySQL锁机制的基础知识
  • 615. 任何针对MyISAM表的查询操作或者更新操作,都会隐式地施加表级锁,隐式锁的生命周期非常短暂,且不受数据库开发人员的控制。9.2.3 MyISAM表的表级锁
  • 616. 有时需要延长表级锁的生命周期,MySQL为数据库开发人员提供了显示地施加表级锁以及显示地解锁的MySQL命令。9.2.3 MyISAM表的表级锁
  • 617. 9.2.3 MyISAM表的表级锁
  • 618. 注意事项: read与write选项的功能在于施加表级读锁还是表级写锁。 MySQL客户机A使用lock tables命令可以同时为多个表施加表级锁(包括读锁或者写锁),并且加锁期间,MySQL客户机A不能对“没有锁定的表”进行更新及查询操作,否则将抛出“表未被锁定”的错误信息。 9.2.3 MyISAM表的表级锁
  • 619. 如果需要为同一个表同时施加读锁与写锁,需要为该表起两个别名,以区分读锁与写锁。 9.2.3 MyISAM表的表级锁
  • 620. read local与read选项之间的区别在于:如果MySQL客户机A使用read选项为某个MyISAM表施加读锁,加锁期间,MySQL客户机A以及MySQL客户机B都不能对该表进行插入操作。如果MySQL客户机A使用read local选项为某个MyISAM表施加读锁,加锁期间,MySQL客户机B可以对该表进行插入操作,前提是新记录必须插入到表的末尾。 9.2.3 MyISAM表的表级锁
  • 621. InnoDB提供了两种类型的行级锁,分别是共享锁(S)以及排他锁(X),其中共享锁也叫读锁,排他锁也叫写锁。 在查询(select)语句或者更新(insert、update以及delete)语句中,为受影响的记录施加行级锁的方法也非常简单。 9.2.4 InnoDB表的行级锁
  • 622. 方法1.在查询(select)语句中,为符合查询条件的记录施加共享锁,语法格式如下所示。 select * from 表 where 条件语句 lock in share mode; 方法2.在查询(select)语句中,为符合查询条件的记录施加排他锁,语法格式如下所示。 select * from 表 where 条件语句 for update;9.2.4 InnoDB表的行级锁
  • 623. 方法3.在更新(insert、update以及delete)语句中,InnoDB存储引擎将符合更新条件的记录自动施加排他锁(隐式锁)。 即:InnoDB存储引擎自动地为更新语句影响的记录施加隐式排他锁。9.2.4 InnoDB表的行级锁
  • 624. 任务布置8:完成本书场景描述9:通过事务延长行级锁的生命周期的任务要求。9.2.4 InnoDB表的行级锁
  • 625. 任务布置9:完成本书场景描述10的任务要求。9.2.5 “选课系统”中的行级锁
  • 626. 考虑如下场景:MySQL客户机A获得了某个InnoDB表中若干条记录的行级锁,此时MySQL客户机B出于某种原因需要向该表显式地施加表级锁(使用lock tables命令即可),MySQL客户机B为了获得该表的表级锁,需要逐行检测表中的行级锁是否与表级锁兼容,而这种检测需要耗费大量的服务器资源。 9.2.6 InnoDB表的意向锁
  • 627. 试想:如果MySQL客户机A获得该表若干条记录的行级锁之前,MySQL客户机A直接向该表施加一个“表级锁”(这个表级锁是隐式的,也叫意向锁),MySQL客户机B仅仅需要检测自己的表级锁与该意向锁是否兼容,无需逐行检测该表是否存在行级锁,就会节省不少服务器资源。9.2.6 InnoDB表的意向锁
  • 628. MySQL提供了两种意向锁:意向共享锁(IS)和意向排它锁(IX)。 9.2.6 InnoDB表的意向锁
  • 629. 意向共享锁(IS):向InnoDB表的某些记录施加行级共享锁时,InnoDB存储引擎会自动地向该表施加意向共享锁(IS)。也就是说:执行“select * from 表 where 条件语句 lock in share mode;”后,InnoDB存储引擎在为表中符合条件语句的记录施加共享锁前,InnoDB会自动地为该表施加意向共享锁(IS)。9.2.6 InnoDB表的意向锁
  • 630. 意向排它锁(IX):向InnoDB表的某些记录施加行级排它锁时,InnoDB存储引擎会自动地向该表施加意向排它锁(IX)。也就是说:执行更新语句(例如insert、update或者delete语句)或者“select * from 表 where 条件语句 for update;”,InnoDB存储引擎在为表中符合条件语句的记录施加排他锁前,InnoDB会自动地为该表施加意向排它锁(IX)。9.2.6 InnoDB表的意向锁
  • 631. InnoDB表的行级锁是通过对“索引”施加锁的方式实现的,这就意味着:只有通过索引字段检索数据的查询语句或者更新语句,才可能施加行级锁;否则InnoDB将使用表级锁,使用表级锁势必会降低InnoDB表的并发访问性能。 任务布置10:完成本书场景描述11的任务要求。 注意:间隙锁与记录锁的区别。9.2.7 InnoDB行级锁与索引之间的关系
  • 632. 任务布置11:完成本书场景描述11的任务要求。 注意:间隙锁与记录锁的区别。9.2.8 间隙锁与死锁
  • 633. 给MyISAM表施加表级锁不会导致死锁问题的发生,这是由于MyISAM总是一次性地获得SQL语句的全部锁。给InnoDB表施加行级锁可能导致死锁问题的发生,这是由于执行SQL语句期间,可以继续施加行级锁。因此这里讨论的死锁问题主要是InnoDB行级锁产生的死锁问题。 任务布置12:完成本书场景描述13的任务要求。 注意:间隙锁与记录锁的区别。9.2.8 间隙锁与死锁
  • 634. 默认情况下:InnoDB存储引擎一旦出现锁等待超时异常,InnoDB存储引擎即不会提交事务,也不会回滚事务,而这是十分危险的。一旦发生锁等待超时异常,应用程序应该自定义错误处理程序,由程序开发人员选择进一步提交事务,还是回滚事务。9.2.9 死锁与锁等待
  • 635. 123事务的任务是保证一系列更新语句的原子性,锁的任务是解决并发访问可能导致的数据不一致问题。如果事务与事务之间存在并发操作,此时可以通过隔离级别实现事务的隔离性,从而实现数据的并发访问。 事务的隔离级别 与并发问题事务的ACID特性设置事务的隔离级别4使用间隙锁避免幻读现象9.3 事务的ACID特性
  • 636. 9.3 事务的ACID特性
  • 637. 1.原子性 (Atomicity ) 原子性用于标识事务是否完全地完成。 2.一致性( Consistency ) 事务的一致性保证了事务完成后,数据库能够处于一致性状态。9.3 事务的ACID特性
  • 638. 3.隔离性 ( Isolation) 同一时刻执行多个事务时,一个事务的执行不能被其他事务干扰。 4.持久性 (Durabilily) 持久性意味着事务一旦成功执行,在系统中产生的所有变化将是永久的。 9.3 事务的ACID特性
  • 639. SQL标准定义了四种隔离级别:read uncommitted(读取未提交的数据)、read committed(读取提交的数据)、repeatable read(可重复读)以及serializable(串行化)。四种隔离级别逐渐增强,其中read uncommitted的隔离级别最低,serializable的隔离级别最高。 9.3.2 事务的隔离级别与并发问题
  • 640. 1.read uncommitted(读取未提交的数据) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。该隔离级别很少用于实际应用,并且它的性能也不比其他隔离级别好多少。 2.read committed(读取提交的数据) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已提交事务所做的改变。9.3.2 事务的隔离级别与并发问题
  • 641. 3.repeatable read(可重复读) 这是MySQL默认的事务隔离级别,它确保同一事务内相同的查询语句,执行结果一致。9.3.2 事务的隔离级别与并发问题
  • 642. 4.serializable(串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突。换言之,它会在每条select语句后自动加上lock in share mode,为每个查询操作施加一个共享锁。在这个级别,可能导致大量的锁等待现象。该隔离级别主要用于InnoDB存储引擎的分布式事务。9.3.2 事务的隔离级别与并发问题
  • 643. 低级别的事务隔离可以提高事务的并发访问性能,却可能导致较多的并发问题(例如脏读、不可重复读、幻读等并发问题);高级别的事务隔离可以有效避免并发问题,但会降低事务的并发访问性能,可能导致出现大量的锁等待、甚至死锁现象。 脏读(Drity Read):一个事务可以读到另一个事务未提交的数据,脏读问题违背了事务的隔离性原则。9.3.2 事务的隔离级别与并发问题
  • 644. 不可重复读(Non-repeatable read):同一个事务内两条相同的查询语句,查询结果不一致。 幻读(Phantom Read):同一个事务内,两条相同的查询语句,查询结果应该相同。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。9.3.2 事务的隔离级别与并发问题
  • 645. 9.3.2 事务的隔离级别与并发问题
  • 646. MySQL支持4种事务隔离级别,在InnoDB存储引擎中,可以使用以下命令设置事务的隔离级别。 set { global | session } transaction isolation level { read uncommitted | read committed | repeatable read | serializable } 9.3.3 设置事务的隔离级别
  • 647. 合理地设置事务的隔离级别,可以有效避免脏读、不可重复读、幻读等并发问题。9.3.3 设置事务的隔离级别
  • 648. 任务布置13:完成本书场景描述14:脏读现象的任务要求。 任务布置14:完成本书场景描述15:不可重复读现象的任务要求。 任务布置15:完成本书场景描述16:幻读现象的任务要求。 任务布置16:完成本书场景描述17:并发访问性能问题的任务要求。9.3.3 设置事务的隔离级别
  • 649. MySQL默认的事务隔离级别为repeatable read,保持事务的隔离级别repeatable read不变,利用间隙锁的特点,对查询结果集施加共享锁(lock in share mode)或者排他锁(for update),同样可以避免幻读现象,同时也不至于降低MySQL的并发访问性能。 任务布置17:完成本书场景描述18的任务要求。9.3.4 使用间隙锁避免幻读现象
  • 650. 请参看本书的内容9.4 事务与锁机制注意事项
  • 651. Thanks
  • 652. (本页无文本内容)
  • 653. 孔祥盛MySQL数据库基础与实例教程 之 网上选课系统的开发
  • 654. 123 结合之前章节开发的“选课系统”数据库,借助软件工程的思想,本章选用PHP脚本语言开发网上选课系统。 4网上选课系统的开发PHP预备知识网上选课系统的系统规划网上选课系统的系统分析5网上选课系统的系统设计内容一览
  • 655. 67 结合之前章节开发的“选课系统”数据库,借助软件工程的思想,本章选用PHP脚本语言开发网上选课系统。 8网上选课系统的系统实施界面设计与MVC模式网上选课系统的系统测试内容一览
  • 656. 123PHP是一种被广泛应用的、免费开源的、服务器端的、跨平台的、HTML内嵌式的多用途脚本语言 PHP脚本语言概述为何选用B/S结构以及PHP脚本语言PHP脚本程序的工作流程45WEB服务器的部署注意事项10.1 PHP预备知识
  • 657. 为何选用B/S结构: 受众更广。 客户端的开发、维护成本较低。 业务扩展简单方便。10.1.1 为何选用B/S结构以及PHP脚本语言
  • 658. 为何选用 PHP脚本语言 : PHP开发环境易于部署。 PHP易学好用 平台无关性(跨平台)。 良好的数据库支持。10.1.1 为何选用B/S结构以及PHP脚本语言
  • 659. 例如PHP脚本程序代码。 这是我的第一个PHP程序:

    10.1.2 PHP脚本语言概述
  • 660. 10.1.3 PHP脚本程序的工作流程
  • 661. (本页无文本内容)
  • 662. 为了便于读者快速部署Apache服务器,本书使用的WampServer版本号是2.0i,读者可以到人民邮电出版社教学服务与资源网下载WampServer2.0i。 另外,还可以通过百度网盘下载。 百度网盘网址: http://pan.baidu.com/s/1jG3IZXG 10.1.4 WEB服务器的部署
  • 663. 一:启动本机的MySQL5.6.0服务 二:开启WampServer自带的Apache服务 三:部署数据库服务器与WEB服务器10.1.5 注意事项
  • 664. 10.2 软件开发生命周期SDLC
  • 665. 123系统规划的目标是规划项目范围并做出项目计划。系统规划的主要任务是定义目标,确认项目可行性,制定项目的进度表以及人员分工等。网上选课系统的可行性分析网上选课系统的目标网上选课系统的项目进度表4网上选课系统的人员分工10.3 网上选课系统的系统规划
  • 666. 加快课程申报、课程审核以及选课的进度,还可以避免人为统计可能产生的错误。 通过引入数据库技术,可以实现课程信息的并发访问,允许多个学生在同一个时间段内对同一门课程进行选课、退课甚至调课等,更大程度的保证数据的并发访问。 10.3.1 网上选课系统的目标
  • 667. 网上选课系统的可行性分析可以从以下3个角度进行分析。 1.技术可行性 2.经济可行性 3.法律可行性10.3.2 网上选课系统的可行性分析
  • 668. 10.3.3 网上选课系统的项目进度表
  • 669. 任务布置2:上机操作,完成本书场景描述3的任务要求,理解复合类型的用法。 注意:MySQL模式对复合类型数据的影响。3.1.5 MySQL复合类型
  • 670. 方法一:由一个人完成软件开发生命周期的所有任务。 方法二:由教师担任项目经理,安排3~5人为一个软件开发小组,每组指定一名组长统筹项目开发过程中遇到的所有问题;组长指定一名小组成员为需求调研员,负责收集网上选课系统的功能需求等信息;指定一名界面开发人员、一名程序开发人员、一名数据库管理员以及若干测试人员,共同参与网上选课系统的开发。 10.3.4 网上选课系统的人员分工
  • 671. 系统分析的任务是收集相关信息并确定系统需求,系统分析阶段着重考虑的是“系统做什么”的问题。 12网上选课系统的非功能需求分析网上选课系统的功能需求分析10.4 网上选课系统的系统分析
  • 672. 从用户(游客、教师、管理员以及学生)的角度分析网上选课系统的功能需求。 10.4.1 网上选课系统的功能需求分析从游客的角度
  • 673. 10.4.1 网上选课系统的功能需求分析从教师、的角度
  • 674. 10.4.1 网上选课系统的功能需求分析从学生的角度
  • 675. 10.4.1 网上选课系统的功能需求分析从、管理员的角度
  • 676. 非功能需求分析定义了系统的开发环境以及运行环境(软件及硬件环境)、性能、安全性、可用性、可维护性以及可扩展性等内容。10.4.1 网上选课系统的非功能需求分析
  • 677. 1.软件及硬件环境:对于网上选课系统而言,该系统在Windows操作系统环境下开发和运行,系统开发时所使用的语言为PHP(5.0以上版本),所使用的浏览器包括IE浏览器和Firefox浏览器,所使用的数据库管理系统为MySQL5.6,所使用的WEB服务器为Apache(2.0以上版本)。对于网上选课系统而言,在系统开发阶段,主流的电脑配置都可满足开发要求。10.4.1 网上选课系统的非功能需求分析
  • 678. 2.性能:性能的衡量指标主要是响应时间、资源使用率、并发用户数以及吞吐量。 响应时间:用户发出请求到用户接收到系统返回的响应之间的时间间隔。网上选课系统要求系统的响应时间少于0.5秒。 资源利用率:指系统各种资源的使用情况,如CPU占用率为68%,内存占用率为55%,使用“资源实际使用/总的资源可用量”计算资源利用率。10.4.1 网上选课系统的非功能需求分析
  • 679. 并发用户数:同时在线的最大用户数,反应的是系统的并发处理能力。网上选课系统要求同时在线人数为200人。10.4.1 网上选课系统的非功能需求分析
  • 680. 吞吐量:对于软件系统来说,“吞”进去的是请求,“吐”出来的是结果。具体说来,就是指软件系统在单位时间内处理用户请求的数量。从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量。从数据库的角度看,吞吐量指的是单位时间内,不同SQL语句的执行数量。从网络角度看,吞吐量可以用:字节/秒来衡量。10.4.1 网上选课系统的非功能需求分析
  • 681. 3.安全性:衡量指标主要是核心数据是否加密,系统对权限设置是否严密,应用服务器、数据库服务器以及网络环境是否安全。 4.可用性:强调的是“以人为本”,可用性考虑最多的是用户的主观感受。例如简单大方、格式统一的用户界面可以给用户一个比较好的用户体验。10.4.1 网上选课系统的非功能需求分析
  • 682. 5.可维护性:衡量指标主要是程序结构是不是有条理,代码是否符合编写规范,注释是否清晰,文档是否齐全、代码是否结果严格的测试。 6.可扩展性:可扩展性决定了软件系统适应未来发展的能力。做好可扩展性,首先要做好可维护性。10.4.1 网上选课系统的非功能需求分析
  • 683. 系统设计的目标是:根据系统分析阶段得到的需求模型(例如E-R图、数据流程图等),建立系统解决方案的模型。系统设计的任务是阐述系统如何使用计算机技术、信息技术、网络技术,构建系统的解决方案。系统设计阶段着重考虑的是“系统怎么做”的问题。10.5 网上选课系统的系统设计
  • 684. 系统设计包括应用程序结构的设计、程序流程的设计、数据库规范化设计、图形用户界面的设计、网络模型的设计、系统接口的设计等内容。系统设计使用到的模型主要包括系统流程图、程序流程图、数据库物理模型、图形用户界面、网络拓扑图等模型。 10.5 网上选课系统的系统设计
  • 685. 这里仅仅以系统流程图为例,从宏观的角度,描述网上选课系统各个应用程序之间的依赖关系。 系统流程图描述了系统内计算机程序之间所有控制流程。 10.5 网上选课系统的系统设计
  • 686. 游客的系统流程图 10.5 网上选课系统的系统设计
  • 687. 学生的系统流程图 10.5 网上选课系统的系统设计
  • 688. 教师的系统流程图 10.5 网上选课系统的系统设计
  • 689. 管理员的系统流程图 10.5 网上选课系统的系统设计
  • 690. 请自学本书内容,并上机操作。10.6 网上选课系统的实施
  • 691. 网上选课系统的这种编程思想源于MVC模式,MVC全名是Model View Controller,是模型层-视图层-控制器层的缩写。10.6 网上选课系统的实施
  • 692. 10.7 界面设计与MVC模式
  • 693. 网上选课系统的测试包括功能测试、性能测试、安全性测试、易用性测试等。 10.8 网上选课系统的系统测试
  • 694. 网上选课系统的测试包括功能测试、性能测试、安全性测试、易用性测试等。 10.8 网上选课系统的系统测试
  • 695. 10.8 网上选课系统的系统测试
  • 696. 10.8 网上选课系统的系统测试
  • 697. Thanks
  • 698. (本页无文本内容)
  • 699. 孔祥盛MySQL数据库基础与实例教程 之 资源说明
  • 700. 1234本书的特点说在前面的话本书的提供的资源浅谈学习方法5解决问题方法6小结内容一览
  • 701. 教师教学好比导演拍摄一部电影,不仅需要演员(学生)的配合,还需要挑选好的剧本(书籍)。 好的剧本可以让导演(教师)、所有演员(学生)更顺利地融入剧情,不仅可以节省导演(教师)的精力,缩短拍摄周期,节省拍摄成本,还可以让所有演员(学生)真正地成为“剧情”中的主角。1. 说在前面的话
  • 702. 本书使用量身定制的案例全面讲解MySQL基础知识以及MySQL5.6新特性,InnoDB全文检索、触发器、存储过程、函数、事务、锁等概念,全部融入该案例。 本书尽量将抽象问题形象化、图形化,复杂问题简单化。即便读者没有任何数据库基础,也丝毫不会影响数据库知识的学习。2. 本书的特点
  • 703. 曾经看到有一种极端的说法:中国不缺好的导演、好的演员,而是缺少好的剧本,对于学习亦是如此。 笔者一直认为:中国不缺乏好的导演(教师),也不缺乏好的演员(学生),缺乏的是能够让导演(教师)和演员(学生)快速地融入剧情的剧本(教材)。1. 说在前面的话
  • 704. 对于学习,亦是如此。学习数据库,尤其是学习MySQL ,笔者试图编写这样一部“剧本”:让教师、学生快速地融入“剧情”,并且变“学生被动学习”为“学生主动学习”。 笔者相信:《MySQL数据库基础与实例教程》就是一本能够满足导演(教师)、演员(学生)拍摄要求(教学要求)的剧本(教材)。1. 说在前面的话
  • 705. 本书选择的案例易于理解、开发,非常适合教学。 本书使用该案例,通过10个章节的内容,贯穿MySQL所有知识点,内容编排一气呵成,章节之间循序渐进,内容不冲突、不重复、不矛盾。2. 本书的特点
  • 706. 为了能让读者将所有的时间、精力放在MySQL知识点的学习上,本书使用尽可能少的数据库表讲解MySQL的所有知识点。 本书所使用的表不超过10张,经常使用的表不超过5张,使用5张表讲解MySQL几乎所有的知识点,很大程度上可以减轻教师、学生的负担。但同时也为笔者构思本书的知识框架带来不少挑战,也希望读者理解笔者一片苦心。 2. 本书的特点
  • 707. 本书注重软件工程在数据库开发过程中的应用。数据库初学者通常存在致命的缺陷:重开发,轻设计。开发出来的数据库往往成了倒立的金字塔,头重脚轻。 真正的数据库开发,首先强调的是设计,其次是开发。正因为如此,本书将数据库设计的内容进行详细地讲解,并且在本书第一章进行了详细讲解。2. 本书的特点
  • 708. 撰写本书时,为了向读者还原笔者真实的开发过程,本书在内容组织上使用、保留了一定数量的截图显示执行结果,有些截图至关重要,读者甚至必须从截图中得到一些结论。当然这些截图无疑增加了本书的版面,希望读者谅解。2. 本书的特点
  • 709. 截至目前,本书提供的资源都是免费资源其中包括:所有安装程序、PPT课件、教学大纲、MySQL源代码、PHP源代码。 其它资源(例如教学计划、视频等)正在开发中,根据需要,这些资源也将免费向读者提供。读者也可以时刻关注本书资源更新情况。3. 本书提供的资源
  • 710. 本书提供的资源可以到人民邮电出版社教学服务与资源网下载。 出版社网址: http://www.ptpedu.com.cn/HomePage/ 另外,还可以通过百度网盘下载。 百度网盘网址: http://pan.baidu.com/s/1jG3IZXG 3. 本书提供的资源
  • 711. 4. 浅谈学习方法
  • 712. 如果SQL代码运行出错,首先试图在书中找到答案; 如果书中没有答案,建议通过通过百度知道、谷歌搜索引擎找到问题所在(意在锻炼学生的自学能力、自己解决问题的能力); 如果问题依旧没有解决,首先考虑与其他同学协商解决(意在锻炼协同能力),直至请教老师,解决该问题。5. 解决问题方法
  • 713. 个人观点1:因为遗忘,学会自学比学会知识更重要,会学知识比学会知识更重要。 “学会知识” 层次较低。即学会了某个具体的知识。 “会学知识”层次较高。意在强调自学能力。5. 解决问题方法
  • 714. 个人观点2:学会如何找到知识比掌握知识细节更重要。 我们遇到问题时,我们往往不是第一个发现该问题的人!更不是第一个解决该问题的人! 记住:我们往往不是第一个吃螃蟹的人!要学会使用搜索引擎解决问题。5. 解决问题方法
  • 715. 6. 小结
  • 716. (本页无文本内容)