MySQL数据库--TCL语言

TCL语言的学习

​ tiansaction contro languge 事务控制语言

事务

​ 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

​ 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个msql语句是相互依赖的。

存储引擎

​ 概念:在mysql中的数据用各种不同的技术存储(表类型)在文件(内存)中,

​ show engines:来查看存储引擎

​ 类型:

​ Myisam:不支持

​ Innodb:支持事务

​ memory :不支持

事务的属性

​ ACID

​ A原子性:事务不可分割

​ C一致性:事务必须从一个一致性状态切换到另一个一致性状态

​ I隔离性:一个事务的执行不受其他事务的干扰

​ D持久性:事务一旦提交,对数据库的改变就是永久性的

事务的创建

隐式事务:

​ 事务没有明显的开启和结束的标记:

​ 比如 insert update delete语句

显式事务:

​ 事务有明显的开启和结束的标记:

​ 前提,显设置自动提交功能为禁用

​ show variables like “autocommit”;

​ set autocommit=0;

​ 关闭只针对于当前的回话有效,每次开机都要设置一下

​ 步骤:

​ 一:开启事务

​ set autocommit=0; 默认开启事务

​ start transaction;可选的

​ 二:编写sql语句(增删改查,DDL语言无法开启事务)

​ 语句1,

​ 语句2,

​ …

​ 三:结束事务

​ commit:提交事务

​ rollback:回滚事务

​ 在mysql不可以智能选择 有异常回滚,无异常提交。

​ 在没有结束事务之前,知识存储在内存中。

事务的隔离级别

并发问题:

脏读:对于两个事务t1,t2. t1读取了已经被t2更新但还没有被提交的字段之后,若t2回滚,t1读取的内容 就是临时无效的。

不可重复读:对于两个事务t1,t2 t1读取了一个字段,然后t2更新了该字段之后,t1再次读取同一个字段,值不一样了。

幻读:对于两个事务t1,t2. t1从一个表中读取了一个字段,然后t2在该表中插入了一些新的行后,如果t1再次读取同一个表,就会多出几行。

隔离级别:

​ 查看隔离界别:select @@tx_isolation;

​ 设置字符集 set names gbk;

​ 设置当前会话的隔离级别: set session transaction isolation level read unconnitted;

​ 设置所有会话的隔离级别:set global transaction isolation level read unconnitted; 需要重启

​ read uncommitted:读未提交 三种并发问题都可能产生。

​ read committed(oracle默认):读已提交,可以避免脏读,不可避免幻读和不可重复读。

​ repeatable read(默认) :可重复读,可以避免脏读,不可重复读,不可避免幻读(针对插入)。

​ serializable:串行化,三种并发问题都可以避免。阻塞操作。性能十分低下

回滚点:

​ savepoint 节点名:设置保存点

​ rollback to 节点名:回滚到保存点

视图

含义:

​ 虚拟表,和普通表一样使用,通过普通表动态生成的数据,行和列的数据来自自定义视图的查询中使用的表,并且是在使用视图时动态生成的。只保存sql逻辑不保存结果。

场景:

​ 多个地方用到同样的查询结果

​ 该查询结果使用的sql语句教复杂

用法:

​ create view my_v1 as …;

​ select * from my_v1 where …;

​ 语法:

​ create view 视图名 as 复杂的查询语句;

​ case1:查询邮箱找那个包含a字符的员工名,部门名和工种信息

​ create view test_1

​ as

​ select ed.last_name,ed.department_name,j.job_title,ed.email from jobs j inner join (select last_name,department_name,e.job_id,e.email from employees e inner join departments d on e.department_id = d.department_id) as ed on ed.job_id = j.job_id;

​ 回看连接!

​ select * from test_1 where email like “%a%”;

​ case2:查询各部门的平均工资级别

​ create view test_2

​ as

​ select money,department_id,grade_level from job_grades j inner join (select avg(salary) as money,department_id from employees group by department_id) as e on e.money between j.lowest_sal and highest_sal;

​ select * from test_2;

​ case3:查询平均工资最低的部门信息

​ create view test_3

​ as

​ select d.*,m.money from departments d inner join (select avg(salary) as money,department_id from employees group by department_id order by money limit 1) as m on m.department_id = d.department_id;

​ select * from test_3

​ case4:创建视图,要求电话号码以011开头的员工信息

​ create view test_4

​ as

​ select * from employees where phone_number like “011%”;

​ case5:要求查询部门的最高工资高于12000的部门信息

​ create view test_5

​ as

select d.*,m.money from departments d inner join (select max(salary) as money,department_id from employees group by department_id) as m on m.department_id=d.department_id where money > 12000;

