add: 数据库的基础知识

This commit is contained in:
qianguyihao
2020-04-20 10:16:01 +08:00
parent 6fbb5659e4
commit d6d617bf77
44 changed files with 170 additions and 2 deletions

View File

@@ -0,0 +1,105 @@
## 数据库的概念
**数据库**databaseDB是一种存储数据的仓库。具有如下特性
- 数据库是根据数据结构组织、存储和管理数据。
- 数据库能够长期、高效的管理和存储数据。
- 数据库的目的就是能够存储(写)和提供(读)数据。
## 数据库分类
数据库分为两类:
- **关系型数据库**:把复杂的数据结构归结为简单的二元关系,即二维表格形式(二维表)。注重数据存储的持久性。
- **非关系型数据库**:没有具体模型的数据结构。英文简称 NoSQLNot Only SQL ),意为"不仅仅是SQL"。注重数据读取的效率。
我们具体来看看。
### 1、关系型数据库
**关系型数据库**:把复杂的数据结构归结为简单的二元关系,即二维表格形式(二维表)。
关系型数据库有四层结构:
- 数据库管理系统DBMSDataBase Management System。
- 数据库DB数据存储的管理者。
- 数据表Table数据关系管理者。
- 数据字段Field实际数据存储者。
常见的关系型数据库产品:
- 大型Oracle
- 中型MySQL、SQL Server
- 小型Sybase、Access
### 2、非关系型数据库
**非关系型数据库**:没有具体模型的数据结构。英文简称 NoSQLNot Only SQL ),意为"不仅仅是SQL"。
常见的非关系型数据库产品MongoDB、Redis、Memcached。
## SQL 的介绍
**SQL**:全称 **Structured Query Language**,译为**结构化查询语言**。
**SQL**:是一种针对关系型数据库的标准化编程语言,能够实现用户数据库的查询和程序设计。
通俗来讲,**SQL 是关系型数据库的操作指令**。
根据操作类型不同SQL 可分为几类:
* DQLData Query Language数据查询语言用于查询和检索数据
* DMLData Manipulation Language数据操作语言用于数据的写操作增删改
* DDLData Definition Language数据定义语言用于创建数据结构
* DCLData Control Language数据控制语言用于用户权限管理
* TPLTransaction 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 指令开始操作数据库。

View File

@@ -0,0 +1,89 @@
## MySQL 安装
### MySQLMac版
### 步骤1、下载安装包并安装
MySQL 下载地址https://dev.mysql.com/downloads/mysql/
![](https://github.com/qianguyihao/Web/blob/master/img/20200415_1707.png)
![](https://github.com/qianguyihao/Web/blob/master/img/20200415_1708.png)
#### 步骤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」然后选择如下配置即可在本地新建一个数据库连接
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1157.png)
2、选中连接后右键新建数据库
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1159.png)
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1127.png)
3、选中数据库之后新建表 `qiangu_student_table`
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1138.png)
4、在表中添加字段
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1202.png)
5、字段建好后开始在表中插入数据
![](https://github.com/qianguyihao/Web/blob/master/img/20200416_1259.png)
### 导入外部 sql 文件
在 Navicat中选中当前 database 之后右键选择“运行sql文件”即可导入外部sql文件。

View File

@@ -0,0 +1,280 @@
## MySQL 的一些简单命令
我们可以在 Navicat Premium 软件中,创建数据库和表,然后输入查询命令来查询数据。选择菜单栏「查询->新建查询->输入 sql 命令->运行」即可,效果如下:
![](https://github.com/qianguyihao/Web/blob/master/img/20200417_1750.png)
我们还可以直接在终端输入命令行来操作。
注意,在 Mac 终端执行 sql 命令时,命令的末尾必须加上`;`(英文格式的分号)。效果如下:
![](https://github.com/qianguyihao/Web/blob/master/img/20200417_1700.png)
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 2030
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;
```
查询结果:
![](https://github.com/qianguyihao/Web/blob/master/img/20200418_2300.png)
上面这种查询,没有意义,因为没有加任何查询条件。
**情况 1**inner join
```sql
SELECT * FROM author INNER JOIN book ON author.authorId = book.authorId;
```
查询结果:
![](https://github.com/qianguyihao/Web/blob/master/img/20200418_2305.png)
上面这行命令,跟下面这行命令等价:
```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;
```
查询结果:
![](https://github.com/qianguyihao/Web/blob/master/img/20200418_2310.png)
**情况 3**right join
```sql
SELECT * FROM author RIGHT JOIN book ON author.authorId = book.authorId;
```
查询结果:
![](https://github.com/qianguyihao/Web/blob/master/img/20200418_2315.png)
### 参考链接
- [Mysql 联表查询](https://blog.csdn.net/qmhball/article/details/8000003)
## 自关联查询
涉及到层级关系时可以用自关联查询。
## 子查询
当一个查询结果是另一个查询的条件时,这个查询称之为子查询。

View File

@@ -0,0 +1,38 @@
## 前言
范式即规范。MySQL 范式的作用是:
- 让我们建的表更佳简洁和高效。
- 让功能独立化,避免耦合。
## MySQL 设计三大范式
### 第一范式1NF原子性
表的每一列具有原子性,不可再分。
### 第二范式:唯一性
第二范式是建立在第一范式基础上的;外要求所有非主键字段必须完全依赖主键,而不是部分依赖。
### 第三范式
第三范式是建立在第二范式基础上的;且要求没有传递依赖。
## 参考链接
- [MySql--数据库设计三范式](https://www.jianshu.com/p/3e97c2a1687b)

View File

@@ -0,0 +1,11 @@
## 事务语句
- 开启begin
- 提交commit
- 回滚rollback