书名:MySQL数据库管理实战
ISBN:978-7-115-50584-2
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 甘长春 孟 飞
责任编辑 傅道坤
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书详细介绍了MySQL数据库管理从入门到实战在内的所有知识。
本书共分为18章,主要介绍了MySQL数据库的系统管理与基本操作,MySQL数据库的流程控制及函数、日期时间处理、分组统计、多表联合操作,以及MySQL数据库的内部工作原理、存储引擎、事务处理、存储程序开发、备份恢复、性能优化等内容。
本书步骤详细,示例丰富,以实战为主,讲解直击MySQL数据库的本质,特别适合有志于从事数据库开发与设计的入门级读者阅读。本书还可以供开设了数据库课程的高等院校的师生阅读,以及作为相关IT培训机构的参考图书。
甘长春,毕业于北京交通大学电气工程及自动化专业,当前供职于中国铁路北京局集团有限公司。自从参加工作以来,一直致力于计算机应用系统的研发和建设,先后参与了多个铁路应用项目的研发工作,同时,也与多家IT企业合作开发项目,主要负责数据库架构设计及应用开发等工作。从2014年起,一直在天津市大学软件学院及其他一些大学从事兼职教学工作,所授课程为PHP和Oracle。
孟飞,当前就读于内蒙古工业大学自动化专业,在学期间,完成了数字电子技术和模拟电子技术等大量实验,参与内蒙古自治区博士自然科学基金“混合微电网综合协调控制与能量分配策略研究”和“风光储混合分布式发电系统协调控制与能量分配策略研究”项目研发。在致力于C及汇编语言研究的同时,还在自修数据库,包括MySQL、Oracle,尤其在MySQL数据库方面,曾经与天津融创软通科技有限公司合作,负责“学生成绩分析与教师考核评价系统”项目的数据库设计、优化以及存储程序开发等工作。
本书在撰写过程中得到天津融创软通科技有限公司张建军、中国铁路北京局集团有限公司苑亮的大力支持,在此向他们表示感谢!
特别感谢人民邮电出版社编辑傅道坤的帮助,借此向人民邮电出版社的所有工作人员表示感谢!
信息技术的发展日新月异,作者深感自己才疏学浅,本书难免有疏漏和不足的地方,敬请读者批评指正。
MySQL是PHP Web开发首选的数据库系统。目前很多科技公司的Web应用项目开发已经或正在转向PHP。为了适应这一市场需求,国内各大培训机构都开设了PHP课程,其中也涵盖了MySQL课程。
无论是即将走向工作岗位的学生,还是IT(信息技术)公司的开发人员,很多人都在学习MySQL数据库,因此,如何降低学习MySQL的门槛并快速将其应用于实践,已成为市场所需。
本书的写作宗旨主要有以下3条。
本书内容涵盖了使用MySQL进行数据库开发的绝大部分知识,从数据库的基础知识(如基本管理、权限设置和基本操作)到数据库的高级操作(如多表操作、工作机制分析、存储过程、数据库的备份和性能优化)。本书共分为18章,主要内容如下。
第1章“数据库入门”:本章简要介绍了数据库的发展史,讲解在开发中使用数据库的原因、优点、重要性和特点以及在众多的数据库产品中如何学习和使用MySQL。
第2章“MySQL基本管理”:本章介绍MySQL的客户端与服务器端的概念、MySQL数据库服务器的启动与停止,以及数据库的基本使用等。
第3章“MySQL账户权限设置”:本章讲解MySQL账户权限与设置,包括MySQL权限系统、权限操作,丢失MySQL ROOT密码的解决方法等,同时本章给出了各种各样的权限操作样本,方便读者在实际应用中参考与借鉴。
第4章“MySQL数据库表列的数据类型”:本章讲解MySQL表列的各种数据类型,包括数值、字符串、列类型属性ZEROFILL(填充0)、UNSIGNED(无符号)和SIGNED(有符号)、TEXT与BLOG类型、ENUM与SET类型、网站中常用的数据类型、DEFAULT(默认)等。
第5章“MySQL表结构的维护”:本章深入地讲解MySQL数据库表的维护(创建与修改),尤其是涉及相关字符集的调整,包括表字段、主键的添加与删除、表列的重命名与改变数据类型、普通索引、唯一索引的添加与删除,以及数据库、表、列字符集的调整及其适用场景等。
第6章“MySQL的索引”:本章对MySQL数据库的索引进行详细介绍,尤其是UNIQUE唯一索引、PRIMARY KEY主键索引、AUTO_INCREMENT自增序列(相当于Oracle的SEQUENCE序列)以及它们的适用场景。
第7章“MySQL的基本查询”:本章将对MySQL数据库查询所涉及的全部内容做出详细说明,包括SELECT、INSERT、DELETE、UPDATE这些主语及它们的谓词(WHERE限制条件),谓词关键字(AND、OR、IN、LIKE、BETWEEN...END、EXISTS、ORDER BY、GROUP BY、LIMIT等)。除此以外,还要对流程控制函数(IF()、IFNULL()等)、有关函数(CONCAT()、GROUP_CONCAT()、FIND_IN_SET()、RAND()等)、REGEXP正则的使用给出详细说明。在本章中,还要给出排名应用案例SQL语句,读者可以进行研究、参考、借鉴。
第8章“MySQL数据库的字符集设计”:本章对MySQL数据库的二进制数据类型、二进制字符串、各类字符集、二进制数据类型与字符集、它们的适用场景等内容进行详细介绍。
第9章“MySQL的增加、删除和修改操作”:本章对MySQL数据库增加、删除和修改的严格与宽松模式及它们的基本操作、左右全外连接操作等内容进行详细介绍。同时,给出具体的示例、实例以及应用案例等。
第10章“MySQL的流程控制与函数”:本章从MySQL编程角度出发,讲解MySQL数据库的流程控制和各种函数处理及用法,包括各类操作符介绍、流程控制语句、流程控制函数、字符串处理函数、数学函数、日期与时间函数等,并提供大量的示例供读者参考与借鉴。
第11章“MySQL的日期与时间”:本章把MySQL的日期和时间作为一个专题进行详细介绍,包括日期与时间数据类型及其适用场景、各种日期格式设置与显示、时间间隔的概念及运算、以及日期的加减运算等,同时提供大量的示例供读者参考和借鉴。
第12章“MySQL的分组与统计”:本章将MySQL的分组与统计运算作为一个专题进行详细介绍,包括COUNT()函数、DISTINCT与COUNT()函数连用、GROUP BY与COUNT()函数连用、CASE WHEN语句与COUNT()函数连用、GROUP BY与聚集函数(MIN()、MAX()、AVG()、SUM())连用、GROUP BY的HAVING分组结果的筛选等,同时提供了大量的示例、范例供读者参考和借鉴。
第13章“MySQL的多表联合操作”:本章把MySQL的多表联合操作处理作为一个专题进行详细介绍,包括数据库的约束、表间的一对一、一对多和多对多关联关系、多表操作应用实例、多表查询适用场景等,同时提供大量的范例及摘自一个在用系统中的经典SQL语句供读者参考和借鉴。
第14章“MySQL工作机制”:本章重点讨论MySQL的工作机制,包括MySQL的线程分析、MySQL的共享锁与排他锁、MySQL的表级锁、页级锁与行级锁、MySQL存储引擎和事务、MySQL的事务处理等。本章内容涉及MySQL的初级原理,适合DBA的读者,作为数据库的使用者也有必要了解一下,为数据库的性能优化及写出良好的应用程序打好基础。
第15章“MySQL存储引擎”:本章将重点讨论MySQL的存储引擎,包括MySQL所涉及的存储引擎种类、引擎更换、引擎添加与拔出、数据文件的存放位置、引擎的应用场景等。本章涉及MySQL原理性的内容,适合DBA的读者,作为数据库的普通使用者也有必要了解一下,为数据库的性能优化及写出良好的应用程序打好基础。
第16章“MySQL视图、存储程序”:本章将重点阐述MySQL数据库编程,进一步了解数据库的应用,体现数据库为应用项目开发所提供的解决方案。这些解决方案主要体现在存储过程、函数、触发器的灵活运用上。
第17章“MySQL备份与恢复”:本章重点讲解MySQL数据库的备份与恢复,包括MySQLDump
与BingLog两种方式对MySQL数据库进行备份与恢复操作等。
第18章“全解MySQL性能优化”:SQL优化是任何数据库永恒的话题,MySQL也不例外。SQL语句的书写,里面包含了很大的学问。完成同样的查询,可以有多种不同的写法。在这些写法中,哪种写法最优就是本章所要讨论的问题。与此同时,本章还要阐述与MySQL数据库性能优化相关的问题,全解提高MySQL执行效率与优化运行状态分析,包括数据库架构的选择、表字段类型的选择、数据库索引对性能的影响、查询优化技术等。
本书内容翔实,实例丰富,适合MySQL开发人员阅读,同时也适合作为各大中专院校数据库相关专业的师生提升数据库知识水平的延伸读物。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
本章简要介绍数据库的发展史,讲解开发中使用数据库的原因、优点、重要性、特点,以及在众多的数据库产品中如何选择使用MySQL。
通过本章的学习,读者可以初步了解数据库,为后续章节的学习打下基础。
数据库发展到今天,在世界范围内形成了多个数据库类型。
相较于其他数据库,MySQL数据库具有部署简便、移植性好,以及SQL语句丰富等特点,目前在国内市场占有率逐年上升,市场份额不断扩大,因此成为广大开发人员Web应用数据库的首选产品。
数据库,顾名思义,就是数据的仓库,里面装的都是数据。用户在需要使用数据的时候,可以把数据取出来,不需要的时候再把数据放回;用户有了新的数据可以存储在数据库中,数据不再需要,可以在数据库中进行删除;用户的数据有了新的变化,可以通过数据库进行更新。
在数据库中,数据是以数据模型的形式存储的。数据模型是数据库的基础。因此,对于数据库技术发展阶段的划分,应以数据模型的发展演变作为主要依据和标志。总体来说,数据库技术从诞生到现在经历了以下3个主要发展阶段。
第一代数据库包括层次数据库系统和网状数据库系统。虽然它们的数据模型分为层次模式和网状模型,但层次模型实质上是网状模型的特例,因为无论是体系结构、数据库语言,还是数据的存储管理,都有共同特征。
第二代数据库为支持关系数据模型的关系数据库系统。关系模型不仅清晰、简单,而且使用“关系”作为语言模型,并使用关系数据理论作为理论基础。因此,关系数据库具有数据独立性强、数据库语言非过程化等特点(这些特点也是第二代数据库的显著标志)。
第三代数据库系统的特征是数据模型更加丰富,数据管理功能也更为强大,能够支持传统数据库难以支持的新的应用。
层次数据库是按记录来存取数据的。层次数据模型中最基本的数据关系是基本层次关系,它代表两个记录型之间一对多的关系,数据库中有且仅有一个记录为根节点。其他记录型有且仅有一个双亲(N个子女)。在层次模型中从一个节点到其双亲(N个子女)的映射必须是唯一的,因此,对每一个记录型(除根节点)只需要指出它的双亲(N个子女),就可以表示出层次模型的整体结构,其层次模型是树状的。我们可以把层次模型的数据组织结构理解为埃及的金字塔,塔尖为根节点,然后一层一层往下延伸。例如比较著名的层次数据库系统是IBM公司的IMS(Information Management System,信息管理系统),它是IBM公司最早研制的大型数据库系统程序产品。从20世纪60年代末到如今已经发展到了IMS_v6,提供群集、多路数据共享和消息队列共享等先进特性的支持。这个具有几十年历史的数据库产品在当今的商务智能等应用中扮演了新的角色。
网状数据库是基于网状模型的基础上建立的,它把每条记录当成一个节点,记录与记录之间可以建立关联,这些关联通过指针来实现,这样多对多的关联就轻松实现了。这种类型的数据库的优点是数据的冗余性很低;缺点是当数据越来越多的时候,关联的维护会变得很复杂,关联也会变得混乱不清。我们可以把网状的数据组织结构理解为一张网。例如,Computer Associates的IDMS(Integrated Database Management System,综合数据库管理系统)就属于网状数据库管理系统。
关系数据库以行和列的形式存储数据,这一系列的行和列称为表。这个表是二维的,即由行和列构成。我们平时使用Excel制作的表格就是二维的。可以这样认为,一组表或者多张表构成了数据库。表与表之间的数据记录存在关联或关系。用户用查询来检索数据库中的数据。一个查询是一个用于指定数据库中表的行和列的SELECT语句。
现在流行的大型关系型数据库有MySQL、DB2、Oracle、SQL Server和Sybase等,它们的应用较为广泛。其中,MySQL就是本书要介绍的数据库。
面向对象的数据库就是把数据采用面向对象的方法以类和实例的形式组织起来,而不是像关系型数据库那样以表的形式来组织数据。该类型数据库的主要作用是更加方便地满足面向对象编程语言对数据的操作需求。与关系型数据库的主要区别是面向对象的数据库可以处理比关系型数据库更复杂的数据类型。当数据查询时,不需要多表组合的操作,就可以直接通过指针和索引查找数据;而数据库模式和程序类定义模式吻合。未来面向对象的数据库必将成为一种强大的数据库类型,但目前为止还没有发现合适的产品。
可以说任何应用项目都离不开数据库,数据库在应用项目中起着至关重要的作用。为什么这么说呢?任何应用项目肯定会涉及方方面面的数据,有些数据是必须存储起来的,不能丢失。例如,用于登录的用户信息(登录名、密码等)、淘宝的商品信息、顾客的购买信息等,不胜枚举。如果一旦关闭计算机这些信息就都消失了,那么这是绝对不允许的。因此必须要有数据库来存储这些信息。这些信息一旦存入数据库,即便关闭了计算机,这些信息仍然存在,需要时再取出来使用。
有了数据库,即使数据量信息很大,也可以进行存储,无须担心数据库容量的问题。同时,还可以利用数据库提供的强大开发技术,为应用项目开发提供多种解决问题的可选方案。例如,任何关系型数据库都提供存储过程、触发器和存储函数等开发技术,充分利用好这些开发技术往往可以达到事半功倍的效果。解决Web应用项目开发前后端是个相当棘手的问题。例如,对于前端程序控制的后台代码一般需要循环几万次、几十万次,甚至几百万次才能解决的问题,如果通过数据库开发技术,可能只需一条或几条SQL语句就能完成,这样大大提高了代码运行效率,原来可能花费十几分钟,而现在只需十几秒或者更少时间。
SQL是数据库提供给开发者用于数据库开发的编程语言,有属于自己的一套流程控制、语法定义。简单地说,它是数据库的编程语言。
SQL是高级非过程化编程语言,允许用户在高层数据结构上使用。它不要求用户指定对数据的存储方法,也不需要用户了解具体的数据存储方式,适用于具有完全不同底层结构的不同种类的数据库系统,因此允许使用相同的SQL作为数据输入与管理的接口。SQL以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,因此,SQL语句可以嵌套,这使得它具有极大的灵活性和强大的功能。多数情况下,在其他语言中可能需要一大段程序实现的功能只需要一个SQL语句就可以达到同样的目的(正如1.3节介绍的那样,可以将耗时十几分钟的处理缩短为十几秒),这也意味着使用SQL可以写出非常复杂的语句。
SQL因其具有如下特点而得到广泛应用。
SQL中有4种基本的DML(Data Manipulation Language,数据操纵语言)操作:INSERT、SELECT、UPDATE和DELETE。
本章介绍了MySQL的客户端与服务器端的概念、MySQL数据库服务器的启动与停止以及数据库的基本使用。
通过本章的学习,读者可以掌握客户端软件的安装方法及如何连接到本地MySQL数据库,尤其是连接到本地以外的远程Web服务器上的MySQL数据库。了解SQL的基本知识、掌握数据库、数据表的创建与维护等基本操作技术。
MySQL的客户端,是指能够远程操作服务器端MySQL数据库的“管理工具”,自身无数据维护功能,也不能存储数据。它在本地部署并运行,其目的是远程维护服务器端的MySQL数据库。
MySQL的服务器端,是指被部署在服务器端上的MySQL数据库系统,其功能和任务是为Web应用项目或其他类应用项目提供数据库服务。
目前MySQL客户端主要包括phpMyAdmin和Navicat for MySQL两款,其中phpMyAdmin在安装完WampServer集成环境后将自动安装;Navicat for MySQL需单独安装。
在本书中,主要使用Navicat for MySQL的客户端工具来操作和维护MySQL数据库。
(1)确认计算机的操作系统是32位还是64位。
首先选择桌面上的“计算机”图标,然后单击鼠标右键,在弹出的如图2.1所示的快捷菜单中选择“属性”。
图2.1 选择“属性”选项
然后,出现如图2.2所示的计算机系统信息界面,通过查看“系统类型”显示的信息,可以得知计算机的操作系统是32位还是64位。
图2.2 计算机系统信息
(2)下载安装文件。
需要根据操作系统的位数下载相应的安装文件。如果Windows操作系统是64位的,则下载navicat111_MySQL_cs_x64.exe文件;若Windows操作系统是32位的,则下载navicat111_MySQL_cs_x86.exe文件。
(3)安装。
双击下载的安装文件,进入安装界面,如图2.3所示。
图2.3 Navicat for MySQL初始安装界面
单击“下一步”按钮,出现如图2.4所示的“许可证”界面,然后单击“我同意”单选按钮。
图2.4 Navicat for MySQL版权许可界面
再单击“下一步”按钮,出现如图2.5所示的“选择安装文件夹”界面。在如图2.5所示的界面中,可以设置软件安装位置,单击“浏览”按钮可选择任意安装位置。本书在此处采用默认位置进行安装。
图2.5 设置安装位置
最后,单击“下一步”按钮完成Navicat for MySQL软件的安装。
Navicat for MySQL软件安装后会在计算机桌面上出现如图2.6所示的图标。
图2.6 Navicat for MySQL桌面图标
双击这个图标,运行该客户端工具,如图2.7所示。
图2.7 Navicat for MySQL管理界面
至此,Navicat for MySQL启动成功。
建立本地连接,是指在本地Web服务器上创建连接配置信息并在其上操作,连接配置信息存储在本地Web服务器上。
在“Navicat for MySQL管理界面”上,单击左上角的“连接”按钮,选择“MySQL”选项,如图2.8所示。
图2.8 Navicat for MySQL管理界面
单击“MySQL”选项后,界面如图2.9所示。
图2.9 Navicat for MySQL建立本地连接
选择“常规”选项卡,其中各项说明如下。
填写好后,单击左下角的“连接测试”按钮,若出现如图2.10所示的界面,说明连接成功。
图2.10 Navicat for MySQL本地连接测试
建立远程连接意味着通过客户端上安装的“Navicat for MySQL”工具软件就可以操纵远程Web服务器上的MySQL数据库,连接设置信息存储在客户端计算机上。与建立本地连接不同的地方是需建立一个HTTP通道,具体操作如下。
选择“HTTP”选项卡,按照图2.11中的文字说明进行操作,最后单击“连接测试”按钮。
在“通道地址”中输入“http://IP地址或域名/ntunnel_mysql.php”,其中“IP地址或域名”就是指向远程Web服务器的IP地址或域名。“ntunnel_mysql.php”需从网上下载,然后放在远程Web服务器的网站根目录下即可。
关于“Navicat for MySQL”的操作使用手册,书中并未涉及,读者可参阅相关资料。
图2.11 Navicat for MySQL建立远程连接
双击桌面上的wamp图标,在桌面右下角出现像个小房子的运行标志图标,用鼠标左键单击该图标,在弹出的菜单中选择“Service administration”→“启动/继续服务”,如图2.12所示。
图2.12 MySQL启动方式
SQL分为数据查询语言、数据操纵语言、数据定义语言和数据控制语言4个部分。
数据查询语言的基本结构是由SELECT子句、FROM子句和WHERE子句构成的,其基本格式是“SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>”。
数据操纵语言主要有以下3种形式:
数据定义语言用来创建数据库中的各种对象,包括表、视图、索引、同义词、聚簇等,如CREATE TABLE(表)、CREATE VIEW(视图)、CREATE INDEX(索引)、CREATE SYN(同义词)和CREATE CLUSTER(聚簇)。
数据控制语言用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
(1)GRANT:授权。
(2)ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
如果在“ROLLBACK”后无任何参数,则使数据库状态回到上次最后提交的状态。
(3)COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的用户才能有权看到所做的事情,其他用户只有在最后提交完成后才可以看到。提交数据有如下3种类型。
用鼠标左键单击屏幕右下角的“”图标(如果屏幕右下角未出现“”图标,则双击桌面上的“”图标后即可出现),在出现的菜单中找到“MySQL”选项,将鼠标指针(箭头)移动到该条目上弹出菜单,找到“MySQL console”或“MySQL 控制台”,单击后出现如图2.13所示的命令登录窗口。
图2.13 MySQL命令窗口输入口令
在如图2.13所示的命令登录窗口中输入root密码,密码输入正确后(如果没有密码直接按回车键即可),出现如图2.14所示的命令窗口界面。
图2.14 MySQL命令窗口
至此,MySQL命令窗口正式打开。
使用CREATE DATABASE命令可以创建一个数据库。命令如下:
CREATE DATABASE IF NOT EXISTS finecms DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
这句话的意思就是如果数据库“finecms”不存在,则创建一个名称为“finecms”,设定其字符集为UTF8、字符集的排序规则为utf8_general_ci的数据库,否则忽略。
创建数据库一般都这样来写,要给这个新建的数据库指定一个字符集(编码集)。这是必须的,如果不指定,依据数据库不同的版本,其默认字符集可能不一样,默认为UTF8。
为了确保在未来应用项目中不出现乱码,要牢记所使用数据库的字符集、浏览器的编码集、程序代码的字符集要做到一致,这样,就不会出现乱码了。
对于数据库的字符集、浏览器的编码集、程序代码的字符集,一般都统一设定为UTF8字符集。
关于字符集详细的解释可参阅有关资料。
关于MySQL最大支持数据库的个数及每个数据库中的数据表的个数,原则上MySQL对此没有限制,但是会受到操作系统的最大文件个数限制;另外某些存储引擎,也有自己的一些限制。因此,对于应用来说已经足够了。
在MySQL中,数据库的名字不能超过64个字符,不能由数字组成以及名字中不能包含像“/”“:”“*”“?”等这些符号,不规范的名称会发生错误,例如:
mysql> CREATE DATABASE 2017;
报错信息如下:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '2017'
at line 1
如果要改变当前数据库,则使用USE命令即可。例如,改变当前使用的数据库“shop”(“shop”数据库必须已存在),命令如下:
mysql> USE shop;
DatabASe changed
MySQL数据库只允许删除用户自行创建的数据库,对于MySQL默认的数据库,如“mysql”则不允许删除。
删除一个用户自行创建的数据库使用“DROP DATABASE”命令。例如,将“shop”数据库删除,命令如下:
mysql> DROP DATABASE shop;
Query OK, 0 rows affected (0.08 sec)
删除完成后,可使用“SHOW DATABASES”命令查看“shop”数据库是否还存在,命令如下:
mysql> SHOW DATABASES;
+---------------------+
| DatabASe |
+---------------------+
| Information_schema |
| mysql |
| test |
+---------------------+
3 rows in set (0.01 sec)
MySQL中使用CREATE TABLE命令创建表,基本语法如下:
CREATE TABLE table_name (column_name datatype [NULL|not null] [DEFAULT
default_value][AUTO_INCREMENT][PRIMARY KEY] [COMMENT])
下面介绍各个属性。
当创建表时,必须指定表名、列名及数据类型。对同一个表而言,列名必须唯一,每一列都必须指定数据类型。
下面在数据库中创建一个商品表,命令如下:
mysql> USE finecms;
DatabASe changed
mysql> CREATE TABLE shopnc_product (
id INt(11) NOT NULL auto_INcrement,
product_name varchar(30) default null,
product_num INt(11) default null,
product_price DECIMAL(8,2) default null,
product_pic varchar(50) default null,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FOR
MAT=DYNAMIC COMMENT='product';
Query OK, 0 rows affected (0.08 sec)
查看刚刚创建的商品表,命令如下:
mysql> SHOW TABLES;
+----------------+
| Tables_in_shop |
+----------------+
| shopnc_product |
+----------------+
1 row in set (0.00 sec)
如果想进一步查看表结构,可使用DESCRIBE命令。
mysql> DESCRIBE shopnc_product;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)
同时可以使用SHOW CREATE TABLE命令来自动生成创建表的语句。
mysql> SHOW CREATE TABLE shopnc_product\G;
*************************** 1. row ***************************
Table: shopnc_product
CREATE table: CREATE TABLE shopnc_product (
id INt(11) NOT NULL auto_INcrement,
product_name varchar(30) default null,
product_num INt(11) default null,
product_price DECIMAL(8,2) default null,
product_pic varchar(50) default null,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
COMMENT='product'
使用DROP TABLE命令可以删除表。要删除上面创建的商品表shopnc_product,可执行如下命令:
mysql> DROP TABLE shopnc_product;
Query OK, 0 rows affected (0.02 sec)
DROP TABLE命令也可以同时删除多个表,各表之间以逗号隔开即可。
mysql> DROP TABLE new_table1,new_table2;
Query OK, 0 rows affected (0.02 sec)
用户可以将已有表中的全部或部分信息放在一个新表中,这样就实现了表的复制。
下面将2.3节创建的shopnc_product表结构及内容复制到new_table1表中,命令如下:
mysql> CREATE TABLE new_table1 SELECT * FROM shopnc_product;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
然后查看一下表信息,命令如下:
mysql> SELECT * FROM new_table1;
Empty set (0.00 sec)
因为shopnc_product表的内容为空,所以新复制的表也会为空,可以查看一下新复制的表结构。
mysql> DESCRIBE new_table1;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| id | INt(11) | NO | | 0 | |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
可以看出,复制成功了。
这里需要注意的是,使用SELECT方式复制是不能复制键(Key)的。
上面演示了整个表的复制,当然也可以只复制特定的列或特定行的内容。
例如,只复制商品表中商品名称列的前10条内容,命令如下:
mysql> CREATE TABLE new_table2 SELECT product_name FROM shopnc_product LIMIT 10;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL中还有一种复制表的方法——LIKE方法,但它不能复制表的内容,只能复制表结构。
mysql> CREATE TABLE new_table5 LIKE shopnc_product;
Query OK, 0 rows affected (0.02 sec)
查看是否复制成功,命令如下:
mysql> DESCRIBE new_table5;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
上面显示的内容表明复制成功。
ALTER TABLE命令可以对已经创建的表进行修改,如增加字段、删除字段、更改字段、增加主键等操作。
先看一下当前shopnc_product的表结构,命令如下:
mysql> DESCRIBE shopnc_product;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
下面在最后一列新增一个单击量字段,命令如下:
mysql> ALTER TABLE shopnc_product
-- ADD COLUMN click_num INT NULL AFTER product_pic;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
然后查看一下表结构,命令如下:
mysql> DESCRIBE shopnc_product;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
| click_num | INt(11) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
6 rows in set(0.00 sec)
上面显示的内容表明新增字段成功。
删除新增的字段,命令如下:
mysql> ALTER TABLE shopnc_product
-- DROP COLUMN click_num;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
再查看一下表结构,命令如下:
mysql> DESCRIBE shopnc_product;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | INt(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)
上面显示的内容表明删除成功。
更改字段信息可使用CHANGE关键字,如将product_num列的类型转为MEDIUMINT型,命令如下:
mysql> ALTER TABLE shopnc_product
-- CHANGE product_num product_num MEDIUMINT(11) NULL;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
查一下修改后的结果,命令如下:
mysql> DESCRIBE shopnc_product;
+---------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+----------------+
| id | INt(11) | NO | PRI | NULL | auto_INcrement |
| product_name | varchar(30) | YES | | NULL | |
| product_num | MEDIUMINT(11) | YES | | NULL | |
| product_price | DECIMAL(8,2) | YES | | NULL | |
| product_pic | varchar(50) | YES | | NULL | |
+---------------+---------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
MySQL修改字段的另外一种语法,命令如下:
ALTER table ykxt_xp modify qlsl numeric(12,2)
ALTER table shopnc_product modify product_num MEDIUMINT(11) NULL
首先删除shopnc_product表中已有的主键,命令如下:
mysql> ALTER TABLE shop.shopnc_product
CHANGE id id INT(11) NOT NULL,
DROP PRIMARY KEY;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
然后将id字段设置为主键,命令如下:
mysql> ALTER TABLE shopnc_product
ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
在MySQL命令行下默认是不能输入中文的,可往往需要输入中文。下面来说明一下此问题的解决办法。
(1)修改注册表并刷新。
首先检查Windows注册表中的HKEY_CURRENT_USER\console,将其中的loadconime的值从0改为1,然后刷新注册表。
(2)安装搜狗拼音输入法。
在这一步,从网上下载搜狗拼音输入法并安装。
(3)检查命令窗口的默认编码集。
可以在命令窗口顶部右击,在弹出的菜单中选择“默认值”选项,打开后的界面如图2.15所示。
图2.15 命令窗口默认编码集设置
在图2.15中,在“默认代码页”下拉列表中选择“936(ANSI/OEM-简体中文GBK)”,单击“确定”按钮。然后关闭命令窗口后再重新打开,问题即可解决。
另外,如果程序保存的编码集格式为UTF-8,并且“默认代码页”下拉列表中有该编码,可以选择UTF-8或GBK,尝试以后,如果还不能输入中文,输入法也切换不了,则说明操作系统缺少必要的编码集。关于操作系统编码集的安装,读者可参阅操作系统相关手册或通过“网络”搜索相关资料。