第一部分的内容:
SQL(2)DQL语言 条件查询+排序查询+常见函数+分组查询+连接查询
https://blog.csdn.net/Lee_Yu_Rui/article/details/107527594
SQL(3)DQL语言 子查询+分页查询+联合查询
https://blog.csdn.net/Lee_Yu_Rui/article/details/107566293
SQL(4)DML语言 增删改
https://blog.csdn.net/Lee_Yu_Rui/article/details/107584843
SQL(5) DDL语言 库和表的创建,修改和删除
https://blog.csdn.net/Lee_Yu_Rui/article/details/107598414
SQL(6) 数据的常见约束和标识项
https://blog.csdn.net/Lee_Yu_Rui/article/details/107603411
感谢以下链接的教学分享,很好的视频和资源,笔记记录在这里,便于日后查看
新i版-链接: https://pan.baidu.com/s/1GDhRzV_3lUQaETsH4CM8zQ 提取码: rpte
TCL
/*
Transaction control language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,要么全部执行,要不全部不执行
特点:【经典面试题】
ACID
Atomicity 原子性:事务是一个不可再分的工作单位
Consistency 一致性:一个事务的执行会使数据从一个一致状态切换到另一个一致状态
Isolation 隔离性:一个事务的执行不能受到其他事务的干扰(还是受到隔离级别的影响)
Durability 持久性:一个事务提交,它对数据库中的数据的改变就是永久性的
案例:转账 避免中途失败 导致一个人钱转账出去,另一个人没有收到
事务的创建
1.隐式事务: 事务没有明显的开启和结束的标记 insert update delete
通过以下可以查询,mysql是默认开启的自动提交
SHOW VARIABLES LIKE 'autocommit'
2.显示事务: 事务具有明显的开始和结束的标记
前提:必须先设置,自动提交功能禁用
set autocommit = 0 仅针对当前对话有效
步骤1: 开启事务
set autocommit = 0;
start Transaction;可选
步骤2:编写事务中sql语句(select,insert,update,delete 注意 ddl没有事务之说)
步骤3:结束事务
commit;提交事务
rollback;回滚事务
*/
SHOW ENGINES;
#innodb 是支持事务的
SHOW VARIABLES LIKE 'autocommit'
SHOW VARIABLES LIKE'%AUTO_INCREMENT%'
SET auto_increment_increment = 1
USE test
DROP TABLE IF EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account VALUES(NULL,'张无忌',1000),(NULL,'赵敏',1000)
SELECT * FROM account
演示事务
#步骤1: 开启事务
SET autocommit = 0;
START TRANSACTION;
#步骤2:编写事务中sql语句(select,insert,update,delete 注意 ddl没有事务之说)
UPDATE account SET balance = 1000 WHERE username = '张无忌';
UPDATE account SET balance = 1000 WHERE username = '赵敏';
#步骤3:结束事务(可以认为上述结果只是临时的,并没有进入内存) 通过结束事务的命令 才能保存数据或者保持原态
#commit;
ROLLBACK;
SELECT * FROM account
隔离级别
并发问题:多个事务同时操作同一个数据库的相同数据
/*
在命令行的操作
select @@tx_isolation; 产看隔离级别
set session tranction isolation level read committed; 针对当前mysql连接的隔离级别
set gobal tranction isolation level read committed; 针对数据里系统全局的隔离级别
事务的隔离级别:
脏读, 不可重复读 幻读,
read uncommitted: × × ×
read committed : √ × ×
repeatable read √ √ × (mysql默认)
serializable √ √ √ 效率很低
*/
并发问题脏读,不可重复读和幻读的理解:
脏读:一个事务A执行过程中(还没有结束),对数据进行更新;此时事务B读取到了数据,就是更新后的数据,若此时A的结束内容是回滚,表示返回了,不执行这个更新操作了。但此时事务B已经读到了错的数据,这就是脏读
不可重复读:一个事务B先读取了事务A的字段。然后A更新了字段,B又读了字段,就变成了更新的字段,两次读取的结果不一样,就是不可重复读(同一事物B中两次查询结果不一样)。这是部队的,在事物B建立的时候A的状态,应该在整个B事物中保持不变,什么时候事物B能读到新的数据呢?就是事物C先A更改之后在创建。
幻读:对于事物A,在T1表格中读取了数据,想将数据(假设一共2个数据)更改一下,但此时突然有事出去一下,可能停了一会,这时候 另外一个人 创建了事物B 向表中插入了一个新的数据,并提交了。然后此时A事物的人回来了,执行了更新数据的命令,发现哎?怎么结果显示3行受影响,明明我刚刚查看的数据只有两行啊?(这种因为插入数据导致的成为幻读)
回滚点 savepoint
/*
savepoint 回滚点名
搭配 roolback to 归滚点名 使用
含义:回滚到指定的位置
*/
SET autocommit = 0;
DELETE FROM account WHERE id = 1;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id = 2;
ROLLBACK TO a;
delete and truncate在事务使用时的区别
# delete
SET autocommit = 0;
DELETE FROM account;
ROLLBACK;
SELECT * FROM account
# truncate
SET autocommit = 0;
TRUNCATE TABLE account;
ROLLBACK;
SELECT * FROM account