MySQL学习-事务,视图

目录

事务

    TCL(Transaction Control Language):事务控制语言
    事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如果执行失败,事务将回滚到执行之前的状态
    SHOW ENGINES:查看数据库引擎
    在MySQL中使用最多的存储引擎:INNODB、MyISAM、MEMORY。INNODB支持事务,MyISAM、MEMORY不支持事务

    ACID
            原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行
            一致性(Consistency):事务必须使数据库从一个一致性状态换到另一个一致性状态
            隔离性(Isolation):指一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相干扰
            持久性(Atomicity):指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其它操作和数据库故障不应该对其有任何影响

    事务的创建:
            隐式事务:事务没有明显的开启和结束的标记。如INSERT,UPDATE,DELETE。
            显示事务:事务有明显的开启和结束的标记。前提是必须先将自动提交设置为禁用,autocommit=0,该操作只针对本次事务有效。

    步骤1:开启事务
                    SET autocommit=0;
                    [START TRANSACTION;]
    步骤2:编写事务中的SQL语句
                    语句1;
                    …
    步骤3:结束事务
                    COMMIT;提交
                    ROLLBACK;回滚

    MySQL隔离级别:read uncommittedread committed(可以避免脏读),repeatable read(可以避免脏读、不可重复读),serializable(可以避免脏读、不可重复读、幻读,效率低)
    MySQL默认repeatable read,oracle默认read committed
    设置隔离级别:SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别
    查看当前隔离级别:SELECT @@tx_isolation;
    每启动一个MySQL查询,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量 @@tx_isolation,表示当前的事务隔离级别
    SAVEPOINT:保存点,搭配rollback


SET autocommit=0;
START TRANSACTION;
UPDATE major SET majorName='java' WHERE majorName='python';
SAVEPOINT a;
INSERT INTO major VALUES(3,'c');
ROLLBACK TO a;

视图

    视图:虚拟表,只保存SQL逻辑,不保存查询结果
    应用场景:多个地方使用到同样的查询结果(重用),该查询结果的SQL有点复杂
    保护数据,提供安全性

    下面的情况不能更新视图:(一般不增删改)

  1. 包含分组函数,DISTINCT,GROUP BY,HAVING,UNION,UNION ALL,JOIN等
  2. SELECT中包含子查询
  3. FROM一个不能更新的视图
  4. WHERE子句的子查询引用了FROM子句中的表

#一、视图的创建

#查询姓名中包含a的员工名,部门名,工种信息

CREATE VIEW view1 AS
SELECT last_name,department_name,job_title FROM employees e
INNER JOIN departments d ON e.department_id=d.department_id
INNER JOIN jobs j ON e.job_id=j.job_id;

SELECT * FROM view1 WHERE last_name LIKE '%a%';

#查询各部门的平均工资级别

drop view view2
CREATE VIEW view2 AS
SELECT t.*,grade_level FROM job_grades INNER JOIN (
SELECT department_id,AVG(salary) AS av FROM employees GROUP BY department_id) AS t
ON t.av BETWEEN lowest_sal AND highest_sal;

SELECT * FROM view2;

#二、视图的修改

#方式一:CREATE OR REPLACE VIEW 视图名 AS 查询语句

CREATE OR REPLACE VIEW view2 AS
SELECT * FROM employees;

#方式二:ALTER VIEW 视图名 AS 查询语句

ALTER VIEW view2 AS
SELECT * FROM employees;

#三、删除视图

#DROP VIEW 视图名,视图名…


#四、查看视图

SHOW CREATE VIEW view2;

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值