Mysql笔记整理
This commit is contained in:
1 parent
7bcbab4e96
commit
0b0841aa06
13 files changed
+877
No files matched your search
@@ -0,0 +1,45 @@
|
||||
## 删表
|
||||
|
||||
```sql
|
||||
Drop table if exists 表名;
|
||||
```
|
||||
|
||||
—— 如果这个表存在的话,将这个表删除
|
||||
|
||||
|
||||
|
||||
## 删除数据
|
||||
|
||||
语法:
|
||||
|
||||
```sql
|
||||
Delete from 表名 where 条件;
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> 注意:没有条件全部删除
|
||||
|
||||
|
||||
|
||||
删除第一个:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
没有where全部删除:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 删除大表
|
||||
|
||||
```sql
|
||||
Truncate table 表名;
|
||||
```
|
||||
|
||||
|
||||
|
||||
`delete` 可以理解为橡皮,一行一行进行回滚删除,而 `truncate` 则是碎纸机,直接全部截断,全部消失【truncate 的效率比 delete 更高】
|
||||
@@ -0,0 +1,12 @@
|
||||
语法:
|
||||
|
||||
```sql
|
||||
Update 表名 set 字段名1 = 值1 ,字段名2 = 值2 ,。。。Where 条件
|
||||
```
|
||||
注意:没有条件,表中数据全部更新
|
||||
|
||||
更改表中数据:
|
||||

|
||||
|
||||
当没有指定where的条件时:
|
||||

|
||||
@@ -0,0 +1,266 @@
|
||||
## 约束和常见约束
|
||||
|
||||
在创建表时可以添加约束,可以给表的字段增加约束,添加约束的目的是为了表中数据的完整性、合法性、唯一性
|
||||
|
||||
|
||||
|
||||
常见约束:
|
||||
|
||||
非空约束;【not null】不能为NULL
|
||||
|
||||
唯一约束;【unique】不能重复
|
||||
|
||||
主键约束;【primary key】不能是null且不能重复(PK)
|
||||
|
||||
外键约束;【foreign key】(FK)
|
||||
|
||||
检查约束;【check】注意:Oracle数据库中有check约束,但是MySQL没有,目前MySQL不支持
|
||||
|
||||
|
||||
|
||||
### 非空约束
|
||||
|
||||
在创建表格时添加约束;
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
一个完整的表中应该有主键
|
||||
|
||||
|
||||
|
||||
主键的分类:
|
||||
|
||||
1. 根据主键字段划分:
|
||||
1. 单一主键【推荐,常用】
|
||||
2. 复合主键【多个字段联合来添加一个主键约束】(不建议使用,因为违背三范式)
|
||||
|
||||
|
||||
|
||||
2. 根据主键性质:
|
||||
1. 自然主键【主键值最好就是和业务没有任何关系的自然数】**{推荐}**
|
||||
2. 业务主键【主键值和系统的业务挂钩】(拿着银行卡号做主键)(不推荐)
|
||||
|
||||
因为以后的业务进行改变时,主键值可能也需要随着变化,但有时候没办法改变,因为变化会导致主键值的重复。
|
||||
|
||||
|
||||
|
||||
> 主键约束只能有一个!!!
|
||||
|
||||
|
||||
|
||||
#### 主键自增
|
||||
|
||||
使用表级约束方式定义主键:
|
||||
|
||||
|
||||
|
||||

|
||||
);
|
||||
```
|
||||
|
||||
 | name | classno | classname |
