事务和视图
- 1 事务
- 1.1 事务的介绍 ACID
- 1.2 演示事务的使用步骤
- 1.2.1 事例:张无忌转账500给赵敏
- 1.3 事务并发问题的介绍
- 1.4 "删除"在事务中的区别
- 2 视图
- 2.1 视图的介绍
- 2.2 视图的创建
- 2.3 视图的修改
- 2.3.1 方式一 create or replace view
- 2.3.2 方式二 alter view
- 2.4 视图的删除
- 2.5 查看视图
- 3 练习
- 4 视图的一些其他操作
- 4.1 插入数据
- 4.2 修改数据
- 4.3 删除数据
1 事务
TCL transaction control language事务控制语言
1.1 事务的介绍 ACID
-
原子性(Atomicity):原子性要求事务是不可分割的最小工作单位,要么全部操作成功,要么全部操作失败回滚。即要么所有操作都执行,要么都不执行,不存在部分执行的情况。
-
一致性(Consistency): 一致性保证了事务在执行前后数据库的状态必须是一致的。在事务开始之前和结束之后,数据库应该仍然保持一致性约束,不会破坏数据完整性和业务规则。
-
隔离性(Isolation): 隔离性指的是多个事务并发执行时,事务之间应该相互隔离,使得每个事务感觉不到其他事务的存在。隔离性能够防止并发事务之间出现数据混乱、并发读取数据的问题。
-
持久性(Durability): 持久性确保一旦事务提交,其所做的修改将永久保存在数据库中,即使系统发生故障或重新启动,修改的数据也不会丢失。
1.2 演示事务的使用步骤
必须先设置自动提交功能为禁用
set autocommit=0;
步骤1:开启事务
set autocommit=0;
start transaction;步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...步骤3:结束事务
commit;提交事务
rollback;回滚事务show variables like 'autocommit';
show engines;
1.2.1 事例:张无忌转账500给赵敏
1.先创建一个账户表
create table account(id int primary key auto_increment,username varchar(20),balance double
);
auto_increment
通常用于为表中的主键字段生成唯一的自增值。当某一列被指定为 auto_increment
时,数据库系统会自动为新插入的记录分配一个唯一的递增值,而不需要用户手动指定该值。
2.查看account表中的所有索引
show index from account;
3.插入值
insert into account(username,balance)
values ('张无忌',1000),('赵敏',1000);
4.事务流程
# 开启事务
set autocommit=0;
start transaction;# 编写事务的语句
update account
set balance = 1000
where username = '张无忌';update account
set balance = 1000
where username = '赵敏';#结束事务
commit;
5.回滚事务
# 开启事务
set autocommit=0;
start transaction;# 编写事务的语句
update account
set balance = 1000
where username = '张无忌';update account
set balance = 1000
where username = '赵敏';#回滚事务
rollback;
1.3 事务并发问题的介绍
-
脏读(Dirty Read):脏读指在一个事务中读取了另一个事务未提交的数据,如果另一个事务在后续发生回滚操作,那么当前事务读取到的数据就是“脏”的。为避免脏读,可以使用 READ_COMMITTED 隔离级别,它规定一个事务只能读取到已经提交的数据。
-
不可重复读(Non-Repeatable Read):不可重复读指在同一事务中,由于其他事务修改了数据,导致一个事务两次读取相同的记录时,结果不一致。为避免不可重复读,可以使用 REPEATABLE_READ 隔离级别,它确保在一个事务中多次读取同一数据时,得到的结果是一致的。
-
幻读(Phantom Read):幻读指在同一事务内,由于其他事务插入、更新或删除数据,导致同一查询操作多次返回不同数量的数据行。为避免幻读,可以使用 SERIALIZABLE 隔离级别,它规定事务之间是串行执行的,确保在事务执行期间,其他事务无法对数据进行操作,从而避免幻读问题。
可以通过设置隔离级别,避免以上现象发生
事务的隔离级别
脏毒 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | ✓ | ✓ | ✓ |
read committed | × | ✓ | ✓ |
repeatable read | × | × | ✓ |
serializable | × | × | × |
1.4 "删除"在事务中的区别
# 演示delete
set autocommit = 0;
start transaction;
delete from account;
rollback;# 演示truncate
set autocommit=0;
start transaction;
truncate table account;
rollback;
2 视图
2.1 视图的介绍
MYSQL从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。不占据物理空间。
例:查询姓张的同学的姓名和专业名
原始方法:
select stuname,majorname
from stuinfo s
inner join major m
on s.majorId = m.id
where s.stuname = '张%';
视图方法:
create view v1
as
select stuname,majorname
from stuinfo s
inner join major m
on s.majorid = m.id;select *
from v1
where stuname like '张%';
2.2 视图的创建
例1:查询姓名中包含a字符的员工名、部门名和工种信息
# 创建视图
create view myv1
as
select last_name,department_name,job_title
from employees e
join departments d on e.department_id = d.department_id
join jobs j on e.job_id = j.job_id;# 查询视图
select *
from myv1
where last_name like '%a';
例2:查询各部门的平均工资级别
# 创建视图查看每个部门的平均工资
create view myv2
as
select department_id,avg(salary) as ag
from employees e
group by department_id;# 根据视图和job_grades查询工资级别
select myv2.*,grade_level
from myv2
join job_grades on ag between lowest_sal and highest_sal;
例3:查询平均工资最低的部门信息
# 创建视图查看部门的平均工资
# 例2中已创建# 在视图中查询工资最低的部门信息
select d.*
from myv2
join departments d
on myv2.department_id = d.department_id
where ag = (select min(ag)from myv2
);
还有更简单的做法,但是这个没有显示出部门的所有信息:
select *
from myv2
order by ag asc
limit 1;
例4: 查询平均工资最低的部门名和工资
create view myv3
as
select *
from myv2
order by ag asc
limit 1;select department_name,ag
from myv3
join departments d
on d.department_id = myv3.department_id;
视图的好处:
1.重用sql语句
2.简化复杂的sql操作,不必知道它的查询细节
3.保护数据,提高安全性
2.3 视图的修改
2.3.1 方式一 create or replace view
create or replace view 视图名
as
查询语句;
2.3.2 方式二 alter view
alter view 视图名
as
查询语句;
2.4 视图的删除
drop view myv1,myv2,myv3;
2.5 查看视图
#方式一
desc myv3;#方式二 效果不好
show create view myv3;
3 练习
一、创建视图 emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
create or replace view emp_v1
as
select last_name,salary,email,phone_number
from employees;select last_name,salary,email
from emp_v1
where phone_number like '011%';
二、创建视图 emp_v2,要求查询部门的最高工资高于 12000 的部门信息
# 创建视图查询部门的最高工资高于12000的id有哪些
create or replace view emp_v2
as
select department_id,max(salary) as m_s
from employees
group by department_id
having m_s > 12000;# 查询视图部门id的部门信息
select d.*,emp_v2.m_s
from emp_v2
join departments d on emp_v2.department_id = d.department_id;
4 视图的一些其他操作
4.1 插入数据
insert into myv1
values ( ),( ),( );
4.2 修改数据
update myv1
set last_name = ''
where last_name = '';
4.3 删除数据
delete from myv1
where last_name = '';
学的好疲惫😇,坚持一下