优点:

重用sql语句

简化复杂的sql语句,不必知道他的查询细节

保护数据,提高安全性

修改:

方式一:

​ create or replace view 视图名

​ as

​ 查询函数;

​ 无就创建有就覆盖!

方式二:

​ alter view 视图名

​ as

​ 查询语句;

删除:

​ drop view 视图名1,视图名2,…;

查看:

​ desc 视图名;

​ show create view 视图名; 显示创建过程

​ show create view 视图名\G; 格式输出

更新:

​ 1.插入:

​ insert into 视图名 values(值,…);

​ 对原始表进行插入更新

​ 2.修改:

​ update 视图名 set 字段名=值 where …;

​ 对原始表进行插入更

​ 3.删除

​ delete from 视图名 where…;

​ 一般视图不可以进行更新操作。

​ 不允许增删改的情况:

​ select 包含子查询

​ 常量视图

​ join

​ from 一个不能更新的视图

​ where子句的子查询引用了from子句中的表

​ 包含 group by ,distinct,having union 等

视图和表的对比:

​ 占用物理空间 关键字 使用

视图 逻辑占用,但是数据不占用 view 增删改查,一般不能删改查

表 占用 table 增删改查

delete 和 truncate 在事务使用时的区别:

truncate 在事务过程中,哪怕执行回归也会清空该数据库。

而delete支持回归。

作业:

​ 1.创建表:bid 整形 主键,bname 字符型,唯一 非空, price 浮点数 默认值10 btypeid 类型编号 引用booktype的id 字段

​ create table bookss(bid int primary key,bname varchar(20) unique not null,price float default 10,btypeid int,constraint fk_books_bname foreign key (btypeid) references booktssype(id));

​ 创建表;booktype表,id,name

​ 2.开启事务 并插入一条数据

​ set autocommit=0;

​ insert into booktype value(1,“生活”);

​ insert into books value(1,“斗破苍穹”,119.99,1);

​ commit;

​ 3.创建视图,实现查询价格大于100的书名和类型名

​ create view test_1

​ as

​ select s.* ,t.name from books s inner join booktype t on s.btypeid = t.id where price > 100;

​ 4.修改视图,实现查询价格为90-120的书名和类型名

​ create or replace view test_1

​ as

​ select s.* ,t.name from books s inner join booktype t on s.btypeid = t.id where price between 90 and 120;

​ 5.删除视图

​ drop view test_1;

变量

分类

​ 系统变量:

​ 全局变量:

​ 会话变量:

​ 自定义变量:

​ 用户变量:

​ 局部变量:

系统变量

​ 变量由系统提供,不是用户定义,属于服务器层面

​ 1.查看所有的系统会话变量: show (session) variables ;

​ 全局变量:show global variables;

​ 会话变量:show session variables;

​ 2.查看满足条件的部分系统变量; show variables like “%char%”;

​ 3.查看指定的某个系统变量的值: select @@系统变量名; 默认查看session

​ 全局变量:select @@global.系统变量名;

​ 4.为某个具体的系统变量赋值

​ set (global)系统变量名 = 值;

​ set @@(global).系统变量名=值;

​ 若是全局级别,加global,会话级别则加session,不写默认session

​ 全局变量作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话有效,但是不能跨重启,若想跨重启则需改配置文件。

​ 会话变量作用域: 仅仅针对于当前的会话(连接)有效,

自定义变量

说明:

​ 变量是用户自定义,不是由系统提供的啦

​ 作用域: 针对于当前会话有效,同于会话变量的作用域

使用:

​ 声明

​ set @用户变量名 = 值;

​ set @用户变量名:= 值;

​ select @用户变量名:= 值;

​ 赋值

​ set @用户变量名 = 值;

​ set @用户变量名:= 值;

​ select @用户变量名:= 值;

​ select 字段 into 变量名 from 表;

​ 使用(查看 比较 运算)

​ select @用户变量名;

局部变量

​ 作用域:仅仅是定义它的begin end 中有效

​ 应用在begin end的第一句话。

​ 1.声明

​ declear 变量名 类型 default 值;

​ 2.赋值

​ set 局部变量名 = 值;

​ set 局部变量名:= 值;

​ select @局部变量名:= 值;

​ select 字段 into 局部变量名 from 表;

​ 3.使用

​ select 局部变量名;

对比用户变量和局部变量

​ 作用域 定义和使用的位置 语法

用户变量 当前会话 会话中的任何地方 必须加@,不用限定类型

局部变量 begin end中 只能在begin end中,且为第一句话 一般不用,必须限定类型

おすすめ

転載: blog.csdn.net/MINGZHEFENG/article/details/106903969