|
||||
| ------ | ---- | ------- | --------------------------------------- |
|
||||
| 1 | zs1 | 101 | 北京大兴区经济技术开发区亦庄二中高三1班 |
|
||||
| 2 | zs2 | 101 | 北京大兴区经济技术开发区亦庄二中高三1班 |
|
||||
| 3 | zs3 | 102 | 北京大兴区经济技术开发区亦庄二中高三2班 |
|
||||
| 4 | zs4 | 102 | 北京大兴区经济技术开发区亦庄二中高三2班 |
|
||||
| 5 | zs5 | 102 | 北京大兴区经济技术开发区亦庄二中高三2班 |
|
||||
|
||||
缺点:冗余。【不推荐】
|
||||
|
||||
|
||||
|
||||
第二种方案:两张表(班级表和学生表)
|
||||
|
||||
t_class 班级表
|
||||
|
||||
| cno(pk) | cname |
|
||||
| ------- | --------------------------------------- |
|
||||
| 101 | 北京大兴区经济技术开发区亦庄二中高三1班 |
|
||||
| 102 | 北京大兴区经济技术开发区亦庄二中高三2班 |
|
||||
|
||||
|
||||
|
||||
t_student 学生表
|
||||
|
||||
| sno(pk) | sname | classno(该字段添加外键约束fk) |
|
||||
| ------- | ----- | ----------------------------- |
|
||||
| 1 | zs1 | 101 |
|
||||
| 2 | zs2 | 101 |
|
||||
| 3 | zs3 | 102 |
|
||||
| 4 | zs4 | 102 |
|
||||
| 5 | zs5 | 102 |
|
||||
|
||||
|
||||
|
||||
将所有信息都放一个表中,会有大量的重复数据(如班级等) ,所以需要多张表进行连接来创建。
|
||||
|
||||
但是当不同的表需要有一些数据进行连接,并且保证数据的准确性,这时候可以使用外键
|
||||
|
||||
如:在班级栏使用外键,这样学生选择的班级就只是在指定的一些数据中进行选择,而保证数据的稳定性
|
||||
|
||||
|
||||
|
||||
t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。
|
||||
|
||||
|
||||
|
||||
顺序要求:
|
||||
|
||||
>删除数据的时候,先删除子表,再删除父表。
|
||||
>
|
||||
>添加数据的时候,先添加父表,在添加子表。
|
||||
>
|
||||
>创建表的时候,先创建父表,再创建子表。
|
||||
>
|
||||
>删除表的时候,先删除子表,在删除父表。
|
||||
|
||||
|
||||
|
||||
语法:
|
||||
|
||||
,
|
||||
-> primary key(cno)【主键】
|
||||
-> );
|
||||
|
||||
Query OK, 0 rows affected (0.05 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
创建父表
|
||||
|
||||
|
||||
|
||||
,
|
||||
-> classno int,
|
||||
-> foreign key(classno) references t_class (cno)【外键】
|
||||
-> );
|
||||
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
```
|
||||
|
||||
创建子表
|
||||
|
||||
|
||||
|
||||
外键值可以是NULL?
|
||||
|
||||
> 外键可以是NULL。
|
||||
|
||||
外键字段引用其他表中某个字段时,被引用的字段必须是主键吗?
|
||||
|
||||
> 被引用的字段不一定是主键,但至少有unique约束
|
||||
@@ -0,0 +1,66 @@
|
||||
## 存储引擎和字符集
|
||||
|
||||
MySQL 默认存储引擎是 InnoDB 方式。
|
||||
|
||||
|
||||
|
||||
默认字符集是UTF-8
|
||||
|
||||
|
||||
|
||||
查看当前MySQL的存储引擎:
|
||||
|
||||
```sql
|
||||
show engines \G;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### MyISAM存储引擎
|
||||
|
||||
- MyISAM 存储引擎是 MySQL 最常用的引擎。
|
||||
- 它管理的表具有以下特征:
|
||||
- 使用三个文件表示每个表:
|
||||
- 格式文件— 存储表结构的定义(mytable.frm)
|
||||
- 数据文件— 存储表行的内容(mytable.MYD)
|
||||
- 索引文件— 存储表上索引(mytable.MYI)
|
||||
- 灵活的 AUTO_INCREMENT 字段处理
|
||||
- 可被转换为压缩、只读表来节省空间
|
||||
|
||||
|
||||
|
||||
### InnoDB 存储引擎
|
||||
|
||||
- InnoDB 存储引擎是MySQL的缺省引擎。
|
||||
- 它管理的表具有下列主要特征:
|
||||
- 每个InnoDB表在数据库目录中以 `.frm` 格式文件表示
|
||||
- InnoDB表空间tablespace被用于存储表的内容
|
||||
- 提供一组用来记录事务性活动的日志文件
|
||||
- 用 COMMIT(提交)、SAVEPOINT 及 ROLLBACK (回滚) 支持事务处理
|
||||
- 提供全 ACID 兼容
|
||||
- 在 MySQL 服务器崩溃后提供自动恢复
|
||||
- 多版本(MVCC)和行级锁定
|
||||
- 支持外键及引用的完整性,包括级联删除和更新
|
||||
- 无法压缩,无法只读
|
||||
|
||||
|
||||
|
||||
### MEMORY 存储引擎
|
||||
|
||||
- 使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得 MEMORY 存储引擎非常快。
|
||||
- MEMORY 存储引擎管理的表具有下列特征:
|
||||
- 在数据库目录内,每个表均以 .frm 格式的文件表示。
|
||||
- 表数据及索引被存储在内存中。
|
||||
- 表级锁机制。
|
||||
- 不能包含 TEXT 或 BLOB 字段。
|
||||
- MEMORY 存储引擎以前被称为 HEAP 引擎。
|
||||
|
||||
|
||||
|
||||
### 选择合适的存储引擎
|
||||
|
||||
- MyISAM 表最适合于大量的数据读而少量数据更新的混合操作。MyISAM 表的另一种适用情形是使用压缩的只读表。
|
||||
- 如果查询中包含较多的数据更新操作,应使用 InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。
|
||||
- 可使用 MEMORY 存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。
|
||||
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
## 事务概述
|
||||
|
||||
一个事务时一个完整的逻辑单元,不可再分。
|
||||
|
||||
比如:银行账户转账,从A账户向B账户转钱
|
||||
|
||||
需要两条update语句
|
||||
|
||||
以上两条DML语句必须同时成功或者同时失败,不能出现一条成功,一条失败
|
||||
|
||||
|
||||
|
||||
要保证同时的成功和失败,需要使用事务机制
|
||||
|
||||
> 事务的存在就是为了保证数据的完整性
|
||||
|
||||
|
||||
|
||||
## 事务原理
|
||||
|
||||
案例:假设一个事务要进行运行insert,再执行update,然后delete,才算完成
|
||||
|
||||
|
||||
|
||||
事务机制:【开始】
|
||||
|
||||
执行:
|
||||
|
||||
执行 insert 语句,insert,,,(这个执行成功后,把执行记录到数据库历史操作中,并不会向文件中保存数据,不会真正修改数据
|
||||
|
||||
执行 update 语句,update,,,(执行后也是记录操作,不会真正修改)
|
||||
|
||||
执行 delete 语句,delete,,,(这个执行也是记录操作,【记录到缓存】不会真正修改数据)
|
||||
|
||||
提交事务或回滚(结束)
|
||||
|
||||
**当全部执行结束后,全部同步到硬盘,清空历史缓存**
|
||||
|
||||
|
||||
|
||||
TCL:
|
||||
|
||||
提交事务:commit
|
||||
|
||||
回滚:rollback
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## MySQL中的事务机制
|
||||
|
||||
MySQL是自动提交事务的
|
||||
|
||||
通过:
|
||||
|
||||
```sql
|
||||
Start transaction 关闭自动提交
|
||||
```
|
||||
|
||||
这样进行更改的时候,是不会将内容写入内存的,如果确认无误,可以使用 rolllback 进行回滚
|
||||
|
||||
|
||||
|
||||
## 事务特性
|
||||
|
||||
事务的四个特性:
|
||||
|
||||
- 原子性(Atomicity)【A】
|
||||
|
||||
- - 整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。
|
||||
- **事务是最小的工作单元,不可再分**
|
||||
|
||||
- 一致性(Consistency)【C】
|
||||
|
||||
- - 在事务开始之前与结束之后,数据库都保持一致状态。
|
||||
- 保证多条DML语句必须同时成功或同时失败
|
||||
|
||||
- 隔离性(Isolation)【I】
|
||||
|
||||
- - 一个事务不会影响其他事务的运行。
|
||||
|
||||
- 持久性(Durability)【D】
|
||||
|
||||
- - 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚
|
||||
|
||||
|
||||
|
||||
### 事务的隔离性
|
||||
|
||||
事务隔离性存在隔离级,理论上存在4个级别。
|
||||
|
||||
InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务:
|
||||
|
||||
|
||||
|
||||
- **读未提交**(READ UMCOMMITTED)
|
||||
|
||||
允许一个事务可以看到其他事务未提交的修改。
|
||||
|
||||
读未提交存在脏读现象(Dirty Read),表示读到脏的数据【数据及其不稳定,数据不在硬盘中】
|
||||
|
||||
|
||||
|
||||
- **读已提交**(READ COMMITTED)
|
||||
|
||||
允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。
|
||||
|
||||
脏读现象解决了
|
||||
|
||||
读已提交存在的问题:不可重复读【不同时刻读到的数据不一样】
|
||||
|
||||
|
||||
|
||||
- 可重复读(REPEATABLE READ)
|
||||
|
||||
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。(银行总账)
|
||||
|
||||
该隔离级别为InnoDB的缺省设置。
|
||||
|
||||
这种隔离级别解决了不可重复读的问题,只要运行一个事务,从开始到结束,都是一样的数据。
|
||||
|
||||
|
||||
|
||||
- **串行化**(SERIALIZABLE)【序列化】
|
||||
|
||||
将一个事务与其他事务完全地隔离。
|
||||
|
||||
|
||||
|
||||
例:
|
||||
|
||||
> A 可以开启事物,B 也可以开启事物
|
||||
>
|
||||
> A 在事物中执行DML 语句时,未提交
|
||||
>
|
||||
> B 不以执行 DML,DQL 语句
|
||||
|
||||
|
||||
|
||||
MySQL默认隔离级别:读已提交【三档】
|
||||
|
||||
Oracle默认隔离级别:可重复读
|
||||
|
||||
中保存着当前的会话隔离级别。
|
||||
|
||||
为了查看当前隔离级别,可访问 tx_isolation 变量:
|
||||
|
||||
查看会话级的当前隔离级别:
|
||||
|
||||
|
||||
|
||||
```sql
|
||||
mysql> SELECT @@tx_isolation;
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```sql
|
||||
mysql> SELECT @@session.tx_isolation;
|
||||
```
|
||||
|
||||
|
||||
|
||||
查看全局级的当前隔离级别:
|
||||
|
||||
```sql
|
||||
mysql> SELECT @@global.tx_isolation;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
## 索引作用
|
||||
|
||||
相当于一本书的目录。
|
||||
|
||||
|
||||
|
||||
索引虽然可以提高效率,但是不能随意添加索引,因为索引也是数据库中的对象;
|
||||
|
||||
也需要进行维护,也需要不断进行维护,具有维护成本。
|
||||
|
||||
|
||||
|
||||
比如:表中的数据数据经常被修改,这样就不适合添加索引,索引需要重新排序,进行维护。
|
||||
|
||||
|
||||
|
||||
什么时候添加索引?
|
||||
|
||||
> 数据量庞大;
|
||||
>
|
||||
> 该字段很少进行DML操作;【因为索引也要进行维护】
|
||||
>
|
||||
> 该字段经常出现在where子句中;
|
||||
|
||||
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> 主键和具有unique约束的字段自动会添加索引。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 索引的创建
|
||||
|
||||
查看MySQL语句执行情况:explain + 要执行语句
|
||||
|
||||
|
||||
|
||||
创建索引
|
||||
|
||||
```sql
|
||||
create index 索引名 on 表名 (字段名)
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除索引:
|
||||
|
||||
```sql
|
||||
drop index 索引名称 on 表名
|
||||
```
|
||||
|
||||
|
||||
|
||||
在没有创建索引前,检索素所有,并且扫描所有
|
||||
|
||||

|
||||
@@ -0,0 +1,37 @@
|
||||
## 什么是视图
|
||||
|
||||
视图是一种根据查询(也就是SELECT表达式)定义的数据库对象,用于获取想要看到和使用的局部数据。
|
||||
|
||||
|
||||
|
||||
创建视图:
|
||||
|
||||
```sql
|
||||
Create view 视图名 as DQL语句
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除视图:
|
||||
|
||||
```sql
|
||||
Drop view 视图名
|
||||
```
|
||||
|
||||
|
||||
|
||||
对视图进行增删改查,会影响到原表的数据,不是直接操作原表。
|
||||
|
||||
|
||||
|
||||
**视图作用**
|
||||
|
||||
> 对最原始部分数据进行保密;
|
||||
|
||||
> 隐藏实现细节
|
||||
|
||||
|
||||
|
||||
可以通过查询语句进行对表的查询,将查询的结果作为视图进行操作
|
||||
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
## 什么是三范式
|
||||
|
||||
设计表的依据,按照这个三范式设计的表不会出现数据冗余。
|
||||
|
||||
|
||||
|
||||
## 三范式有哪些
|
||||
|
||||
第一范式:
|
||||
|
||||
任何一张表都应该有主键,每个字段原子性不可再分
|
||||
|
||||
|
||||
|
||||
第二范式:
|
||||
|
||||
建立在第一范式的基础上,所有非主键字段完全依赖主键,不能产生部分依赖
|
||||
|
||||
|
||||
|
||||
多对多?三张表,关系表两个外键。
|
||||
|
||||
t_student学生表
|
||||
|
||||
| sno(pk) | sname |
|
||||
| ------- | ----- |
|
||||
| 1 | 张三 |
|
||||
| 2 | 李四 |
|
||||
| 3 | 王五 |
|
||||
|
||||
|
||||
|
||||
t_teacher 讲师表
|
||||
|
||||
| tno(pk) | tname |
|
||||
| ------- | ------ |
|
||||
| 1 | 王老师 |
|
||||
| 2 | 张老师 |
|
||||
| 3 | 李老师 |
|
||||
|
||||
|
||||
|
||||
t_student_teacher_relation 学生讲师关系表
|
||||
|
||||
| id(pk) | sno(fk) | tno(fk) |
|
||||
| ------ | ------- | ------- |
|
||||
| 1 | 1 | 3 |
|
||||
| 2 | 1 | 1 |
|
||||
| 3 | 2 | 2 |
|
||||
| 4 | 2 | 3 |
|
||||
| 5 | 3 | 1 |
|
||||
| 6 | 3 | 3 |
|
||||
|
||||
|
||||
|
||||
第三范式:**建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。**
|
||||
|
||||
一对多?两张表,多的表加外键。
|
||||
|
||||
|
||||
|
||||
班级 t_class
|
||||
|
||||
| cno(pk) | cname |
|
||||
| ------- | ----- |
|
||||
| 1 | 班级1 |
|
||||
| 2 | 班级2 |
|
||||
|
||||
|
||||
|
||||
学生 t_student
|
||||
|
||||
| sno(pk) | sname | classno(fk) |
|
||||
| ------- | ----- | ----------- |
|
||||
| 101 | 张1 | 1 |
|
||||
| 102 | 张2 | 1 |
|
||||
| 103 | 张3 | 2 |
|
||||
| 104 | 张4 | 2 |
|
||||
| 105 | 张5 | 2 |
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> 在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
|
||||
|
||||
|
||||
|
||||
## 一对一的表设计
|
||||
|
||||
一对一设计有两种方案:主键共享
|
||||
|
||||
t_user_login 用户登录表
|
||||
|
||||
| id(pk) | username | password |
|
||||
| ------ | -------- | -------- |
|
||||
| 1 | zs | 123 |
|
||||
| 2 | ls | 456 |
|
||||
|
||||
|
||||
|
||||
t_user_detail 用户详细信息表
|
||||
|
||||
| id(pk+fk) | realname | tel | ... |
|
||||
| --------- | -------- | ---------- | ---- |
|
||||
| 1 | 张三 | 1111111111 | |
|
||||
| 2 | 李四 | 1111415621 | |
|
||||
|
||||
|
||||
|
||||
一对一设计有两种方案:外键唯一。
|
||||
|
||||
t_user_login 用户登录表
|
||||
|
||||
| id(pk) | username | password |
|
||||
| ------ | -------- | -------- |
|
||||
| 1 | zs | 123 |
|
||||
| 2 | ls | 345 |
|
||||
|
||||
|
||||
|
||||
t_user_detail 用户详细信息表
|
||||
|
||||
| id(pk) | realname | tel | userid(fk+unique).... |
|
||||
| ------ | -------- | ---------- | --------------------- |
|
||||
| 1 | 张三 | 1111111111 | 2 |
|
||||
| 2 | 李四 | 1111415621 | 1 |
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 291 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 136 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 413 KiB |
Reference in new issue
Block a user