第三章 数据库的三大设计范式
这是我参与更文挑战的第17天,活动详情查看: 更文挑战
1.第一范式 1NF
数据表中的所有字段都是不可分割的原子值?
create table user(id int primary key,name varchar(20));
字段还可以继续拆分的,就不满足第一范式。不能拆分了就满足第一港式。
例如:中国湖北恩施咸丰大坝
它还可以折成 : 中国 湖北 恩施 咸丰 大坝
2.第二范式
必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖与主键。否则折表。
如果要出现不完全依赖,只可能发生在联合主键的情况下。
其实就是一表中的所有元素只依赖与一个主键!!!!!!
3.第三范式 3NF
必须先满足第二范式,除开主键列的其他列之间不能有传送依赖关系。
例如: 其实就是 一个表中除开主键,其他的元素不可以相互依赖。
复制代码
第四章 SQL的四种连接查询
内连接
inner join 或者 join
select * from user inner join user1 on user.id = user1.id;
on:表示连接条件
内联查询,其实就是两张表中的数据,通过某个字段对,查询出相关记录数据。没有就不显示。
外链接
1.左外连接 left join 或者 left outer join
select * from user left join user1 on user.id = user1.id;
左外连接,会把左边表(urse)里面的所有数据取出来,而右表中(user1)的数据,如果有相等的,就显示出来。如果没有,就会补UNLL
2.右外连接 right join 或 right outer join
select * from user right join user1 on user.id = user1.id;
右外连接,会把右边表(urse)里面的所有数据取出来,而左表中(user1)的数据,如果有相等的,就显示出来。如果没有,就会补UNLL
3.完全外链接 full join 或者 full outer join
select * from user full join user1 on user.id = user1.id;
MYSQL 不支持full join ,但可以用union连接表
复制代码
第五章 mysql事务
mysql中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
多条sql语句,可能会有同时成功的要求,要么就同时失败。
mysql 中如何控制事务
1.mysql 默认是开启事务的(自动提交)
select @@autocommit;
默认事务开启的作用是什么?
当我们去执行一个sql 语句的时候,效果会立即体现出来,且不能回滚。
事务回滚:撤销sql语句执行效果
rollback;
2.设置 mysql 自动提交为 false
commit:手动提交 用rollback的话有效果
set autocommit=0 就变成了手支提交
select @@autocommit :自动提交数据@@autocommit = 1 用rollback 就可以撤销上条数据。
rollback: 撤销上条数据
就是手动提交不可以撤销 自动提交设置成0就可以提交。
事务给我们提供了一个返回的机会。
begin; start transaction; 都可以手动开启一个事务
例
begin;(或者 start transaction)
update user set mo =mo+100 where name='b';
在前面加上begin和start transaction就是和 setautocommit=0设置一样。
事务的四大特征:
A 原子性:事务是最小的单位,不可以在分割
B 一致性:事务要求,同一事务中的 sql 语句 ,必须保证同时成功或者同时失败。
I 隔离性:事务1 和 事务2 之间是具有隔离性的。
D 持久性:事务一但结束(commit,rollback),就不可以返回。
事务开启:
1.修改默认提交 set autocommit=0;
2.begin;
3.start transaction;
用上面三种了 后面用commit提交数据
事务手动提交:
commit;
事务手支回滚:
rollback;
事务的隔离性:
1.read uncommitted; 读未提交的
2.read committed; 读已经提交的
3.repeatable read; 可以重复读
4.serializable; 串行化
1-read uncommitted
如果有事务a,和事务b
a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b,可以看见a 操作的结果。
如果两个不同的地主,都在进行操作,如果事务a 开启之后,他的数据可以被其他事务读取到,就会出现脏读(脏读:一个事务读到了别外一个事务没有提交的数据,就叫做脏读),实现开发不允许脏读的出现。!!!!
如何查看数据库的隔离级别?
mysql 8.0:
--系统级别的 : select @@global.transaction_isolation;
--会话级别的 : select @@transaction_isolation;
mysql 默认隔离级别 REPEATABLE-READ
mysql 5.x:(数据库版本是5的话)
select @@global.tx_isolation
select @@tx_isolation;
如何修改隔离级别?
set global transaction isolation level read uncommitted;
复制代码
read uncommitted(A事务对数据进行操作,在操作的过程中,事务没有被提交,但是B,可以看见A的操作结果。)
//1.先创建数据表
mysql> select * from user1;
+——+——–+——-+
| id | name | money |
+——+——–+——-+
| 1 | 小明 | 10000 |
| 1 | 淘宝店 | 10000 |
| 2 | 小涵 | 5000 |
+——+——–+——-+
3 rows in set (0.00 sec)
//2.查看数据表的隔离级别
select @@global.tx_isolation;
+———————–+
| @@global.tx_isolation |
+———————–+
| READ-UNCOMMITTED |
+———————–+
//3.修改隔离级别
set global transaction isolation level read uncommitted;
//4.查看修改过来没有
mysql> select @@global.tx_isolation;
+———————–+
| @@global.tx_isolation |
+———————–+
| READ-UNCOMMITTED |
+———————–+
//5.用begin开启事务
begin;
//6.对数据表进行操作,小明把钱给了淘宝店
update user1 set money = money-9000 where name=”小明”;
update user1 set money = money+9000 where name=”淘宝店”;
mysql> select * from user1;
+——+——–+——-+
| id | name | money |
+——+——–+——-+
| 1 | 小明 | 1000 |
| 1 | 淘宝店 | 19000 |
| 2 | 小涵 | 5000 |
+——+——–+——-+
//7.小明用rollback撤销了上一步给钱的操作。
rollback;
mysql> select * from user1;
+——+——–+——-+
| id | name | money |
+——+——–+——-+
| 1 | 小明 | 10000 |
| 1 | 淘宝店 | 10000 |
| 2 | 小涵 | 5000 |
+——+——–+——-+
3 rows in set (0.00 sec)
2.read committed;(读已经提交的)
a.先创建表
b.修改事务(在查看事务select @@global.tx_isolation;) set global transaction isolation level read committed;
c.开启事务 start transaction
d.对事务的操作
e.提交事务 commit;
f.读到了提交的数据
3.repeatable read; (可以重复读)
事务1:
a.先创建表
b.修改事务(在查看事务select @@global.tx_isolation;) set global transaction isolation level repeatable read;
c.开启事务 start transaction
d.插入数据
e.提交事务 commit;
f.读到了提交的数据
事务2:
a.先创建表
b.查看表
c.开启事务 start transaction
d.对事务的操作,插入和事务1一样的数据
e.出错(出现幻读)
事务1和事务2 同时操作一张表,事务1提交的数据,不能被事务2读到,就要造成幻读。
4.serializable;(串行化)
事务1 :
a.先创建表
b.修改事务(在查看事务select @@global.tx_isolation;) set global transaction isolation level serializable;
c.开启事务 start transaction
d.对事务的操作
e.提交事务 commit;
f.读到了提交的数据
事务2:
a.先创建表
b.修改事务(在查看事务select @@global.tx_isolation;) set global transaction isolation level serializable;
c.开启事务 start transaction
如果事务2没有commit提交事务,那么事务1就无法提交数据,就进入了排队状态(串行化),要等事务2提交commit 事务1才可以提交数据。(其实和Python中的互斥锁一样)
串行化问题是,性能 差
READ-UNCOMMITTED > READ-COMMITTED>REPEATABLE-READ>SERIALIZABLE;
复制代码
第六章 操作数据表记录
5.1 插入,更新,删除记录操作
修改表名 : alert table 表名 rename 要修改的表名;
alter table A rename B;
添加表列 :alter table 表名 add column 添加的列名 添加的类型;
alter table B add column sex varchar(10);
删除表列: alert table 表名 drop column 删除的列名
alter table B drop column age;
修改表列类型(属性) alter table 表名 modify 修改的列名 要修改的属性;
alter table B modify sex char(20);
修改表列名和属性 alter table 表名 change column 需要修改的类名 修改后的类名 修改后的属性;
alter table B change column id iddd char(10);
数据的插入 insert into 表名 values();
insert into B values(1,2);
insert into 表名 set id = 3;
insert into B select
复制代码
结语
文章篇幅较长,给看到这里的小伙伴点个大大的赞!由于作者水平有限,文章中难免会有错误之处,欢迎小伙伴们反馈指正。
如果觉得文章对你有帮助,麻烦 点赞、评论、收藏
你的支持是我最大的动力!!!