数据库的基本概念

什么是数据库

数据库 (database)是用来阻止、存储和管理数据的仓库

当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据

常见数据库及分类

市面上的数据库有很多种,最常见的数据库有如下几个:

  • MYSQL 数据库(目前使用最广泛、流行度最高的开源免费数据库; Community(社区版免费) + Enterprise(企业收费版))
  • Oracle 数据库(收费)
  • SQL Server 数据库 (收费)
  • Mongodb 数据库(Community + Enterprise)也分两个版本

其中,MySQL、Oracle、SQL Server 属于传统型数据库(又叫做:关系型数据库 或 SQL 数据库),这三者的设计理念相同,用法比较类似

而 Mongodb 属于新型数据库(又叫做:非关系型数据库 或 NoSQL 数据库),它在一定程度上弥补了传统型数据库的缺陷

传统型数据库的数据组织结构

Excel 的数据组织结构

每个 Excel中,数据的组织结构分别为工作薄、工作表、数据行、列这 4 大部分组成

这 4 大部分都是 互相包含的 工作簿包含工作表,工作表包含数据行,数据行又包含列

  • 整个 Excel 叫做工作簿
  • users 和 books 是工作表
  • users 工作表中有 3 行数据
  • 每行数据由 6 列信息组成
  • 每列信息都有对应的数据类型

在传统型数据库中,数据的组织结构分为数据库(database)、数据表(table)、数据行(row)、 字段(field)这 4 大部分组成

一个数据库里面可以包含多张表,每张表里面由数据行组成的,每一行是由字段来组成的(也就是列)

  • 数据库类似于 Excel 的工作簿
  • 数据表类似于 Excel 的工作表
  • 数据行类似于 Excel 的每一行数据
  • 字段类似于 Excel 的列
  • 每个字段都有对应的数据类型

库、表、行、字段的关系

  1. 在实际项目开发中,一般情况下,每个项目都对应独立的数据库
  2. 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books 表中
  3. 每个表中具体存储那些信息,由字段来决定,例如:我们可以为 users 表设计 id、username、password 这 3 个字段
  4. 表中的行,代表每一条具体的数据

安装并配置 MySQL

MySQL相关的软件

对于开发人员来说,只需要安装 M有SQL Server 和 MySQL Workbench 这两个软件,就能满足开发的需要了

  • MySQL Server:专门用来提供数据存储和服务的软件
  • MySQL Workbench:可视化的 MySQL 管理,通过它,可以方便的操作存储在 MySQL Server 中的数据

Windows安装MySQL

在 Windows 环境下安装 MySQL,只需要运行 mysql-installer-community-8.0.19.0.msi 这个安装包,就能一次性将 MySQL Server 和

MySQL Workbench 安装到自己的电脑上

下载: MySQL

  1. 双击 mysql-installer-community-8.0.19.0.msi,启动 MySQL 安装程序
  2. 如果弹框提示如下的警告信息,证明你的电脑需要安装额外的 .NET Framework 依赖包。此时,先退出 MySQL 的安装程序,然后双击 NDP452-KB2901907-X86-X64-AllOS-ENU.exe,启动 .NET Framework

  1. 双击mysql安装包,稍等一会儿之后,出现如下安装界面

可以看到有5中安装类型,分别是:

  • Developer Default:默认安装类型
  • Server only:仅作为服务器
  • Client only:仅作为客户端
  • Full:完全安装
  • Custom:自定义安装

在这里我们选择Custom,也就是自定义安装,然后点击Next

出现以下界面

我们进行选择性的安装

我们选装MySQL Server 8.0.29-X64MYSQL Documentation 8.0.29-X86Samples and Examples 8.0.29-X86即可

继续下一步

四、配置mysql

出现服务器类型配置窗口,如图:

当我们点击Config Type的时候,可以看到出现几个选项

上面几个含义分别是:

  1. Development Machine(开发机器):该选项代表典型个人用桌面工作站。假定机器上运行着多个桌面应用程序,将MySQL服务器配置成使用最少的系统资源
  2. Server Machine(服务器):该选项代表服务器,MySQL服务器可以同其他应用程序一起运行,例如FTPEmailWeb服务器。MySQL服务器配置成使用适当比例的系统资源
  3. Dedicated Machine(专用服务器):该选项代表只运行MySQL服务的服务器。假定没有运行其他服务程序,MySQL服务器配置成使用所有可用系统资源

在这里我们使用Development Machine(开发机器),方便使用,别的默认配置都不动,直接点击Next

出现如图的权限设置方式窗口,第一个单选项的含义是MySQL 8.0提供的新的授权方式,采用SHA256基础的密码加密方法;第二个单选项的含义是传统授权方法(保留5.x版本兼容性)。这里选择第二个单选项

