阅读 182

我的 mysql 半年小得 | 掘金征文

这半年来,我们的村民同学主要的心思都扑在了数据库上。虽然不能说有了精通的水平,但也有了一些自己的所思所想。借着这次征文的东风,分享一下自己对于 mysql 的所得,做个砖抛出。

1. 学习分享

本来村民也是打算写一写基础教程的,但是 B 站 UP 主高新强的系列视频 —— MySQL8零基础入门视频教程 十分照顾初学者,正适合新手村。村民看下来之后觉得很不错,视频内容比较全面,分 P 目录详细,示范操作讲解细致,因此就推荐给大家,但村民也会根据自己的实际需求按照视频的分P标题写一点分享,大家在观看视频的时候可以把村民的教程放在一边进行对照。

字符集介绍

在新建数据库时,我们需要选择字符集以及排序规则,在视频教程中选用的是 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.小结

在这里村民讲几句多余的话,对数据库感兴趣的同学还是要好好学习的,村民是比较反感那些标题党文章的,虽然这些文章也不乏有价值的内容,温习和练习是十分必要的。

这便是我半年小得了,可能有点贫瘠,但的确是将我的所有理解都写出来了。

掘金征文 | 2020 与我的年中总结 征文活动正在进行中......