---
# System prepended metadata

title: MySQL
tags: [DataBase, learn]

---

###### tags: `learn` `DataBase`

# MySQL

首先， 命令行连接至mysql方式和linux相同：
```
mysql -u 用户名 -p密码
```
**我在第一次尝试使用命令行时候失败了！为什么呢？**
> 因为你需要事先将mysql路径添加入环境变量阿混蛋！


---

## 总体结构

![](https://i.imgur.com/9QJNzE3.png)
![](https://i.imgur.com/sfrow6Y.png)
![](https://i.imgur.com/jCQOXEB.png)


---

## 操作指令

### 数据库相关： database

#### 创建数据库：CREATE
![](https://i.imgur.com/rqiEVEH.png)
```
CREATE DATABASE mine_03 character set utf8 collate utf8_bin；
```
#### 查看，删除数据库：SHOW , DROP
![](https://i.imgur.com/K5MBimQ.png)
> 注：有时候创建的数据库名字若是内置量名，则会报错，比如我不能直接：
> CREATE DATABASE INT
> 这样就报错。但是如果加上反引号‘ ’就可以成功创建！



#### 备份/恢复数据库：mysqldump与source

![](https://i.imgur.com/1G3CSmM.png)
![](https://i.imgur.com/aWUPl5P.png)
![](https://i.imgur.com/9QpnndI.png)
> 实际上-B 不用写！！！
> 在这里我遇到一个问题，就是我在sql命令行里疯狂地报错！
> 但是实际上**备份根本就不是在sql命令行进行！是在dos命令行进行**！！！！！
恢复相对简单。在 mysql命令行执行即可。

![](https://i.imgur.com/x79MCK1.png)


---

### 单表相关

#### 创建表

![](https://i.imgur.com/1tFuAnl.png)
> 自己使用命令行创建了密码表！

![](https://i.imgur.com/B7NIzg4.png)

##### Mysql数据库常用的数据类型！（重要）

![](https://i.imgur.com/5XZY2P5.png)


![](https://i.imgur.com/CtbkGHF.png)
![](https://i.imgur.com/Ms5vKfZ.png)
> 其中用的比较多的：
    > 整数：int
    > 小数：double, decimal（精度较高）
    > 文本：char, varchar
    > 日期：datetime



---

1. 整型

![](https://i.imgur.com/orQr0uq.png)
**注意， 整型若不指定unsigned， 则默认有符号！！！（也就是说会少一位来存符号！）**
![](https://i.imgur.com/Mo7Fe0K.png)


![](https://i.imgur.com/LQXfYaN.png)
> 创建一个test数据库用于测试！看看tinyint是否真的只存到这么大。
![](https://i.imgur.com/HRa4qAn.png)
> 可以发现！超出范围，也就是说确实范围是被限制住了！


---

2. 小数类型

![](https://i.imgur.com/LbiJo7s.png)

> 例： 创建一个表来看看double和decimal对付长位数小数！
> ![](https://i.imgur.com/v38Vir7.png)
> ![](https://i.imgur.com/uuhC1H5.png)
> 可以很明显看出来， decimal这边给我没满20位的地方全部补上了0！！！！很棒，精度够高。


---

3. 字符串类型

![](https://i.imgur.com/ofRWRop.png)
> **注意，varchar虽然最长65535个字节，我们却不能填写65535！ 为什么呢？因为我们需要最大三个字节去记录我们字符串的大小！！！！）**
> 由于utf8是三个字节表示一个字符，所以如果是utf8就是最大21844个字符！
![](https://i.imgur.com/GcnIHsu.png)


---


##### 字符串使用细节

![](https://i.imgur.com/nlJLSF0.png)
> 上面也有提及，varchar是变长，而且我们输入的长度是字符长度，不是字节长度，要换算成字节后小于65532（比如，utf8 则乘以3因为是3字节为1字符；gbk则乘以2）
![](https://i.imgur.com/sRwmsK8.png)


---

![](https://i.imgur.com/iiNEg19.png)
> 所以说varchar和char不同在于：它是可变长！
> 可变长体现在哪里？
    > 1. 创建时最大长度虽是65535字节，但会根据编码类型而变为不等长的字符（比如，utf8 则乘以3因为是3字节为1字符所以utf8最长是21844；gbk则乘以2所以最长为32766）
    > 2. 插入数据的时候，若数据长度没达到最大长度，多余空间除去1-3字节存放长度信息外，是可以分出去再利用的；而char就算未满最大长度，多余空间也会被占掉。


---

![](https://i.imgur.com/wUyKCXW.png)
> char的优点：查询快！

---
![](https://i.imgur.com/EWPqlLj.png)
![](https://i.imgur.com/5kWeqqR.png)


---

4. 日期类型

![](https://i.imgur.com/V5pJNLq.png)

> 案例： 创建一个试试
> ![](https://i.imgur.com/wAm2G6T.png)
> ![](https://i.imgur.com/DnefqdC.png)
> 发现，时间戳不需要我们手动计入，会自动更新！！！！
> （这玩意儿用在记录我的消费记录或者密码记录之类的应该很有用！）


---

##### 练习

![](https://i.imgur.com/cFogfz5.png)

我的代码：
![](https://i.imgur.com/ghGeaBm.png)
![](https://i.imgur.com/99odfNl.png)


---

#### 修改表

![](https://i.imgur.com/TfI5je5.png)

应用：
![](https://i.imgur.com/aSEHsTf.png)

> 我的
> 0.![](https://i.imgur.com/OVvz7eP.png)
>
> 1.![](https://i.imgur.com/YBqRQq3.png)
>
> 2.![](https://i.imgur.com/Jj29sHq.png)
>
> 3.![](https://i.imgur.com/hrU3sUY.png)
>
> 4.![](https://i.imgur.com/uHOCK40.png)
>
> 5.![](https://i.imgur.com/7qoGtJ9.png)
>
> 6.![](https://i.imgur.com/lB2nHPt.png)

> check：![](https://i.imgur.com/ep7GIhX.png)



老韩答案：
![](https://i.imgur.com/7e9FecA.png)
![](https://i.imgur.com/3xOV6Q9.png)

---


#### 数据库的CRUD


![](https://i.imgur.com/IaKkVwF.png)

##### insert语句

![](https://i.imgur.com/bXvPivW.png)

案例：在这个基础上我加了一个add_time自动记录加入数据时间！（很有用感觉hhh）
![](https://i.imgur.com/CHnzrVW.png)

> my code
> ![](https://i.imgur.com/NRQZ9i2.png)
> ![](https://i.imgur.com/bHvtGIb.png)
> ![](https://i.imgur.com/n9mmH4d.png)


##### insert的注意事项

![](https://i.imgur.com/GM5nJu2.png)
![](https://i.imgur.com/NBz63B5.png)
![](https://i.imgur.com/1QsAYXA.png)


---

##### update语句

![](https://i.imgur.com/6XA3TKf.png)
![](https://i.imgur.com/FYkFSbD.png)


> 并未使用他的案例，而是把自己的拿来随便试试。
> my code：
> ![](https://i.imgur.com/CSCbSiP.png)
> ![](https://i.imgur.com/pSZ5bqc.png)


---

##### delete语句

![](https://i.imgur.com/Lmjif7Q.png)
![](https://i.imgur.com/vK69siw.png)
> 不写后面的where语句则会将表全部删除！！！要删除某一列还是用alter！！
> ![](https://i.imgur.com/e78UHv3.png)


案例实现：先加入老妖怪记录再删除！！

![](https://i.imgur.com/I2sUC4r.png)
![](https://i.imgur.com/Yyf93d1.png)


---

##### select语句

![](https://i.imgur.com/F5NDpw7.png)


尝试自己做个student表玩玩
![](https://i.imgur.com/DQBMEXe.png)
![](https://i.imgur.com/YwzKuWN.png)
![](https://i.imgur.com/efMIwBA.png)
![](https://i.imgur.com/44sDKHQ.png)
![](https://i.imgur.com/Whfkc6b.png)

**开始提升**
![](https://i.imgur.com/GDvi3sz.png)

![](https://i.imgur.com/vSD1Vmh.png)

> my code：
> 1.![](https://i.imgur.com/N4u4jP8.png)
> 
> 2.![](https://i.imgur.com/xgaT6Uz.png)
> 
> 3.前两步都用了别名！
> 
> 课后很简单没什么搞的必要哈。

![](https://i.imgur.com/m7tiyPc.png)

![](https://i.imgur.com/jkOLOQq.png)


> my code：
> 因为数据不同，只是用差不多形式搞了下课后那几个（也就是条件查找）
> ![](https://i.imgur.com/5xs1LFv.png)
> 
> ![](https://i.imgur.com/5oYA8AP.png)
> 
> ![](https://i.imgur.com/RZ3s7Up.png)

![](https://i.imgur.com/YGQAldY.png)

> ![](https://i.imgur.com/OSK6Fyc.png)


---

### 函数

#### 统计函数
![](https://i.imgur.com/DZfycgg.png)

![](https://i.imgur.com/Se4kNIr.png)
> 也就是说 count(*)是不会排除null的！！！！！


![](https://i.imgur.com/RdGaB0P.png)
![](https://i.imgur.com/3Num3Pn.png)
> 另外同理还有max 和 min函数等！就不写啦！


---


#### select中的过滤/分组函数 groupby

![](https://i.imgur.com/fMxfnA4.png)
![](https://i.imgur.com/p5YyyNK.png)

![](https://i.imgur.com/l9NN3Nb.png)


---

#### 字符串函数

![](https://i.imgur.com/jtTmMLq.png)

示例：
![](https://i.imgur.com/JvwIhno.png)

![](https://i.imgur.com/1H3tsAv.png)

![](https://i.imgur.com/H9niIhk.png)

![](https://i.imgur.com/IgKxhrh.png)

![](https://i.imgur.com/bElNQfo.png)
![](https://i.imgur.com/1RRqwBt.png)

![](https://i.imgur.com/q5JTAcn.png)
> 按照字节返回！！！

![](https://i.imgur.com/g8yPDrQ.png)
> replace和其他语言一样，就实现替换功能！

> 练习：以首字母大写的形式返回所有学生的姓名！
>1. ![](https://i.imgur.com/cDicG4L.png)
>
>2. ![](https://i.imgur.com/te6YM8b.png)
>可以看出来，这些函数真的很灵活欸！


---

#### 数学函数

![](https://i.imgur.com/MhvrW2h.png)

> ![](https://i.imgur.com/PqYKedn.png)
> 这里的函数都很简单！！！


---

#### 日期函数

![](https://i.imgur.com/C8M8Or9.png)
![](https://i.imgur.com/oUhwWjJ.png)
![](https://i.imgur.com/FLKHfi1.png)
```
注意！ CURRENT_TIME(), TIMESTAMP(), NOW()完全等价！！！
```

> 案例，求求我还能活多少天（按80岁）
> ![](https://i.imgur.com/Ew7GVmU.png)


---

#### 加密函数

![](https://i.imgur.com/Fy1xJD0.png)
> 注：PASSWORD()函数已经没有了哦！
![](https://i.imgur.com/dixHdJq.png)

==**示例：使用MD5加密存放密码！！！**==
![](https://i.imgur.com/19swTgp.png)

> 注意，MD5()是不可逆的！查不到原密码！


---

#### 流程控制函数

![](https://i.imgur.com/fQjDkz4.png)

![](https://i.imgur.com/OUY3Nq0.png)

> ==首先，尝试if！==
> if()是典型的三元表达式：若满足第一元，则输出第二元；否则输出第三元。
> ![](https://i.imgur.com/dRn28C8.png)

> ==其次尝试IFNULL！==
> 这个函数也很简单，如果第一元为空则返回第二元；否则返回第一元。
> ![](https://i.imgur.com/OOB9ErA.png)
> 因为我第一个为空，所以全返回第二个辣！

![](https://i.imgur.com/qPL7I3n.png)


---

### 多表查询（难点）

#### 复习单表的查询要点

首先我们创建了三张表！然后会根据这三张表进行慢慢的学习！

先注意一点！在sql中日期可以直接进行比较！！！
![](https://i.imgur.com/vXGJFwJ.png)

模糊查询：
![](https://i.imgur.com/wVIX9hs.png)

==查询null不用 = null 而是 is null！==
![](https://i.imgur.com/t0EoVKF.png)

==如何同时进行两次排序的查询？
按主次顺序写在后面就可以！==
![](https://i.imgur.com/YHp8y6B.png)

==分页查询==
![](https://i.imgur.com/QTYUrIJ.png)

![](https://i.imgur.com/Jp8ToxH.png)
![](https://i.imgur.com/3j8qxFR.png)


![](https://i.imgur.com/sa2o2wx.png)

my code：
![](https://i.imgur.com/ZEz7cR4.png)


---

#### 多表查询部分

![](https://i.imgur.com/OSWl7XZ.png)

my code：
![](https://i.imgur.com/R1Xkivi.png)

![](https://i.imgur.com/u7wgr5x.png)

![](https://i.imgur.com/mxEFrTi.png)
![](https://i.imgur.com/ZQ0UM7d.png)
![](https://i.imgur.com/sfXY8Cx.png)

my code：
![](https://i.imgur.com/xeweTxb.png)
![](https://i.imgur.com/q1WDPhL.png)
![](https://i.imgur.com/MkhgYzT.png)

#### 自连接
![](https://i.imgur.com/usHoqwn.png)
![](https://i.imgur.com/YBqw612.png)

my code：
![](https://i.imgur.com/jYb2P0P.png)

![](https://i.imgur.com/hKVBfzJ.png)


---


#### 子查询

![](https://i.imgur.com/D6GHioJ.png)

my code：
![](https://i.imgur.com/bE4mLHh.png)


![](https://i.imgur.com/bwAdW4s.png)

> my code：

![](https://i.imgur.com/K7naXtJ.png)


==同样地，子查询出来的结果也可以作为临时表与其他结合进行结合查询！！！==
![](https://i.imgur.com/gzH3H0l.png)

**==也就是说，子查询不仅可以用在WHERE句，也可以用在FROM句！==**


---

**all & any**

满熟悉了，all其实就是对比出来取最高的，而any就是对比仅仅去除最低的！

++示例：用all查最高！++
![](https://i.imgur.com/JdfjDjP.png)

++示例：用any排除最低！++
![](https://i.imgur.com/mTKdWK5.png)


---

**多列子查询**
![](https://i.imgur.com/9Lj8mBw.png)
由于我表里smith没有符合要求的这里我换成了WARD。
my code：
![](https://i.imgur.com/dKstvnJ.png)


---

##### 子查询例题（综合提升

> 1.
> ![](https://i.imgur.com/MDd70Pn.png)
> 
> my code：
> ![](https://i.imgur.com/ZznDkUH.png)
> 

> 2. 
> ![](https://i.imgur.com/RqoqSrG.png)
> 
> my code：
> ![](https://i.imgur.com/s8QPhLt.png)


> 3.
> ![](https://i.imgur.com/pMvuxsx.png)
> 
> my code：
> ![](https://i.imgur.com/wa1ZIFD.png)



---

##### 表复制

![](https://i.imgur.com/dGB8nZp.png)
> 每一次自我复制会让表的内容翻倍！也就是2的指数次方爆炸。
> 但是注意，==若表内有主键，自我复制就会报错！（毕竟主键不可重复）==


```
面试题：如何对表进行去重？（这个应该是指不带主键的表吧，不然没必要去）
```

my code：
首先，我们创建一张表用于测试。这里有个语法： create table xxx like xxx. 
会创建和后者格式一样的空表！
![](https://i.imgur.com/cHrVT18.png)

之后，我们将emp表的内容复制入新建的test表中。
![](https://i.imgur.com/nboQgWf.png)

其次，我们再复制一遍test表内内容，这样表内就有重复了！
![](https://i.imgur.com/L5Hgq3V.png)

![](https://i.imgur.com/ZD8XSq7.png)
![](https://i.imgur.com/ALqwMS1.png)


---

#### 合并子查询

![](https://i.imgur.com/RUnRhY8.png)
> 第一眼会让人觉得直接用 OR！
> 注意哪里不同于OR？
    > union all：不去重！！！不同于OR。
    > ![](https://i.imgur.com/IJAGhwp.png)
    > union：去重，很像OR。
    > ![](https://i.imgur.com/73aPDBq.png)


---

#### 外连接

![](https://i.imgur.com/avCKClI.png)

> 为了搞明白，我们也创建这个表来试试！
> 
> ![](https://i.imgur.com/NAUT8qo.png)
> ![](https://i.imgur.com/humscHi.png)
> ![](https://i.imgur.com/7BwCyyH.png)


创建完成后，我们就可以开始尝试测试左右外连接！
![](https://i.imgur.com/Qr0BS8W.png)

my code：
> 1.左连接
> ![](https://i.imgur.com/cn23gPj.png)
> 
> 2.右连接
> ![](https://i.imgur.com/JjbzgTH.png)


> 课堂习题：
> ![](https://i.imgur.com/qUL674W.png)
> 1.右外连接
> ![](https://i.imgur.com/phS2OKq.png)
> 2.左外连接
> ![](https://i.imgur.com/4lvuLtZ.png)


---

### 约束
![](https://i.imgur.com/GSdm59Z.png)

![](https://i.imgur.com/lg1r0wr.png)


#### 键约束

![](https://i.imgur.com/ql8Ex3O.png)

创建一个带主键的表
![](https://i.imgur.com/VCFUinO.png)
![](https://i.imgur.com/pXj5lb5.png)
> 会发现当主键重复时候就会报错！

==主键的细节==

![](https://i.imgur.com/7f0iSJ0.png)
![](https://i.imgur.com/yCO4gdn.png)

==复合主键==
![](https://i.imgur.com/wUHJ37n.png)


---

==非空 & 非重复约束==
![](https://i.imgur.com/jnLmoKt.png)
![](https://i.imgur.com/YaFpbKo.png)


---

==外键==

![](https://i.imgur.com/urmzYiW.png)

使用细节
![](https://i.imgur.com/pK3QRrW.png)
![](https://i.imgur.com/oBN4oaS.png)
![](https://i.imgur.com/tGtDg5i.png)
![](https://i.imgur.com/pe19zKo.png)

![](https://i.imgur.com/Hk4W0MW.png)
> 注：==只有innoDB引擎才支持外键！！！！==


---

#### check约束

![](https://i.imgur.com/OzHgzMu.png)


举例：尝试修改emp表的工资上下限并试试效果。

![](https://i.imgur.com/FDbnKNP.png)
![](https://i.imgur.com/ajLOPMZ.png)
> 为啥？？？？？


那我新建一个表试试
![](https://i.imgur.com/hoLHdCN.png)

![](https://i.imgur.com/tFJOtRC.png)
> 可以发现是有用的！
> 但是，通过desc 查出来的信息却看不到？？？
> ![](https://i.imgur.com/oEOj1oe.png)


##### 综合案例

![](https://i.imgur.com/uvOuzsB.png)

my code：
1.goods：
![](https://i.imgur.com/WQNNiaE.png)

2.customer：
![](https://i.imgur.com/VdEGvuI.png)
![](https://i.imgur.com/Pz4rFLJ.png)
> 可以发现这个check约束生效！

3.purchase：
![](https://i.imgur.com/qs0OYls.png)

==总的来说，搞清楚谁是外键，就很简单！==

---

#### 自增长

![](https://i.imgur.com/YjMNEWv.png)

自增长尝试（用于自动更新主键id）
![](https://i.imgur.com/RXWir0l.png)
![](https://i.imgur.com/2ade15S.png)

![](https://i.imgur.com/hUldrgC.png)
> 很神奇地自动更新了！


==细节==
![](https://i.imgur.com/sXuGvyz.png)

> 修改自增长！
> ![](https://i.imgur.com/djRpneI.png)
> ![](https://i.imgur.com/29YrmaY.png)
> ![](https://i.imgur.com/Pnrb76r.png)

> 成功！相当于就是修改自增长的底数！！！


---

## 索引！（常问到哦！）

![](https://i.imgur.com/mZjZNVx.png)
![](https://i.imgur.com/iUeTkAr.png)


### 创建索引
![](https://i.imgur.com/bxgWWkq.png)
![](https://i.imgur.com/staMOIb.png)
> 注意，==创建索引后，仅仅对创建的索引的列的查询有加速效果！==
> **这是当然的，毕竟相当于给这个列加了个目录**。

### 索引机制

#### 1. 索引的效率问题
==面试常见问题==：（我网易就被问到了！！呜呜呜）
![](https://i.imgur.com/DNhleZn.png)
> 为什么用索引快？因为会形成索引的数据结构！比如二叉树！！！（当然，根据数据库课程来看，是B树和B+树啦，B树所有节点都有对应源文件的目录索引，而B+树仅叶节点有对应源文件目录索引。）
> 索引代价：每次进行dml（插入，修改与删除）时，索引的结构文件也会被修改，当然会花时间了！

#### 2. 索引种类

![](https://i.imgur.com/wydgGIn.png)
> 1. 主键自动成为索引！所以根据主键查询很快呀！
> 2. ==unique 属性也会自动成为索引，所以查起来也比较快。仅仅在InnoDB引擎下才可以用！==
> 3. 普通索引用的最多！因为我们并不总是根据唯一值查询！同时，普通索引由于其不唯一性，一定是稀疏索引！！毕竟我们定位到了某一个可能有重复项后还要继续查也有可能！
> 4. ==全文索引：用于MyISAM引擎！==


#### 3. 创建，修改及删除索引

![](https://i.imgur.com/7SAQduH.png)
![](https://i.imgur.com/6clSe8Z.png)

```
show indexes from table_name;
```

![](https://i.imgur.com/CLAqBTC.png)

![](https://i.imgur.com/Dx6amG3.png)
![](https://i.imgur.com/9BG2RIG.png)
![](https://i.imgur.com/btpkORr.png)
![](https://i.imgur.com/MibXEaw.png)
![](https://i.imgur.com/o0MXmlh.png)



---

## 事务（面试高频！）

![](https://i.imgur.com/SU767XQ.png)

> 事务的特性：ACID （from数据库md）
> 
>     原子性Atomicity: 事务的一组更新操作原子不可分；要么都做，要么都不做。
> 
>     一致性Consistency: 事务的操作状态应正确且符合一致性规则。
> 
>     隔离性Isolation: 多个并发执行事务间互不影响。
> 
>     持久性Durability: 已提交事务的影响时持久的，且被撤销事务的影响是可恢复的。

### 事务内容 & 细节 （注，事务仅仅在InnoDB中才有！！）

![](https://i.imgur.com/Hqc3Uyb.png)

举例：（当然我已经很熟悉了）
![](https://i.imgur.com/15vBf1k.png)

> 尝试保存点！
> 
> 设置保存点a，之后插入一条数据
> ![](https://i.imgur.com/zCfriK1.png)
> 
> 再设置保存点b，再插入一条数据
> ![](https://i.imgur.com/ol0J0cs.png)
> 
> 我们回退至b保存点！
> ![](https://i.imgur.com/sgCpt6u.png)
> 
> 再回退回a保存点！
> ![](https://i.imgur.com/fbXu8Py.png)

```
如果我们直接写rollback 就是全体撤销该事务！
反正，如果使用commit 就是提交！提交后就没法修改啦！

总之，要使用rollback就必须在开始前开启事务也就是 START TRANSACTION!!!
```
![](https://i.imgur.com/TAPm1mf.png)
![](https://i.imgur.com/uOYLYFU.png)
> 注意！！！只有InnoDB存储引擎才可以使用事务机制！！！！


---

### 事务的隔离级别

![](https://i.imgur.com/8uH27oi.png)
![](https://i.imgur.com/B6EufeZ.png)

> 注意： 不可重复读指的是修改和删除；幻读指的是插入！
> 注意2：在mysql8.0里，查看隔离级别语句： SELECT @@transaction_isolation

![](https://i.imgur.com/gCDirnW.png)
> ==注意，幻读和不可重复读 是在事务已提交的基础上！==


==举例说明：==
![](https://i.imgur.com/6ruukMX.png)

> 我们可以使用两个控制台实现！
> ![](https://i.imgur.com/fmVhdgk.png)
> 
> ==**1.使用语句查看当前隔离级别： SELECT @@transaction_isolation**==
> ![](https://i.imgur.com/WE3Kcjp.png)
> 也就是说，我们的默认隔离级别是可重复读！对应上面的第三个级别！（不加锁但不会出现上面的几种问题）
> 
> ==**2.修改其中一个控制台的隔离级别！SET SESSION TRANSCATION ISOLATION LEVEL READ UNCOMMITED；**==
> 直接设置到最低的隔离级别！
> ![](https://i.imgur.com/nJHvg8T.png)
> ![](https://i.imgur.com/WWkJbQu.png)
> 修改完成！
> 
> ==**3.两边都开始事务！**==
> ![](https://i.imgur.com/PQTpbvD.png)
>
> ==**4.在隔离级别高的那边创建一张表！**==
> ![](https://i.imgur.com/17eiLBe.png)
> 
> ![](https://i.imgur.com/P9VeZYh.png)
> 可以发现，现在在两边查都是空表！
> 
> ==**5.现在在隔离级别高的命令行里添加一条数据但是先不提交！**==
> ![](https://i.imgur.com/rsrheO6.png)
> 
> 我们用隔离级别低的那个看一下能不能检索到
> ![](https://i.imgur.com/qFL1jF6.png)
> ==明明还没提交，就能查到了！这就是脏读！==
> 
> **==6.我们在隔离等级高的那个命令行进行一系列修改，再用低的查一查！==**
> **6.1 修改**
> ![](https://i.imgur.com/yPOkcRB.png)
> ![](https://i.imgur.com/ErkncgH.png)
> 
> **6.2 查询**
> ![](https://i.imgur.com/crqy8TQ.png)
> 发现不可重复读（读到修改内容）和幻读（读到添加内容）都有发生！！！
> ==注意，幻读和不可重复读 是在事务已提交的基础上！==

==可串行化：有加锁读功能==
![](https://i.imgur.com/zPn8vYY.png)
如上图示意，若有其他终端在对表进行事务操作，那么隔离级别设置为可串行化的终端，在事务提交或撤回完成前无法读取那张表！但是一旦提交，就立马能看到了！好神奇哦

![](https://i.imgur.com/r7qOFXY.png)


---

## 存储引擎 InnoDB & MyISAM （面试高频！）

![](https://i.imgur.com/HhD0Ob9.png)

使用 SHOW ENGINES 显示支持的引擎
![](https://i.imgur.com/2mPcHKV.png)
> InnoDB：写的很清楚，支持事务，外键以及行级锁。
> MEMORY：存在内存的表，巨快但是通常用于临时表！

![](https://i.imgur.com/1PLYIJx.png)
![](https://i.imgur.com/20JIirn.png)
![](https://i.imgur.com/RxPrVT4.png)
![](https://i.imgur.com/wpxxPpA.png)


---

## 视图

### 基本原理
![](https://i.imgur.com/yn3X04x.png)
![](https://i.imgur.com/DJHc1AU.png)
![](https://i.imgur.com/xLsAlcw.png)
> 视图可以由一张表或多张表构成！
> 视图与原表的关系是相互对照；任意一侧的修改都会影响另一侧。

### 视图使用

![](https://i.imgur.com/zNJYHJL.png)

> my code：
> ![](https://i.imgur.com/0OaulCQ.png)
> ![](https://i.imgur.com/zedcgGz.png)

> 视图上的修改也会影响到原表。
> 我在原表的Engineer并非全大写，那么我们尝试通过update视图来修改原表。
> ![](https://i.imgur.com/Grkkh2E.png)
> 下面查原表：
> ![](https://i.imgur.com/y8xFb8F.png)
> 还真的是！

==视图的实践==
![](https://i.imgur.com/JRUJn1l.png)


![](https://i.imgur.com/PFp1Vhz.png)

> my code：
> ![](https://i.imgur.com/E9jbnpV.png)
> 
> ![](https://i.imgur.com/4ShYCqy.png)


---

## 用户管理！

![](https://i.imgur.com/xTiAOSf.png)
![](https://i.imgur.com/DOIoj49.png)
![](https://i.imgur.com/SJ638fA.png)


> 创建用户并设置密码
> ![](https://i.imgur.com/Ul1qdJz.png)
> 
> 尝试用该用户登录
> ![](https://i.imgur.com/V1489nZ.png)
> 成功！
> 删除用户：
> ![](https://i.imgur.com/kj06JZ1.png)

### 用户权限管理

![](https://i.imgur.com/t6s1Y9c.png)
![](https://i.imgur.com/iVnpiN4.png)
![](https://i.imgur.com/LjHsqIL.png)


==老师代码实例==
![](https://i.imgur.com/l12K3F9.png)
![](https://i.imgur.com/QX0H2yP.png)
![](https://i.imgur.com/bxfnEXq.png)


### 用户管理细节

![](https://i.imgur.com/xsA80Fs.png)


---

## 恭喜你，看完了！（但是他的课程里没有讲触发器的知识，还有比较重要的数据库三范式，这些都可以参照隔壁DataBase的md文件。


---

## 习题

![](https://i.imgur.com/bYgty8L.png)

2.--------
![](https://i.imgur.com/tUU1ILW.png)

3.--------

3.1
![](https://i.imgur.com/GueuJza.png)

3.2（这里会用到if或者ifnull，我认为ifnull更合适题目要求就用了它）
![](https://i.imgur.com/w89pX8O.png)

4.--------

4.1
![](https://i.imgur.com/4PtDtEC.png)


4.2（我用的not，当然也可以创建一个在该范围的子表然后排除掉）
![](https://i.imgur.com/NRj9Yrx.png)

4.3
![](https://i.imgur.com/AoyP4dn.png)

4.4
![](https://i.imgur.com/tR0rZKa.png)

4.5
![](https://i.imgur.com/YqXYJSV.png)


5.--------

5.1
![](https://i.imgur.com/NxtbtM5.png)

5.2
![](https://i.imgur.com/V5P3Jf0.png)


6.--------
![](https://i.imgur.com/DYm3uKh.png)
![](https://i.imgur.com/RyMSzFD.png)

6.1
![](https://i.imgur.com/e8PsRYH.png)

6.2
![](https://i.imgur.com/MUiWpRb.png)

6.3
![](https://i.imgur.com/4ZP7Z7K.png)

6.4
![](https://i.imgur.com/R14jYRE.png)

6.5
![](https://i.imgur.com/AU9Sp2m.png)

6.6
![](https://i.imgur.com/YJeeIFt.png)

6.7
![](https://i.imgur.com/TCusLiy.png)

6.8
![](https://i.imgur.com/5sPG8jv.png)

6.9（迷惑？）
![](https://i.imgur.com/OCV9urV.png)

6.10
![](https://i.imgur.com/720YH2k.png)

6.11（两种方法： 1.replace， 2. concat）
1.![](https://i.imgur.com/Y66Yzb5.png)

2.![](https://i.imgur.com/fBzrrAS.png)

6.12
![](https://i.imgur.com/f1phXQm.png)

6.13
![](https://i.imgur.com/ScGhWTK.png)

6.14
![](https://i.imgur.com/MLcCowK.png)

6.15
![](https://i.imgur.com/TZWyKnq.png)

6.16
![](https://i.imgur.com/K0uBdCj.png)

6.17
![](https://i.imgur.com/Xk6SVzd.png)

6.18
![](https://i.imgur.com/zXHMCO9.png)

6.19（考察多排序）
![](https://i.imgur.com/7AtBMhr.png)

6.20（考察多排序）
![](https://i.imgur.com/jOJ4DGH.png)

6.21
![](https://i.imgur.com/WL6SmKl.png)

6.22
![](https://i.imgur.com/ezJKQJ3.png)

6.23
![](https://i.imgur.com/bAn8Whb.png)

6.24
![](https://i.imgur.com/74GVw7q.png)

6.25
![](https://i.imgur.com/uCrxv1G.png)

7.--------
![](https://i.imgur.com/UVRcAyf.png)
![](https://i.imgur.com/iXAyJuZ.png)


7.1
![](https://i.imgur.com/y1ETMGC.png)

7.2
![](https://i.imgur.com/HJqpC2t.png)

7.3
![](https://i.imgur.com/AZPaXZU.png)

7.4（外连接）
![](https://i.imgur.com/xbW36Z8.png)

7.5
![](https://i.imgur.com/pGIUfsp.png)

7.6
![](https://i.imgur.com/vc9FT1Y.png)

7.7
![](https://i.imgur.com/iO1EV9F.png)

7.8
![](https://i.imgur.com/95DwkcQ.png)

7.9
![](https://i.imgur.com/bEROwvH.png)

7.10
![](https://i.imgur.com/3vaL7pe.png)

7.11
![](https://i.imgur.com/pr0fa95.png)

7.12
![](https://i.imgur.com/nHcCyyQ.png)

7.13
![](https://i.imgur.com/Fy6a3d9.png)

7.14
![](https://i.imgur.com/ZlfXGxJ.png)

7.15
![](https://i.imgur.com/S3UF63m.png)

7.16
![](https://i.imgur.com/B33tMZX.png)

8.--------

![](https://i.imgur.com/TCRnxS1.png)
![](https://i.imgur.com/7tfDeL5.png)


==创建数据库1~2==
![](https://i.imgur.com/zS6mGuh.png)

![](https://i.imgur.com/ccQpcY9.png)

![](https://i.imgur.com/oYZlncV.png)

![](https://i.imgur.com/QShCn8b.png)

![](https://i.imgur.com/H0vkEQW.png)

+++++++++++++++++++
==CURD3~4==

3.（查）
3.1
![](https://i.imgur.com/D6hjmGo.png)

3.2
![](https://i.imgur.com/75i1vwI.png)

3.3
![](https://i.imgur.com/K0x2zMH.png)

4.（改）
4.1
![](https://i.imgur.com/uMRJBhd.png)

4.2
![](https://i.imgur.com/eYsehrq.png)

![](https://i.imgur.com/ui1ly7d.png)

- [x] ==全部习题已自己动手做完！！！没有看答案！！！==