Node.js<十三>——理解MySQL数据库学习

174 阅读10分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

Koa洋葱模型

这其实是一个概念性的东西,但其实了解了koa的源码之后,我们会发现洋葱模型非常容易理解

比如我们在app中注册了很多的中间件,那么在用户发送了请求之后,中间件会按照注册的顺序依次执行(如果每个中间件都在末尾执行next函数的话),这个过程就很像是我们在洋葱外面一层层的进入到洋葱的内部,比如下面的代码:

const Koa = require('koa')

const app = new Koa()

app.use((ctx, next) => {
  next()
  ctx.body = ctx.message
})

app.use((ctx, next) => {
  next()
})

app.use((ctx, next) => {
  ctx.message = 'Hello World'
})

app.listen(8000, () => {
  console.log('Koa初体验服务器启动成功~');
})

首先代码会来到中间件1,因为其调用了next函数,所以又会去到中间件2,因为中间件2中也调用了next函数,所以代码又会来到中间件3中执行,等到中间件3执行完毕后又会回到中间件2,等到中间件2执行完毕后又会回到中间件1,最后所有的中间件都执行完毕后返回响应数据给客户端,整个请求-通信的流程就结束了。

代码的执行是从middleware1 -> middleware2 -> middleware3 -> middleware2 -> middleware1,就相当于是从洋葱的最外层走到了最里面,然后又从最里面走到了最外层才响应结果

但那么说的话,express好像也有洋葱模型,但是由于其源码中next函数的处理方式和koa的不同,其只有在中间件都是同步函数的情况下才符合洋葱模型,而koa无论中间件是同步的还是异步的,都有办法让其符合洋葱模型

MySQL

为什么需要数据库?

任何软件系统都需要存放大量的数据,这些数据通常是非常复杂和庞大的:

  • 比如用户信息包括姓名、年龄、性别、地址、身份证号、出生日期等等
  • 比如商品信息包括商品的名称、描述、价格(原价)、分类标签、商品图片等等
  • 比如歌曲信息包括歌曲的名称、歌手、专辑、时长、歌词信息、封面图片等等

那么这些信息不能直接存储到文件中吗?可以,但是文件系统有很多的缺点

  • 很难以合适的方式组织数据(多张表之前的关系合理组织)
  • 并且对数据进行增删改差的复杂操作(虽然一些简单确实可以),并且保证单操作的原子性(不能同时去修改同一个数据)
  • 很难进行数据共享,比如一个数据库需要为多个程序服务,如何进行很好的数据共享
  • 需要考虑如何进行数据的高效备份、迁移、恢复等等

数据库通俗来讲就是一个存储数据的仓库,数据库本质上就是一个软件、一个程序

常见的数据库有哪些?

通常我们将数据库划分成两类:关系型数据库和非关系型数据库:

  • 关系型数据库:MySQLOracleDB2SQL ServerPostgre SQL

    • 关系型数据库通常我们会创建很多个二维数据表
    • 数据表之间相互关联起来,形成一对一,一对多,多对多等关系
    • 之后可以利用SQL语句在多张表中查询我们所需的数据
    • 支持事务,对数据的访问更加的安全
  • 非关系型数据库:MogoDBRedisMemcachedHBse

    • 非关系型数据库的英文其实是Not Only SQL,也简称为NoSQL
    • 相对于关系型数据库会比较简单一些,存储数据也会更加自由(甚至我们可以直接将一个复杂的json对象直接塞入到数据库中)
    • NoSQL是基于Key-Value的对应关系,并且查询的过程中不需要经过SQL解析,所以性能更高
    • NoSQL通常不支持事务,需要在自己的程序中来保证一些原子性的操作(加锁解锁等操作)
  • 如何在开发中选择他们呢?具体的选择会根据不同的项目进行综合的分析,这里有一些建议

    • 目前在公司进行后端开发(NodeJavaGo等),还是以关系型数据库为主
    • 比较常用到非关系型数据库的场景:在爬取大量的数据进行存储时直接将爬取下来的json数据存到数据库中

认识MySQL

MySQL的介绍:

  • MySQL原本是一个开源的数据库,原开发者为瑞典的MySQL AB公司
  • 2008年被Sun(开发了Java语言的公司)公司收购;在2009年,Sun公司被Oracle(甲骨文公司)收购
  • 所以目前MySQL归属于Oracle公司

MySQL是一个关系型数据库,其本质上就是一个软件、一个程序

  • 这个程序中管理着多个数据库
  • 每个数据库中可以有多张表
  • 每个表中可以有多条数据

终端连接数据库

如果我们想要操作数据,需要先和数据建立一个连接,最直接的方式就是通过终端来连接,主要有两种方式:

  • 方式一:mysql -uroot -p你的密码
  • 方式二:mysql -uroot -p,输入这行指令之后会让你继续数据密码

终端操作数据库 - 显示数据库

我们说过,一个数据库软件中,可以包含很多个数据库,如何查看数据库呢?我们可以在终端使用show databases;指令,注意分号;是不能少的

MySQL默认的数据库:

  • information_schema:信息数据库,其中包括MySQL在维护的其他数据库、表、列、访问权限等信息
  • performance_schema:性能数据库,记录着MySQL Server数据库引擎在运行过程中的一些资源消耗相关的信息
  • mysql:用于存储数据管理者的用户信息、权限信息以及一些日志信息等
  • sys:相当于是一个简易版的performance_schema,将性能数据库中的数据汇总成更容易理解的形式

终端操作数据库 - 创建数据库和表

