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 增删改查
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中,且为第一句话 一般不用,必须限定类型