点击Next之后,我们就在新弹出的界面中,配置mysql数据库的root用户名登录信息了,这里我设置的是Yunweijia0909,我们需要输入两遍哈;

当然,我们也可以在这个界面中新添加其他用户,这个根据实际情况来配置即可

MySQL Root Password: Lp17762682464

Repeat Password: Lp17762682464

配置完毕之后,我们继续点击Next按钮

然后就可以配置数据库名字了,这里我们配置成MySQL

点击Next,然后再点击Execute,如图:

系统自动配置MySQL服务器。配置完成后,单击Finish(完成)按钮,弹出新对话框

接下来界面中点击Next之后,出现如下界面:

在这里我们输入之前配置的用户信息,即Yunweijia0909,然后点击Check按钮,就会发现他右上角的Status变成了Connection succeeded,表示连接成功了。确定无误之后,点击Next

新界面中点击Execute

运行完毕之后会出现Finish按钮,点击即可

然后在新界面中点击右下角的Next,出现:

我们的Mysql就安装完成了

五、验证

1、任务管理器

打开任务管理器也会发现有一个mysql.exe的进程,如图:

验证是否安装成功

mysql -uroot -p

MySQL-workbench 安装

MySQL-workbench安装

MySQL 的基本使用

使用 MySQL Workbench

创建数据库

DataType 数据类型:

  1. int 整数
  2. varchar(len) 字符串
  3. tinyint (1) 布尔值

字段的特殊标识:

  • PK(Primary Key) 主键、唯一标识

使用 SQL 管理数据库

什么是 SQL

SQL (英文全称:Structured Query Language) 是结构化查询语言,专门用来访问和处理数据库的编程语言。能够让我们`以编程的形式,操作数据库里面的数据

三个关键点:

  1. SQL 是一门数据库编程语言
  2. 使用 SQL 语言编写出来的代码,叫做 SQL 语句
  3. SQL 语言`只能在关系型数据库中使用(例如:MySQL、Oracle、SQL Server)。非关系型数据库(例如:Mongodb)不支持 SQL 语言

SQL 能做什么

  1. 从数据库中查询数据
  2. 向数据库中插入新的数据
  3. 更新数据库中的数据
  4. 从数据库删除数据
  5. 可以创建新的数据库
  6. 可以在数据库中创建新的表
  7. 可以在数据库中创建存储过程、视图
  8. etc…

SQL 的学习目标

重点掌握如何使用 SQL 从 数据表中:

查询数据(select)、插入数据(insert into)、更新数据(update)、删除数据(delete)

额外需要掌握的 4种 SQL 语法:

where条件and 和 or 运算符order by 排序count(*) 函数

SQL 语法

查询数据:

使用SELECT语句可以从数据表中查询数据,格式如下:

1
2
SELECT * FROM 表名
SELECT column1, column2, ... FROM table_name

其中星号表示返回该表格所有列的信息,也可以选择需要的列进行查询

其中,column1, column2, …为需要查询的列名称,用逗号分隔。table_name 为需要查询的表名。如果要查询所有列,则可以使用 * 通配符代替列名:

插入数据:

使用INSERT INTO语句可以向数据表中插入一条或多条新数据,格式如下:

1
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)

其中,列1, 列2, … 是需要插入的列的名称,VALUES后面则是对应的该行数据

更新数据:

使用UPDATE语句可以更新数据表中已经存在的一行或多行数据,格式如下:

1
UPDATE 表名 SET 列1=值1, 列2=值2, ... WHERE 条件

其中,SET子句指定需要修改的列及其对应的新值,WHERE子句用于限定需要更新的行数

删除数据:

使用DELETE语句可以在数据表中删除一行或多行数据,格式如下:

1
DELETE FROM 表名 WHERE 条件

其中,FROM关键字指定了需要操作的表格名称,WHERE子句用于限定需要删除的行数

WHERE

WHERE 子句用于限定选择的标准。在 SELECTUPDATEDELETE 语句中,皆可使用 WHERE 子句来限定选择的标准

可在 WHERE 子句中使用的运算符

操作符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式

注意:在某些版本的 SQL 中,操作符 <> 可以写为 !=

除此之外,WHERE 子句还支持一些特殊的语法结构,如 IN、LIKE、BETWEEN 等,这些语法结构可以让我们更方便地检索数据。例如:

1
2
3
sql复制代码SELECT * FROM products WHERE category IN ('book', 'movie', 'music')
SELECT * FROM employees WHERE last_name LIKE 'Sm%'
SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31'