在终端直接创建一个属于自己的新的数据库(一般情况下一个新的项目会对应一个新的数据库)

  • create database 数据库名称;

使用我们创建的数据库

  • use 数据库名称;

在数据中建一张表

  • create table 表名称(表对应的字段名称以及类型);

在表中插入数据

  • insert into 表名(字段名称) values (字段对应的值);

GUI工具的介绍

我们会发现在终端操作数据库有很多不方便的地方

  • 语句写出来没有高亮,并且不会有任何的提示
  • 复杂的语句分成多行,格式看起来并不美观,很容易出现错误
  • 终端中查看所有的数据库或者表现的非常不直观和不方便等等

所以在开发中,我们可以借助于一些GUI工具来帮助我们连接上数据库,之后直接在GUI工具中操作就会非常方便,我们这里推荐Navicat

认识SQL语句

我们希望操作数据库(特别是在程序中),就需要有和数据库沟通的语言,这个语言就是SQL

  • SQL称为结构化查询语言
  • 使用SQL编写出来的语句,就成为SQL语句
  • SQL语句可以用于对数据库进行操作

事实上,常见的关系型数据库SQL语句都是比较相似的,所以你学会了MySQL中的SQL语句,之后去操作比如Oracle或者其他关系型数据库也是非常方便的

SQL语句的常用规范:

  • 通常关键字是大写的,比如CREATETABLESHOW等等
  • 一条语句结束后,需要以;结尾
  • 如果遇到关键字作为表名或者字段名,可以使用``包裹

SQL语句的分类

常见的SQL语句我们可以分成4

  • DDL:数据定义语言

    • 可以通过DDL语句对数据库或表进行:创建、删除、修改等操作
  • DML:数据操作语言

    • 可以通过DML语句对表进行:添加、删除、修改等操作
  • DQL:数据查询语言

    • 可以通过DQL从数据库中查询记录
  • DCL:数据控制语言

    • 对数据库、表的权限进行相关访问控制操作

数据库的操作

  1. 查看所有的数据库
SHOW DATABASES;
  1. 选择某一个数据库
USE test;
  1. 查看当前正在使用的数据库
SELECT DATABASE();
  1. 创建一个新的数据库
# 如果这个数据库已经存在,那么执行下面的指令是会报错的
CREATE DATABASE newbase; 
# 所以我们创建数据库的时候最好先判断一下其存不存在,不存在再创建
CREATE DATABASE IF NOT EXISTS newbase;
# 创建数据库的时候指定对应的字符集和排序规则
CREATE DATABASE IF NOT EXISTS newbases DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci; 
  1. 删除数据库
# 如果这个数据库不存在,那么执行下面的指令是会报错的
DROP DATABASE newbases;
# 所以我们在删除数据库的时候最好先判断一下其存不存在,存在再删除
DROP DATABASE IF EXISTS newbases;
  1. 修改数据库的编码
ALTER DATABASE a CHARACTER SET = utf8 COLLATE = utf8_lithuanian_ci;

数据表的操作

  1. 查看所有的表
SHOW TABLES;
  1. 新建表
CREATE TABLE IF NOT EXISTS `haha` (
	`name` VARCHAR(10),
	`age` INT,
	`score` INT
);
  1. 查看表的结构
DESC haha;
  1. 查看创建表的SQL语句
SHOW CREATE TABLE `haha`;
  1. 删除表
DROP TABLE IF EXISTS `haha`;

SQL的数据类型

我们知道不同的数据会划分为不同的数据类型,在数据库中也是一样

  • MySQL支持的数据类型有:数字类型,日期和时间类型,字符串(字符和字节)类型,空间类型和JSON数据类型

数字类型

MySQL的数字类型有很多:

  • 整数数字类型:INTEGERINTSMALLINTTINYINTMEDIUMINTBIGINT
  • 浮点数字类型:FLOATDOUBLE(FLOAT是4个字节,DOUBLE是8个字节)
  • 精度数字类型:DECIMALNUMERIC(DECIMAL是NUMERIC的实现形式)

日期类型

YEARYYYY格式显示值

  • 范围19012155,还有0000

DATE类型用于具有日期部分但没有时间部分的值

  • DATE以格式YYYY-MM-DD显示值
  • 支持的范围是1000-01-019999-12-31

DATETIME类型用于包含日期和时间部分的值:

  • DATETIME以格式YYYY-MM-DD hh:mm:ss显示值
  • 支持的范围是1000-01-01 00:00:009999-12-31 23:59:59

TIMESTAMP类型(开发中用的最多的类型)用于包含日期和时间部分的值:

  • TIMESTAMP以格式YYYY-MM-DD hh:mm:ss显示值
  • 但是它的范围是UTC的时间范围:1970-01-01 00:00:012038-01-19 03:14:07

另外:DATETIME或TIMESTAMP值可以包括在高达微秒(6位)精度的后小数秒一部分

  • 比如DATETIME表示的范围可以是1000-01-01 00:00:00.0000009999-12-31 23:59:59.000000

字符串类型

MySQL的字符串类型表示方法如下:

  • CHAR类型在创建表时为固定长度,长度可以是0255之间的任何值

    • 在被查询时,会删除后面的空格
  • VARCHAR类型(开发中用的最多)的值是可变长度的字符串,长度可以制定为065535之间的值

    • 在被查询时,不会删除后面的空格
  • BINARYVARBINARY类型用于存储二进制字符串,存储的是字节字符串
  • BLOB用于存储大二进制类型
  • TEXT用于存储大的字符串类型