TCL: Transaction Control Language事务控制语言
事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
#步骤1:开启事务
set autocommit=0;
start transaction; #可选
#步骤2:编写事务中的SQL语句(select delete update insert) #注意不支持create drop等
语句1
语句2
...
#步骤3:结束事务
commit;#提交事务
rollback;#回滚事务
savepoint 节点名;#设置保存点
如果没有隔离机制,并发时会产生哪些问题:
事务的隔离级别:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
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逻辑,不保存查询结果。
应用场景
视图的优点:
示例:
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
更新视图中的数据时,视图定义时的表也会做出相应的更新
视图的可更新性和视图中查询的定义有关,以下类型的视图是不能更新的(一般情况下视图不能更新)
创建语句 | 存储的内容 | 操作 | |
---|---|---|---|
表 | 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;