目录什么是数据库数据库样例主流数据库服务器数据库表的关系MySQL架构SQL语句的分类存储引擎库的操作创建数据库系统编码注意编码之间的区别库的备份与恢复注意事项表的操作创建表查看表修改表删除表数据类型数值类型tinyint类型bit类型float类型decimal类型char类型varchar类型日期和时间类型enum和set类型查找方式在进入MySQL数据库基础前我们需要先在我们的操作系统上面安装好MySQL(centos或ubuntu)做好准备后我们会进入命令行我使用的是Ubuntu系统(具体的安装教程兄弟们可以网上搜哈)我们只需输入上面的命令输入密码 即可进入MySQL当然除了上面简单的进入命令以外MySQL也给了我们用户其他相应的选项这里需要注意的是1.目前是密码登陆的也就是你之前安装mysql时设置的密码2.密码输入的时候是不会显的什么是数据库在刚开始呢我们需要做一件与后面学习强相关的事情输入这一段命令我们可以得到如图正在运行的进程我们需要弄懂mysql和mysqld的区别1.mysql就是数据库服务的客户端2.mysqld就是数据库服务的服务器端(在后台一直以守护进程的形式一直运行)3.mysql本质基于C(mysql)S(mysqld)模式的一种网络服务mysql是一套给我提供数据存取的服务的网络程序数据库一般指的是在磁盘或者内存中存储的特定结构组织的数据----将来在磁盘上存储的一套数据库方案一般的文件确实提供了数据的存储功能但是文件并没有提供非常好的数据管理能力(用户角度)数据库本质对数据内容存储的一套解决方案你给我字段或者要求我直接给你结果就行从而形成一套存储解决方案文件的缺点1.不具有安全性(谁都可以访问需要添加权限)2.不利于查询海量数据3.文件在程序中控制不方便数据库样例使用MySQL建立一个数据库建立一张表插入一些数据----对比一下MySQL在Linux是如何表现的1.建立数据库本质就是Linux下的一个目录2.在数据库内建立表本质就是在Linux下创建对应的文件即可3.数据库的本质其实也是文件只不过这些并不由我们直接操作而是由数据库服务帮我们进行操作存入表中的数据如图按逻辑以行列进行存储(二维)主流数据库1.SQL Sever 微软的产品.Net程序员的最爱中大型项目。2.Oracle 甲骨文产品适合大型项目复杂的业务逻辑并发一般来说不如MySQL。3.MySQL世界上最受欢迎的数据库属于甲骨文并发性好不适合做复杂的业务。主要用在电商SNS论坛。对简单的SQL处理效果好。4.PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库不管是私用商用还是学术研究使用可以免费使用修改和分发。5.SQLite 是一款轻型的数据库是遵守ACID的关系型数据库管理系统它包含在一个相对小的C库中。它的设计目标是嵌入式的而且目前已经在很多嵌入式产品中使用了它它占用资源非常的低在嵌入式设备中可能只需要几百K的内存就够了。6.H2 是一个用Java开发的嵌入式数据库它本身只是一个类库可以直接嵌入到应用项目中。服务器数据库表的关系所谓安装数据库服务器只是在机器上安装了一个数据库管理系统程序这个管理程序可以管理多个数据库一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据一般会在数据库中创建多个表以保存程序中实体的数据。在Linux中图中DB呈现为目录形式表则为二进制的普通文件MySQL架构MySQL 是一个可移植的数据库几乎能在当前所有的操作系统上运行如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。MySQL依旧是个文件系统MySQL是基于操作系统提供的文件系统之上的一套存储解决方案第一层的功能主要连接管理和鉴权还有安全方面的策略第二层的功能主要是对客户端下达下来的SQL指令进行词法分析和语法分析对查询SQL语句进行优化且根据相关的SQL协议来向下传递(类似编译器)第三层(支持热拔插)对应的是一个一个的存储引擎(作用类似计算体中的驱动)接收上面下传下来的SQL语句(因为存储数据类型(如文档类型二进制类型等)的差别才有这么多不同的存储引擎)如MyISAM可以对大文本进行读取并发度比较高适合大量进行select读取InnoDB有丰富的索引支持可进行快速搜索查找最后一层帮我们访问指定的数据库访问指定的文件或者指定的表结构把我们的数据进行增删查改以二进制的方式存储到特定的目录下在操作系统视角下上三层属于用户进程最后一层属于操作系统网络视角下上三层属于应用层最后一层属于内核层SQL语句的分类DDL【data definition language】 数据定义语言用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言用来对数据进行操作代表指令 insertdeleteupdateDML中又单独分了一个DQL数据查询语言代表指令 selectDCL【Data Control Language】 数据控制语言主要负责权限管理和事务代表指令 grantrevokecommitDDL可以理解为创建一个表结构(或者想要创建一个链表结果定义节点和指针)DML可以理解为对表结构中的数据进行增删查改(对链表中进行头插尾插逆置找数据最大或者最小的节点)DCL主要为鉴权存储引擎存储引擎存在最底层与我们的操作系统打交道存在一大堆文件的系统调用(如对文件进行修改)我们这里主要使用的时InnoDBInnoDB支持事务MyISAM不支持库的操作创建数据库登陆进入我们的MySQL并打开另外一个终端需要变成root用户才能看该目录下所有的文件该指令是展示具有的数据库有哪一些该指令为创建数据库的指令该指令为删除数据库指令该指令为修改数据库想知道自己目前在哪个数据库中查看该数据库是怎么创建的红框中的语句的意思是使用的MySQL版本超过4.01则采用后面的语句创建数据库create databases db_name-----在Linux系统下本质就是在/var/lib/mysql创建一个目录删除数据库drop databases db_name; -----在Linux系统下就是删除了一个目录系统编码创建数据库的时候有两种编码集1.数据库编码集数据库未来存储数据2.数据库校验集支持数据库进行字段比较使用的编码本质也是一种读取数据库中数据的采用的编码格式数据库无论对数据做任何操作都必须保证操作和编码都必须编码一致的该指令可以查看你的数据库中的编码规则该指令可以查看你的数据库中的校验规则我们也可以在创建数据库的时候指定编码集格式我们也可以在创建数据库的时候设置指定编码集格式的同时设置指定的校验集格式我们默认的编码规则和校验规则是utf8想要使用其他的编码校验格式我们可以进行手动修改如不手动修改就还是使用默认的编码校验规则注意这里所展现的是适用于MySQL8之前版本的方式存储MySQL8之后把数据库元数据从文件系统迁移到了内置的数据字典里编码之间的区别此处使用校验规则的区别来区分(utf8_general_ci不区分大小写utf8_bin区分大小写)建表test1查看person的表结构并向里面插入数据我们插入数据是使用的编码规则查找数据是使用的校验规则utf8_general_ci不区分大小写使用test2重复上面操作utf8_bin区分大小写通过以上案例我们可以发现不同的校验规则查出来的数据格式就不同排序也是如此库的备份与恢复先创建一个目录在该目录下输入下面命令行-B的意思是指定数据库再返回MySQL将备份文件进行删除执行之后想要恢复删除的test1数据库只需要再MySQL命令行处输入sourcesql文件的路径即可注意事项1.如果备份的不是整个数据库而是其中的一张表怎么做# mysqldump -u root -p 数据库名 表名1 表名2 D:/mytest.sql2.同时备份多个数据库# mysqldump -u root -p -B 数据库名1 数据库名2 ... 数据库存放路径3.如果备份一个数据库时没有带上-B参数 在恢复数据库时需要先创建空数据库然后使用数据库再使用source来还原。如果想看除了我们之外还有谁连接了我们的数据库表的操作创建表细节再MySQL中空格当分隔符使用MyIsam将数据和索引文件分开InnoDB将两个文件合并查看表想要查看数据可中表是如何创建的修改表修改表的名字(此处的to可以省略)向表中各属性插入数据并查看数据向birthday属性后面插入图像路径(image_path)属性修改属性中名字的长度从20改成60----------------------------------------------------------------看定义name的那一行后面的comment‘用户名’被直接替换掉了去除了删除password属性此处以password为例也可以删除其他属性修改表中属性的名字(图中红框处的属性必须得带上删除表以上操作中修改表和删除表操作尽量少用毕竟MySQL数据库在我们日常使用中是处于下层修改或删除操作后影响的方面会很多如上层的各种语言需要访问下层下层一旦进行修改上层使用到下层的各种软件也需要随着修改数据类型数值类型tinyint类型例子(以tinyint为例)数据类型加上unsigned如果我们向MySQL特定的类型中插入不合法的数据MySQL一般都是直接拦截我们不让我们做对应的操作反过来如果我们已经有数据被成功插入到MySQL中了一定插入的时候是合法的所以MySQL中一般而言数据类型的本身也是一种约束约束就能倒逼使用者可能进行正确的插入约束使用者另外如果你不是一个很好的使用者MySQL也能保证数据插入的合法性就能保证数据库中的数据是可预期完整的bit类型再online的位置处因为插入的数据的数据类型为bit所以是以ascll码值的形式存在的是一种位图结构以十进制的形式产生我们改一下bit类型的大小可以更直观的看出是以ascll码值的形式存在的在创建表的时候bit类型超过64也会被拦截float类型语法float[(m, d)] [unsigned] : M指定显示长度d指定小数位数占用空间4个字节定义了一个总长度为4精度为2的浮点类型(默认为有符号signed)上面的红框表示所定义的浮点类型的取值范围为-99.99至99.99而且取值总位数为4其他位数定义可以自行测试下面的红框表示当小数部分超出所定义的两位精度时会进行四舍五入接下来我们换成无符号位(unsigned)进行测试看看取值范围为多少由此可以看出float无符号位(unsigned)的取值范围位0~99.99当小数部分超出所定义的两位精度时会进行四舍五入对于浮点数我们也需要对他的精度进行一定的测试精度都会产生一定的偏差我们将数据类型从变成默认的float上述例子中可以看出大一点的数据使用float类型会造成精度下降会有精度损失decimal类型对于float类型会造成的精度损失decimal能够很好地规避这一点decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略默认为0如果m被省略默认是10decimal(m, d) [unsigned] : 定点数m指定长度d表示小数点的位数float的精度大约是7位我们这里故意将其小数点的位数设置成8观察是否能精准到8位呢我们再将f2修改成跟f1数据类型一样将float和decimal进行比较发现数据大的使用decimal精度不会损失float仍然会损失char类型MySQL处的单位字符就真的只是单位不同于我们C/C语言中的字符占一个字节utf8编码下占用3个字节超过规定的长度MySQL直接截断不能插入最大的可设置长度为255超过也自动截断不让你创建表varchar类型varchar(L): 可变长度字符串L表示字符长度最大长度65535个字节关于varchar(len),len到底是多大这个len值和表的编码密切相关varchar长度可以指定为0到65535之间的值但是有1 - 3 个字节用于记录数据大小所以说有效字节数是65532。当我们的表的编码是utf8时varchar(n)的参数n最大值是65532/321844[因为utf中一个字符占用3个字节]如果编码是gbkvarchar(n)的参数n最大是65532/232766因为gbk中一个字符占用2字节。mysql create table tt11(name varchar(21845))charsetutf8; --验证了utf8确实是不 能超过21844 ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs mysql create table tt11(name varchar(21844)) charsetutf8; Query OK, 0 rows affected (0.01 sec)严谨的来说最大长度为21844而不是21845因为varchar类型需要1~3各字节用于记录数据大小与char相同超过规定的长度就会产生报错此处的max16383的由来是由65536除以3来的因为此处的编码为utf8一个字符占三个字节varchar规定长度为65536字节char就相当于C/C中的数组一般一次空间就给定你varchar就相当于C/C中的string用多少给你多少长度需要维护有效字符个数也需要维护如何选择定长或变长字符串如果数据确定长度都一样就使用定长char比如身份证手机号md5如果数据长度有变化,就使用变长(varchar), 比如名字地址但是你要保证最长的能存的进去。定长的磁盘空间比较浪费但是效率高。变长的磁盘空间比较节省但是效率低。定长的意义是直接开辟好对应的空间变长的意义是在不超过自定义范围的情况下用多少开辟多少。日期和时间类型定义一个表date主要用于记录生日之类的datetime用于记录固定时间(比如进入公司的入职时间)timestamp不需要我们做任何动作会自动更新以下是用到timestamp的例子(评论)enum和set类型例子NULL和‘ ’ 前者代表什么都没有后者代表里面有东西但是是空串(例如发工资时前者没有相应需要的银行卡后者有银行卡但是里面没钱)往enum和set中插入数据的时候enum可通过下标插入(从1开始)set相当于位图代表比特位的位图从右向左从低向高代表爱好(hobby)的从左向右查找方式gender是枚举类型hobby是集合类型但是这样查找太过于简单而且有很多有着多个爱好在这里查找的条件太过于单一MySQL中也是存在函数的返回的是下标即为0则为假非0则为真MySQL中的筛选函数(集合查询使用find_ in_ set函数)这种查找方式是不对的在这里我们要查找拥有着’羽毛球‘和’代码‘两种爱好的人(这样的人肯定还有其他爱好就是只要有这两个爱好的人都查出来)就应该像在写代码时一般用且来进行连接