MySQL复习笔记(十二):事务(TCL)、视图

TCL

TCL: Transaction Control Language事务控制语言

事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

事务的ACID属性★:

  • 原子性(Atomicity):指事务是一个不可分割的工作单位,要么都执行,要么都不执行
  • 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另外一个一致性状态
  • 隔离性(Isolation ):指一个事务执行不能被其他事务所干扰,即一个事务内部的操作以及使用的数据对其他并发的事务是隔离的
  • 持久性(Durability):指一个事务一旦提交,他对数据库中数据的改变就是永久性的

事务的创建:

  • 隐式事务:事务没有明显的开启和结束标志。比如:insert、update、delete语句
  • 显示事务:事务具有明显的开启和结束标记。前提:设置自动提交功能为禁用
#步骤1:开启事务
set autocommit=0;
start transaction; #可选
#步骤2:编写事务中的SQL语句(select delete update insert)   #注意不支持create drop等
语句1
语句2
...
#步骤3:结束事务
commit;#提交事务
rollback;#回滚事务
savepoint 节点名;#设置保存点

事务的隔离级别

如果没有隔离机制,并发时会产生哪些问题:

  • 脏读:对于两个事务T1、T2,T1读取了已经被T2更新但是还没有被提交的字段。之后,若T2回滚,则T1读取的数据就是临时无效的
  • 不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段,若T1再次读取该字段,之就跟之前不一样了
  • 幻读:对于两个事务T1、T2,T1读取了一个字段,然后T2在该表中插入了一些新的行,如果T1再次读取同一个表,就会多出几行

事务的隔离级别:

脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read × ×
serializable × × ×

MySQL中默认是第三个隔离级别:repeatable read

Oracle中默认的是第二个隔离级别:read committed

查看当前隔离界别:

SELECT @@tx_isolation

设置隔离级别:

set session|global transaction isolation level 隔离界别;

savepoint 使用示例:

set autocommit = 0;
start transaction;
delete from account where id = 1;
savepoint a;
delete from account where id = 2;
rollback to a;
#结果:回滚到节点a处,即id=1的数据被删除,而id=2的数据保留

视图

视图:从MySQL5.1版本开始开始提供视图功能。它是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,视图只保存了sql逻辑,不保存查询结果。

应用场景

  • 多个地方都用到同样的查询结果
  • 查询结果使用的SQL语句较为复杂

视图的优点:

  • 重用SQL
  • 简化复杂的SQL操作,不必知道其具体细节
  • 保护数据,提高安全性

示例:

create view myview
as
select stuname,majorname
FROM students s
INNER JOIN major m
ON s.majorId = m.id

一、创建视图

语法:

create view 视图名
as
查询语句;

1、查询姓名中包含a字符的员工名、部门名和工种信息

#创建视图
create view v1
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 v1 WHERE last_name LIKE '%a%'

二、视图的修改

方式一:

#有则替换,无则创建
create or replace view 视图名
as
查询语句;

方式二:

alter view 视图名
as
查询语句;

三、删除视图

语法:

drop view 视图名,视图名...;

四、案例

1、创建视图emp_v1,要求查询电话号以’011’开头的额员工姓名、工资和邮箱

CREATE OR REPLACE VIEW  emp_v1
as
SELECT last_name,salary,email,phone_number
FROM employees e
WHERE phone_number LIKE '011%';

SELECT * FROM emp_v1;

2、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息

CREATE OR REPLACE View emp_v2
AS
SELECT MAX(salary) mx_sal, department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000;

SELECT d.*
FROM departments d
INNER JOIN emp_v2 v2
ON d.department_id = v2.department_id

五、视图中数据的更新

更新视图中的数据时,视图定义时的表也会做出相应的更新

视图的可更新性和视图中查询的定义有关,以下类型的视图是不能更新的(一般情况下视图不能更新

  • 包含以下关键字的SQL语句:分组函数,distinct,group by,having,union或者union all
  • 常量视图
  • select中包含子查询
  • join
  • from一个不能更新的视图
  • where子句的子查询引用了from子句中的表

六、视图 VS 表

创建语句 存储的内容 操作
create table 存储真实的数据 增删改查
视图 create view 存储的是SQL语句 可以增删改查,但一般只差

练习题

/*
创建bookType表,字段如下
id 整型 要求主键
name 字符型 非空

创建book表,表结构如下:
bid		整型 要求主键
bname	字符型 要求设唯一键并且非空
price	浮点型 要求有默认值10
btypeId	类型编号,要求引用bookType表中的字段 id
*/
CREATE TABLE IF NOT EXISTS bookType(
	id INT PRIMARY KEY,
	name VARCHAR(20) NOT NULL
);

CREATE TABLE IF NOT EXISTS book(
	id INT PRIMARY KEY,
	bname VARCHAR(50) UNIQUE NOT NULL,
	price FLOAT DEFAULT 10,
	btypeId INT,
	CONSTRAINT fk_book_bookType FOREIGN KEY(btypeId) REFERENCES bookType(id)
);
show  book;

#开启事务,向表中插入一行数据
SET autocommit = 0;
START TRANSACTION;
INSERT INTO bookType VALUES(1,'科幻');
INSERT INTO book set id=1,bname='三体',price=60,btypeId=1;
COMMIT;

#创建(或修改)视图,实现查询价格小于100的书名和类型名
CREATE OR REPLACE VIEW book_v1
AS
SELECT b.bname bookName,t.name typeName
FROM book b
INNER JOIN bookType t
WHERE b.btypeId = t.id AND price < 100

#删除视图
DROP VIEW book_v1;

你可能感兴趣的:(后端,MySQL)