以上三条语句分别使用了 IN、LIKE 和 BETWEEN 语法结构进行查询。IN 表示值必须在一个指定的值列表中;LIKE 可以用于模糊匹配查找,% 通配符可以代表任意字符;BETWEEN 表示值必须在一个指定范围内

and 和 or

1
SELECT * FROM employees WHERE gender = 'F' AND salary > 5000

以上语句要求从 employees 表中返回性别为女且工资大于 5000 的员工记录。注意:字符串常量必须用单引号 ' 括起来

SQL中的and和or用于连接多个筛选条件,常常与where条件语句一起使用。当使用and运算符时,只有当两个条件都满足时才能通过筛选;而如果使用or运算符,则只要有一个条件满足即可通过筛选。例如:

1
2
SELECT * FROM student WHERE age >= 18 AND score >= 80
SELECT * FROM student WHERE age >= 18 OR score >= 80

以上两条语句分别查询学生中年龄大于等于18岁且成绩大于等于80分的和学生中年龄大于等于18岁或成绩大于等于80分的

order by 排序

ORDER BY 是用于按照指定条件对结果集进行排序的关键字。该语句可以根据数字、字符串以及日期类型进行排序,还可以指定升序(ASC)或降序(DESC)。例如:

1
SELECT * FROM student ORDER BY score DESC

以上语句返回student表中所有学生的数据,并按照成绩从高到低的顺序进行排序

ORDER BY 子句可以指定多个列来进行排序,实现多重排序的功能。多重排序可按优先级将数据行排序。例如:

1
SELECT * FROM employees ORDER BY department_id, salary DESC

以上语句要求从 employees 表中返回所有员工记录,并首先按照 department_id 字段升序排列,如果 department_id 值相同,则再按照 salary 字段降序排列

在多重排序的情况下,ORDER BY 子句的第一个字段优先级最高,如果它们的值相同,则根据第二个键进行排序,而以此类推,直到排序完为止

那么,如何在 ORDER BY 子句中指定不同的排序规则呢?在 SQL 中,可以使用 ASC 或 DESC 关键字来指定列的排序方式。如果未指定排序方式,默认是按升序(ASC)进行排序。因此,我们通过在列名之后添加 ASC 或 DESC 控制排序方向。在前面的例子中,我们默认了第一个字段 department_id 使用升序排序,而第二个字段 salary 则使用降序排序

count(*) 函数

COUNT(*)是一个聚合函数,用于计算行的总数。例如:

1
SELECT COUNT(*) FROM student

以上语句返回student表中数据行的总数。如果只想计算某一列的非空值的行数,则可以这样写:

1
2
3
SELECT COUNT(column_name) FROM table_name WHERE condition
-- 例如:这里查询表中 所有 status 为 0 的总行数
SELECT COUNT(column_name) FROM table_name WHERE status=0

其中,column_name为需要计算行数的列名,condition为筛选条件

在 SQL 中,可以使用 AS 语句来为查询结果中的列进行重命名。如果你使用了 COUNT(*) 函数来统计表格中所有行数,而想要将统计结果进行重命名,可以按如下的方式写出 SQL 语句:

1
SELECT COUNT(*) AS row_count FROM table_name

以上示例将统计 table_name 表格中所有行的数量,并将其重命名为 row_count 列。当查询结果被返回时,它会含有新命名的列名 row_count。我们还可以使用类似的方式对于其他类型的查询语句中的列进行重命名。例如:

1
SELECT SUM(salary) AS total_salary FROM employee_details WHERE department = 'Marketing'

以上语句将仅返回部门为 Marketing 的 employee_details 表格中工资的总和,并且将其重命名为 total_salary 列。注意,在这个例子中,我们并没有使用 * 通配符来查询所有列,因此只会返回一列

总之,借助 AS 语句,您可以轻松地自定义查询结果集中的列名称,以便更方便地分析和使用

在项目中操作数据库的步骤

项目中引入 mysql

  • 安装操作 MySql 数据库的第三方 (mysql)
  • 通过 mysql 模块连接到 MySql数据库
  • 通过 mysql 模块执行 SQL 语句

在前端的 node.js express 项目中使用 MySQL 数据库,需要通过一些中间件和驱动程序来实现。下面是引入 MySQL 的基本步骤:

安装 mysql2 包

前往终端命令行窗口,进入项目目录,并输入以下命令安装 mysql2 包:

1
npm install mysql2 --save

这将在您的项目中添加 mysql2 获取包及其依赖项

创建 MySQL 连接池

连接池用于维护一个到数据库的长期连接,提高性能和效率。下面的示例展示了如何创建连接池:

1
2
3
4
5
6
7
8
9
10
// 1. 导入 mysql 模块
const mysql = require('mysql2')
// 2. 建立于 MySQL 数据库的连接
const pool = mysql.createPool({
host: 'localhost', // 数据库的 IP 地址
user: 'your_mysql_username', // 登录数据库的账号
password: 'your_mysql_password', // 登录数据库的密码
database: 'your_mysql_name',// 指定要操作哪个数据库
connectionLimit: 10
})

上述代码定义了要连接数据库的配置信息,其中包括主机地址、用户名、密码、数据库名称和连接池的最大连接数

执行 SQL 查询语句

现在已经建立了与 MySQL 数据源的连接,并指定了以后在进行查询时要使用的连接池,让我们看一下如何执行 SELECT 查询操作,并将结果返回给客户端:

1
2
3
4
5
6
7
8
9
10
11
const sql = 'SELECT * FROM users'
pool.query(sql, (err, results, fields) => {
if (err) throw err
console.log(results)
})
/* results: [
RowDataPacket { id: 1, name: '张三', password: '111', status: '1' },
RowDataPacket { id: 2, name: '李四', password: '222', status: '1' },
RowDataPacket { id: 3, name: '王五', password: '333', status: '0' },
RowDataPacket { id: 4, name: '陈六', password: '444', status: '0' }
] */

上述代码将执行一个 SELECT 查询,从名为 users 的数据表中返回所有行,然后将结果打印出来。注意,这个示例假定你的数据库已经包含一个 users

在 Express 开发中,通常要更复杂地使用 MySQL 数据库,例如实现 CRUD 操作。因此,您可能需要添加一些额外的代码和模块以便于与数据库进行交互

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 1. 导入数据库
const mysql = require('mysql')
// 2. 配置数据库
const pool = mysql.createPool({
host: '127.0.0.1', // 数据库的 IP 地址
user: 'root', // 登录数据库的账号
password: 'Lp17762682464', // 登录数据库的密码
database: 'admin123', // 指定要操作哪个数据库
connectionLimit: 10
})

const sql = 'select * from admin123'

// 检测 MySQL 是否能够正常工作
pool.query('SELECT 1',(err,res,fields)=>{
if(err) throw err
console.log(res)
})

使用mysql操作MySQL数据库

查询数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 1. 导入数据库
const mysql = require('mysql')
// 2. 配置数据库
const pool = mysql.createPool({
host: '127.0.0.1', // 数据库的 IP 地址
user: 'root', // 登录数据库的账号
password: 'Lp17762682464', // 登录数据库的密码
database: 'admin123', // 指定要操作哪个数据库
connectionLimit: 10
})

const sql = 'select * from users'

// 检测 MySQL 是否能够正常工作
pool.query(sql,(err,res,fields)=>{
if(err) throw err
console.log(res)
})
/* results: [
RowDataPacket { id: 1, name: '张三', password: '111', status: '1' },
RowDataPacket { id: 2, name: '李四', password: '222', status: '1' },
RowDataPacket { id: 3, name: '王五', password: '333', status: '0' },
RowDataPacket { id: 4, name: '陈六', password: '444', status: '0' }
] */

插入数据

向 users 表中新增数据,其中

通过 node.js 中的 mysql2 或 mysql 模块,您可以从应用程序扩展到 MySQL 数据库。下面是如何使用 mysql2 模块插入数据到 MySQL 数据库的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const mysql = require('mysql2')
const pool = mysql.createPool({
host: 'localhost', // 数据库的 IP 地址
user: 'root', // 登录数据库的账号
password: 'Lp17762682464', // 登录数据库的密码
database: 'admin123', // 指定要操作哪个数据库
connectionLimit: 10
})

pool.getConnection((err, connection) => {
if (err) throw new Error(err)
const data = { age: 25, email: 'john@example.com' }
connection.query('INSERT INTO users SET ?', data, (err, result) => {
if (err) throw new Error(err)
console.log(result.affectedRows)
connection.release()
})
})

上述代码中,我们首先通过 createPool 方法创建了一个连接池,并在获取到连接后使用 query 方法向 users 表格中插入了一行数据。注意,我们将待插入的数据定义为一个包含 'age''email' 两个字段的 Javascript 对象,并作为第二个参数传递给 query 方法。在这里,我们假设 users 表格有一个自增的 id 字段

query 回调函数中,我们可以检查插入是否成功,并使用 release 方法将连接释放回连接池。值得注意的是,如果我们不显式释放连接,则它会一直占用资源,直到达到连接数限制

在实际项目中,您可能需要执行更复杂的插入操作,例如在事务中执行多个插入操作。但是,基本的插入操作可以使用类似上述代码的方法轻松地实现