add: 数据库的基础知识
This commit is contained in:
105
10-Node.js和数据库/MySQL数据库/01-数据库的基础知识.md
Normal file
105
10-Node.js和数据库/MySQL数据库/01-数据库的基础知识.md
Normal file
@@ -0,0 +1,105 @@
|
||||
|
||||
## 数据库的概念
|
||||
|
||||
**数据库**:database(DB),是一种存储数据的仓库。具有如下特性:
|
||||
|
||||
- 数据库是根据数据结构组织、存储和管理数据。
|
||||
- 数据库能够长期、高效的管理和存储数据。
|
||||
- 数据库的目的就是能够存储(写)和提供(读)数据。
|
||||
|
||||
## 数据库分类
|
||||
|
||||
数据库分为两类:
|
||||
|
||||
- **关系型数据库**:把复杂的数据结构归结为简单的二元关系,即二维表格形式(二维表)。注重数据存储的持久性。
|
||||
|
||||
- **非关系型数据库**:没有具体模型的数据结构。英文简称 NoSQL(Not Only SQL ),意为"不仅仅是SQL"。注重数据读取的效率。
|
||||
|
||||
我们具体来看看。
|
||||
|
||||
### 1、关系型数据库
|
||||
|
||||
**关系型数据库**:把复杂的数据结构归结为简单的二元关系,即二维表格形式(二维表)。
|
||||
|
||||
关系型数据库有四层结构:
|
||||
|
||||
- 数据库管理系统(DBMS):DataBase Management System。
|
||||
|
||||
- 数据库(DB):数据存储的管理者。
|
||||
|
||||
- 数据表(Table):数据关系管理者。
|
||||
|
||||
- 数据字段(Field):实际数据存储者。
|
||||
|
||||
常见的关系型数据库产品:
|
||||
|
||||
- 大型:Oracle
|
||||
|
||||
- 中型:MySQL、SQL Server
|
||||
|
||||
- 小型:Sybase、Access
|
||||
|
||||
|
||||
### 2、非关系型数据库
|
||||
|
||||
**非关系型数据库**:没有具体模型的数据结构。英文简称 NoSQL(Not Only SQL ),意为"不仅仅是SQL"。
|
||||
|
||||
常见的非关系型数据库产品:MongoDB、Redis、Memcached。
|
||||
|
||||
|
||||
|
||||
## SQL 的介绍
|
||||
|
||||
**SQL**:全称 **Structured Query Language**,译为**结构化查询语言**。
|
||||
|
||||
**SQL**:是一种针对关系型数据库的标准化编程语言,能够实现用户数据库的查询和程序设计。
|
||||
|
||||
通俗来讲,**SQL 是关系型数据库的操作指令**。
|
||||
|
||||
根据操作类型不同,SQL 可分为几类:
|
||||
|
||||
|
||||
* DQL:Data Query Language,数据查询语言,用于查询和检索数据
|
||||
* DML:Data Manipulation Language,数据操作语言,用于数据的写操作(增删改)
|
||||
* DDL:Data Definition Language,数据定义语言,用于创建数据结构
|
||||
* DCL:Data Control Language,数据控制语言,用于用户权限管理
|
||||
* TPL:Transaction Process Language,事务处理语言,辅助DML进行事务操作(因此也归属于DML)
|
||||
|
||||
|
||||
补充:
|
||||
|
||||
- SQL 虽然是编程语言,但通常只用来进行数据管理,逻辑部分交给其他编程语言。
|
||||
|
||||
- SQL 是针对关系型数据库的**通用语言**,所有关系型数据库都是基于SQL进行数据操作;而不同的数据库产品,在 SQL 操作指令上略有差异。
|
||||
|
||||
|
||||
|
||||
## MySQL 的介绍
|
||||
|
||||
### MySQL 数据库介绍
|
||||
|
||||
MySQL 是很有名的 关系型数据库产品,由瑞典MySQL AB 公司开发,现在属于 Oracle 旗下产品。
|
||||
|
||||
MySQL 在 2008 年被 Sun 公司以10亿美金所收购,而 Sun 公司在2009年被 Oracle 甲骨文公司收购。
|
||||
|
||||
MySQL 开源免费。
|
||||
|
||||
### MySQL 访问原理
|
||||
|
||||
MySQL是一种C/S结构的软件,因此我们需要安装 MySQL 的客户端来访问远程的服务端。也就是说,数据是存放在服务器上的,客户端通过执行 sql 指令来操作服务端的数据。
|
||||
|
||||
具体步骤是:
|
||||
|
||||
(1)客户端通过 主机(host) + 端口号(port) 服务端。
|
||||
|
||||
(2)输入 username 和 password 验证身份。
|
||||
|
||||
(3)客户端和服务端连接成功,通过 sql 指令开始操作数据库。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
89
10-Node.js和数据库/MySQL数据库/MySQL数据库的安装和Navicat使用.md
Normal file
89
10-Node.js和数据库/MySQL数据库/MySQL数据库的安装和Navicat使用.md
Normal file
@@ -0,0 +1,89 @@
|
||||
## MySQL 安装
|
||||
|
||||
### MySQL(Mac版)
|
||||
|
||||
### 步骤1、下载安装包并安装:
|
||||
|
||||
MySQL 下载地址:https://dev.mysql.com/downloads/mysql/
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### 步骤2、配置环境变量
|
||||
|
||||
打开 `~/.bash_profile` 文件,在文件的末尾,添加如下内容,即可配置环境变量:
|
||||
|
||||
```bash
|
||||
# mysql
|
||||
export PATH=${PATH}:/usr/local/mysql/bin
|
||||
#快速启动、结束MySQL服务, 可以使用alias命令
|
||||
alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start'
|
||||
alias mysqlstop='sudo /usr/local/mysql/support-files/mysql.server stop'
|
||||
```
|
||||
|
||||
配置好环境变量后,在终端输入 `source ~/.bash_profile` 命令,让配置生效。
|
||||
|
||||
在终端的任何位置,输入如下命令,即可进入 mysql 命令的执行窗口:
|
||||
|
||||
```sql
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
参考链接:
|
||||
|
||||
- [MySQL安装(Mac版)](https://juejin.im/post/5cc2a52ce51d456e7079f27f)
|
||||
|
||||
### 步骤3、继续配置环境变量
|
||||
|
||||
在 `~/.bash_profile` 中配置好环境变量后,发现每次重启终端后,配置都会失效,需要重新执行 `source ~/.bash_profile` 命令。
|
||||
|
||||
原因是,zsh加载的是 `~/.zshrc`文件,而 `.zshrc` 文件中并没有定义任务环境变量。
|
||||
|
||||
解决办法:打开 `~/.zshrc` 文件,在文件的末尾,添加如下内容即可:
|
||||
|
||||
```bash
|
||||
source ~/.bash_profile
|
||||
```
|
||||
|
||||
参考链接:<https://blog.csdn.net/science_Lee/article/details/79214127>
|
||||
|
||||
## Navicat Premium 软件初体验
|
||||
|
||||
Navicat Premium 软件是一种数据库管理的GUI软件,采用可视化的方式来查看和操作数据库,非常方便。支持的数据库有: MySQL、MongoDB、SQL Server、SQLite、Oracle 及 PostgreSQL等。
|
||||
|
||||
安装好 Navicat Premium 软件之后,我们来看看这个软件是怎么用的。
|
||||
|
||||
### 新建表和数据
|
||||
|
||||
1、新建连接:
|
||||
|
||||
打开 Navicat Premium 软件,选择菜单栏「文件-新建连接-mysql」,然后选择如下配置,即可在本地新建一个数据库连接:
|
||||
|
||||

|
||||
|
||||
2、选中连接后,右键新建数据库:
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
3、选中数据库之后,新建表 `qiangu_student_table`:
|
||||
|
||||

|
||||
|
||||
4、在表中添加字段:
|
||||
|
||||

|
||||
|
||||
5、字段建好后,开始在表中插入数据:
|
||||
|
||||

|
||||
|
||||
### 导入外部 sql 文件
|
||||
|
||||
在 Navicat中,选中当前 database 之后,右键选择“运行sql文件”,即可导入外部sql文件。
|
||||
|
||||
|
||||
|
||||
280
10-Node.js和数据库/MySQL数据库/MySQL数据库的常用命令.md
Normal file
280
10-Node.js和数据库/MySQL数据库/MySQL数据库的常用命令.md
Normal file
@@ -0,0 +1,280 @@
|
||||
## MySQL 的一些简单命令
|
||||
|
||||
我们可以在 Navicat Premium 软件中,创建数据库和表,然后输入查询命令来查询数据。选择菜单栏「查询->新建查询->输入 sql 命令->运行」即可,效果如下:
|
||||
|
||||

|
||||
|
||||
我们还可以直接在终端输入命令行来操作。
|
||||
|
||||
注意,在 Mac 终端执行 sql 命令时,命令的末尾必须加上`;`(英文格式的分号)。效果如下:
|
||||
|
||||

|
||||
|
||||
MySQL 命令行的一些简单命令如下。
|
||||
|
||||
**以 root 身份进入命令行**:
|
||||
|
||||
```
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
**查看有哪些数据库**:
|
||||
|
||||
```sql
|
||||
show databases;
|
||||
```
|
||||
|
||||
**选择进入指定的数据库**:
|
||||
|
||||
```sql
|
||||
use xxx_database;
|
||||
|
||||
# 举例
|
||||
use qianguyihao_database;
|
||||
```
|
||||
|
||||
**在当前数据库中,查看有哪些表**:
|
||||
|
||||
```sql
|
||||
show tables;
|
||||
```
|
||||
|
||||
**在当前数据库中,查询指定表的全部数据**:
|
||||
|
||||
```sql
|
||||
SELECT * FROM xxx_table;
|
||||
|
||||
# 举例
|
||||
SELECT * FROM qianguyihao_student_table
|
||||
```
|
||||
|
||||
**删除指定的表**:
|
||||
|
||||
```sql
|
||||
drop table xxx;
|
||||
|
||||
# 举例
|
||||
drop table qianguyihao_student_table;
|
||||
```
|
||||
|
||||
**删除指定的数据库**:
|
||||
|
||||
```sql
|
||||
drop database qianguyihao_student_table;
|
||||
```
|
||||
|
||||
**创建一个数据库**:
|
||||
|
||||
```sql
|
||||
create database qianguyihao_database2;
|
||||
```
|
||||
|
||||
## where 条件查询
|
||||
|
||||
使用 `where` 子句可以对表中的数据进行筛选,结果为 true 的行会出现在查询结果中。
|
||||
|
||||
语法格式如下:
|
||||
|
||||
```sql
|
||||
SELECT * FROM 表名 where 条件;
|
||||
```
|
||||
|
||||
上面的语法格式中,`条件` 具体要怎么写呢?这个可能有很多种情况。我们继续往下看。
|
||||
|
||||
### 比较运算符
|
||||
|
||||
- `=` 等于
|
||||
- `>` 大于
|
||||
- `>=` 大于等于
|
||||
- `<` 小于
|
||||
- `<=` 小于等于
|
||||
- `!=`:不等于
|
||||
- `age > 20`:查询 age 大于 30 的数据
|
||||
|
||||
**举例**:
|
||||
|
||||
```sql
|
||||
# 查询 age 大于 20 的数据
|
||||
SELECT * FROM qianguyihao_table WHERE age > 20;
|
||||
```
|
||||
|
||||
### 逻辑运算符
|
||||
|
||||
- AND
|
||||
|
||||
- OR
|
||||
|
||||
- NOT
|
||||
|
||||
**举例**:
|
||||
|
||||
```sql
|
||||
# 查询 age 在20至30之间的数据
|
||||
SELECT * FROM qianguyihao_table WHERE age BETWEEN 20 AND 30;
|
||||
|
||||
```
|
||||
|
||||
### 范围查询
|
||||
|
||||
- `in` 表示在一个非连续的范围内。
|
||||
|
||||
- `between ... and ...` 表示在一个连续的范围内
|
||||
|
||||
举例:
|
||||
|
||||
```sql
|
||||
# 查询 name 为 千古壹号 或者 许嵩的数据
|
||||
SELECT * FROM qianguyihao_table WHERE name IN ['千古壹号', '许嵩'];
|
||||
|
||||
SELECT * FROM qianguyihao_table WHERE age BETWEEN 20 AND 30;
|
||||
```
|
||||
|
||||
### 模糊查询
|
||||
|
||||
- `like`
|
||||
- `%` 表示任意多个任意字符
|
||||
- `_` 表示一个任意字符
|
||||
|
||||
`%` 符号举例:
|
||||
|
||||
```sql
|
||||
# 查询标题中包含“前端”这两个字的数据(“前端”这两个字的前后可能都有内容)
|
||||
select * from qianguyihao_table where `title` like "%前端%";
|
||||
|
||||
# 查询标题以“前端”开头的数据
|
||||
select * from qianguyihao_table where `title` like "前端%";
|
||||
|
||||
```
|
||||
|
||||
`_`符号举例:
|
||||
|
||||
```sql
|
||||
# 查询标题,查询条件是:标题中至少有五个字符,而且,这五个字符中,前两个字符一定是“千古”开头的。
|
||||
SELECT * FROM qianguyihao_table WHERE `title` LIKE "千古___";
|
||||
```
|
||||
|
||||
### NULL 的判断
|
||||
|
||||
- `is null` 判断为空
|
||||
|
||||
- `is not null` 判断为非空
|
||||
|
||||
注意,`is null` 和**空字符串**`""` 是有区别的。学过 js 基础之后,你应该知道:空字符串并非 null,只不过是里面的值为空而已;空字符串也是会占有内存空间的。
|
||||
|
||||
举例:
|
||||
|
||||
```sql
|
||||
select * from qianguyihao_table where name is not NULL;
|
||||
|
||||
```
|
||||
|
||||
## join 联表查询
|
||||
|
||||
### 联表查询命令
|
||||
|
||||
- `tableA inner join tableB`:表 A 与表 B 匹配的行会出现在结果中。
|
||||
|
||||
- `tableA left join tableB`:表 A 与表 B 匹配的行会出现在结果中。表 A 中独有的数据,对应表 B 中用 null 填充。
|
||||
|
||||
- `tableA right join tableB`:表 A 与表 B 匹配的行会出现在结果中。表 B 中独有的数据,对应表 A 中用 null 填充。
|
||||
|
||||
光是这样看,不好理解,我们来举个例子。
|
||||
|
||||
### 举例
|
||||
|
||||
现在有下面这两张表:作者表 author、图书表 book。
|
||||
|
||||
**表 1**、作者表 author:
|
||||
|
||||
| id | authorId | authorName |
|
||||
| :-- | :------- | :--------- |
|
||||
| 1 | 11 | 王小波 |
|
||||
| 2 | 12 | 吴军 |
|
||||
| 3 | 88 | 千古壹号 |
|
||||
|
||||
**表 2**、图书表 book:
|
||||
|
||||
| id | bookId | bookName | authorId |
|
||||
| :-- | :----- | :--------- | -------- |
|
||||
| 1 | 201 | 黄金时代 | 11 |
|
||||
| 2 | 202 | 白银时代 | 11 |
|
||||
| 3 | 203 | 青铜时代 | 11 |
|
||||
| 4 | 204 | 浪潮之巅 | 12 |
|
||||
| 5 | 205 | 硅谷之谜 | 12 |
|
||||
| 6 | 206 | 数学之美 | 12 |
|
||||
| 7 | 777 | 设计心理学 | 99 |
|
||||
|
||||
注意,表2中的每本图书都有对应的 authorId,这个 authorId 就是对应表1中的 authorId。**通过 authorId 把两张表关联起来**。
|
||||
|
||||
通过联表查询上面的两张表,我们来对比一下查询结果。
|
||||
|
||||
**情况 0**:(inner join)
|
||||
|
||||
```sql
|
||||
SELECT * FROM author INNER JOIN book;
|
||||
```
|
||||
|
||||
查询结果:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
上面这种查询,没有意义,因为没有加任何查询条件。
|
||||
|
||||
**情况 1**:(inner join)
|
||||
|
||||
```sql
|
||||
SELECT * FROM author INNER JOIN book ON author.authorId = book.authorId;
|
||||
```
|
||||
|
||||
查询结果:
|
||||
|
||||

