前言:村民由于工作需要补一下 MySQL,本篇就分享一下自己的学习经验以及一些资料(村民知道自己一直在鸽)。
1. 学习分享
本来村民也是打算写一写基础教程的,但是 B 站 UP 主高新强的系列视频 —— MySQL8零基础入门视频教程 十分照顾初学者,正适合新手村。村民看下来之后觉得很不错,视频内容比较全面,分 P 目录详细,示范操作讲解细致,因此就推荐给大家,但村民也会根据自己的实际需求按照视频的分P标题写一点分享,大家在观看视频的时候可以把村民的教程放在一边进行对照。
下载安装
MySQL8.0 免费开源,可以直接从 官网下载 离线安装包进行安装。在安装过程中我们需要注意的是进行自定义安装,只安装服务器服务即可,否则会安装上一些我们在使用中不太需要的东西,这点在视频中也有强调。
上图是安装过程中选择加密方式的截图,在 MySQL 8.0 中更新了加密方式,在这里提及是因为后面视频会有所涉及,同时也会影响到可视化工具 Navicat 连接数据库。第一种加密方式 ( caching_sha2_password ) 是 MySQL 8.0 新增的,而第二种 ( mysql_native_passowrd ) 是 MySQL 5.X 版本中使用的,具体的作为新手也不需了解,只需知道就行了。由于目前还有很多数据库连接工具还不支持 caching_sha2_password 加密方式,因此选用该加密方式在使用旧版本的 Navicat 连接数据库时需要对数据库进行一系列设置(视频中有设置教程),选用第二种加密方式则不会有问题。在这里村民还是建议大家选用新的加密方式,毕竟要紧跟时代的步伐嘛。至于连接问题,大家可以采用按照视频中使用旧版本并进行设置的方式,也可以使用村民将在下面提供的资源。
Navicat 可视化工具安装
在实际运用中很少使用控制台命令行的操作方式对数据库进行操作,更多的是通过可视化图形界面,而 Navicat 正是其中的佼佼者。村民本人在工作中也是使用 Navicat 连接数据库进行操作。
Navicat 有很多产品,根据不同数据库有 Navicat for MySQL,Navicat for MongoDB,Navicat for SQL Server 等,这些都是连接单一类型数据库的,视频教程中演示安装的是 Navicat for MySQL,村民建议安装的是 Navicat Premium,可以连接不同类型的数据库。
Navicat 最新版本已经更新到 Navicat 15,可以较好地支持 MySQL 8.0,而不用像视频教程中进行更改加密方式操作。由于 Navicat 产品是收费的,我们只能通过一些特殊途径进行使用。最新的 Navicat Premium 15 安装包可以从 Navicat 官网下载到,而特殊途径就是通过注册机进行破解。村民发现网络上有通过收费来换取注册机解压包密码,而村民手上刚刚好有资源,在这里无偿分享给大家,**添加程序锅微信( dawnguo6 ),发送 “ 注册机 ” 三个字 **即可获取资源。具体的使用教程村民也会放在资源里,大家有兴趣的自提。在使用特殊途径之前大家最好先关闭 Windows Defender 的实时保护。
字符集介绍
在新建数据库时,我们需要选择字符集以及排序规则,在视频教程中选用的是 utf8 字符集,而村民在选用的是 utf8mb4 字符集。那么这两者这么像,又有什么区别呢?
utf8 只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文种平面。MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes 4 的意思,专门用来兼容四字节的 unicode。在一般情况下,使用 utf8 字符集基本足够且更加节省空间,那么为什么还要选用 utf8mb4 字符集呢?
utf8mb4 字符集相较于 utf8 字符集来说可以另外支持一些特殊的字符,比如说 emoji 表情。当你的数据库需要存储用户评论这种可能会包含 emoji 表情的数据时,我们就需要选用 utf8mb4 字符集。
关于排序规则的选择,当选用的字符集是 utf8 时默认的排序规则是 utf8_general_ci。由于字符集排序规则数量太多,大家也不必全部知晓,村民在这里只讲 utf8_unicode_ci 和 utf8_general_ci。简单来说,utf8_unicode_ci 准确度高,但校对速度稍慢;utf8_general_ci 校对速度快,但准确度稍差。在通常情况下,utf8_general_ci 的准确性足够满足我们的需求,因此选用 utf8_general_ci 即可,若是 utf8mb4 字符集则选择 utf8mb4_general_ci 即可。
在实际中,我们可以将数据库的字符集设置为 utf8,而只将需要保存 emoji 表情的数据表甚至某些字段设置为 utf8mb4 字符集即可,这样在一定程度上可以节省空间。
存储引擎
在新建表时,村民基本只选择 MyISAM 和 InnoDB 两种存储引擎。当表中的数据以查询和插入为主时,比如存储用户上传的图片、用户的交易记录等表可以选择 MyISAM 引擎,而当经常需要对表进行修改操作的表则选择 InnoDB 引擎较好。在刚开始使用时,大家大可以不必考虑很多,全部选择 InnoDB 引擎即可。
数据类型
村民认为既然学习 MySQL,那么对数据类型的熟悉就极为重要。事实上,在定义数据字段时选用合适的数据类型是优化数据库的重要方法之一,也是最基础的方法。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型。在学习过程中,村民经常把自己容易忘且需要时常看看的网站等放在收藏夹中,关于数据类型,菜鸟教程上写的较为详细,视频中的图片应该也是上面截取来的,大家可以浏览查阅。
DDL:数据定义语言
DDL 用来定义数据库对象:创建库、表、列等。
- 创建数据库:CREATE DATABASE 数据库名 CHARACTER SET UTF8;
- 修改数据库:ALTER DATABASE 数据库名 CHARACTER SET GBK;
- 创建表:CREATE TABLE 表名 ( 列名1 列数据类型1, 列名2 列数据类型2, ... );
- 添加一列:ALTER TABLE 表名 ADD 列名 列数据类型;
- 修改一个列的数据类型:ALTER TABLE 表名 MODIFY 列名 列数据类型;
- 修改表名:RENAME TABLE 原表名 TO 新表名;
- 修改表的字符集:ALTER TABLE 表名 CHARACTER SET 字符集名;
- 修改表的列名:ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型;
- 查看表的字段信息:DESC 表名;
- 查看表的创建细节:SHOW CREATE TABLE 表名;
- 删除一列:ALTER TABLE 表名 DROP 列名;
- 删除表:DROP TABLE 表名;
DML:数据操作语言
DML 用来操作数据库表中的记录,对表中的数据进行增、删、改、查的操作。
- 查询表中的所有数据:SELECT * FROM 表名;
- 插入操作:INSERT INTO 表名 ( 列名1, 列名2 ... ) VALUES ( 列值1, 列值2 ... );
注意事项:
- 列名与列值的类型、个数、顺序要一一对应
- 值不要超出列定义的长度
- 插入的日期和字符一样,都是用引号括起来
- 更新操作:UPDATE 表名 SET 列名1=新列值1, 列名2=新列值2 ... [ WHERE 列名=列值 ... ];
- 删除操作:
- 删除表:DELETE FROM 表名 [ WHERE 列名=列值 ... ];
- 截断表:TRUNCATE TABLE 表名;
当我们是用 Navicat 右键点击一张数据表时,会发现有 删除表、清空表、截断表 三个选项。删除表就是从数据库中永远删除该表;清空表是清除当前数据表中的所有数据,但是数据表结构仍保留;截断表清除当前数据表中的所有数据也不保留数据表结构。假设一张表的自增 id 已经为 10,当我们清空表后再新增一条数据时新增数据的 id 为 11,而使用截断表时新增数据的 id 为 1。因此,Navicat 中的清空表相当于删除表命令,而截断表相当于截断表命令。
DQL:数据查询语言
DQL 用来查询数据。
- 查询所有列:SELECT * FROM 表名;
- 查询指定列的数据:SELECT 列名1, 列名2 ... FROM 表名;
- 条件查询:SELECT 列名1, 列名2 ... FROM 表名 WHERE 条件;
条件查询运行符及关键字:
- = ( 等于 ) 、!= ( 不等于 ) 、<> ( 不等于 ) 、< ( 小于 ) 、<= ( 小于等于 ) 、 > ( 大于 )、>= ( 大于等于 ) ;
- BETWEEN ... AND; 值在什么范围内
- IN ( set ); 在固定的范围内
- IS NULL; ( 为空 ) 、IS NOT NULL; ( 不为空 )
- AND; 与
- OR; 或
- NOT; 非
- 模糊查询:SELECT 列名1, 列名2 ... FROM 表名 WHERE 列名 LIKE 通配符;
通配符:
- _ :任意一个字符
- % :任意 0~n 个字符
- 字段控制查询:
- 去除重复记录:SELECT DISTINCT 列名 FROM 表名;
- 把查询字段的结果进行计算,必须都是数值类型:SELECT 列名1 列名2 FROM 表名;
- 对查询结果起别名:SELECT 列名1 AS 新列名 FROM 表名;
- 排序:SELECT 列名1, 列名2 FROM 表名 ORDER BY 列名1 ASC, 列名2 DESC; ASC 升序,DESC 降序,默认情况下按升序排序。当有多个排序规则时,写在前面的排序规则优先。
- 聚合函数:对查询结果进行统计计算
常用聚合函数:
- COUNT():统计指定列不为 NULL 的记录行数
- MAX():计算指定列的最大值,如果指定列是字符串类型,则使用字符串排序运算
- MIN():计算指定列的最小值,如果指定列是字符串类型,则使用字符串排序运算
- SUM():计算指定列的数值和,如果指定列不是数值类型,则计算结果为 0
- AVG():计算指定列的平均值,如果指定列不是数值类型,则计算结果为 0
- 分组查询:将查询结果按照 1 个或多个字段进行分组,字段值相同的为同一组
- 基本使用:SELECT 列名1 FROM 表名 GROUP BY 列名1;
- GROUP BY GROUP_CONCAT():SELECT 列名1, GROUP_CONCAT( 列名2 ) FROM 表名 GROUP BY 列名1;
- GROUP BY 聚合函数
- GROUP BY HAVING:用来分组查询后指定一些条件来输出查询结果,HAVING 作用与 WHERE 一样,但 HAVING 只能用于GROUP BY
- LIMIT:SELECT * FROM 表名 LIMIT 参数1, 参数2; 参数1:从哪一行开始查询;参数2:一共查询几行。查询的下标是从 0 开始的,即若从第一条开始查为 LIMIT 0, 参数2,可以简写为 LIMIT 参数2
DDL、DML、DQL 三部分内容是会频繁应用的,因此十分重要,这里村民单独整理了一下。视频中关于书写顺序和执行顺序的讲解,村民也是第一次了解,之前并未在书上看过类似内容,这也是为什么村民将这个视频分享给大家的原因——内容讲得比较细。
DCL:数据控制语言
DCL 用来定义访问权限和安全级别。
多表外键参照约束
在这一P的视频中提到了通过拆分表操作来减少数据的冗余,也多次提到了关系这个字眼。这里村民想强调一点,那就是 MySQL 是关系型数据库,特别要注意多张表之间的联接关系,这一分P的标题——多表外键参照约束,也是在提醒我们要注意这一点。村民自己在刚开始建表的时候也不注重对各表的关系进行梳理,导致表中有很多冗余的数据,也是遭到了前辈的批评。因此大家打算建立多张数据表之前,一定要先理清各表之间的联接关系,但是有些时候为了能达到项目的需求,冗余的数据也并非一概否定,这就需要大家根据实际应用因地制宜了。
2.小结
如果大家看完了视频,那么一定对 MySQL 有一定的了解也会使用一些常用的命令。在这里村民讲几句多余的话,对数据库感兴趣的同学还是要好好学习的,村民是比较反感那些标题党文章的,虽然这些文章也不乏有价值的内容。对于新手而言,村民觉得温习和练习是十分必要的,毕竟那么多命令也不是一下子就能完全掌握的。村民本人在工作中不乏练习机会,使用时忘了用法就翻一翻,往往复复一些命令用的就得心应手了。
不甘于「本该如此」,「多选参数 」值得关注