|
||||
|
||||
|
||||
上面这行命令,跟下面这行命令等价:
|
||||
|
||||
```sql
|
||||
SELECT * FROM author, book WHERE author.authorId = book.authorId;
|
||||
```
|
||||
|
||||
**情况 2**:(left join)
|
||||
|
||||
```sql
|
||||
SELECT * FROM author LEFT JOIN book ON author.authorId = book.authorId;
|
||||
```
|
||||
|
||||
查询结果:
|
||||
|
||||

|
||||
|
||||
**情况 3**:(right join)
|
||||
|
||||
```sql
|
||||
SELECT * FROM author RIGHT JOIN book ON author.authorId = book.authorId;
|
||||
```
|
||||
|
||||
查询结果:
|
||||
|
||||

|
||||
|
||||
### 参考链接
|
||||
|
||||
- [Mysql 联表查询](https://blog.csdn.net/qmhball/article/details/8000003)
|
||||
|
||||
|
||||
## 自关联查询
|
||||
|
||||
涉及到层级关系时可以用自关联查询。
|
||||
|
||||
|
||||
## 子查询
|
||||
|
||||
当一个查询结果是另一个查询的条件时,这个查询称之为子查询。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
38
10-Node.js和数据库/MySQL数据库/MySQL设计三大范式.md
Normal file
38
10-Node.js和数据库/MySQL数据库/MySQL设计三大范式.md
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
## 前言
|
||||
|
||||
范式即规范。MySQL 范式的作用是:
|
||||
|
||||
- 让我们建的表更佳简洁和高效。
|
||||
|
||||
- 让功能独立化,避免耦合。
|
||||
|
||||
## MySQL 设计三大范式
|
||||
|
||||
### 第一范式(1NF):原子性
|
||||
|
||||
表的每一列具有原子性,不可再分。
|
||||
|
||||
### 第二范式:唯一性
|
||||
|
||||
第二范式是建立在第一范式基础上的;外要求所有非主键字段必须完全依赖主键,而不是部分依赖。
|
||||
|
||||
|
||||
### 第三范式
|
||||
|
||||
第三范式是建立在第二范式基础上的;且要求没有传递依赖。
|
||||
|
||||
|
||||
## 参考链接
|
||||
|
||||
- [MySql--数据库设计三范式](https://www.jianshu.com/p/3e97c2a1687b)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
11
10-Node.js和数据库/MySQL数据库/事务.md
Normal file
11
10-Node.js和数据库/MySQL数据库/事务.md
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
## 事务语句
|
||||
|
||||
- 开启:begin
|
||||
|
||||
- 提交:commit
|
||||
|
||||
- 回滚:rollback
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user