视图
视图是有一条sql语句的查询结果构成的虚拟表
其不是物理存在的使用方式与普通表相同
视图的作用
1 简化sql语句的编写
2 限制可以查看的数据
可以使用权限来完成
视图的特点:
对于视图的增删改查都会同步到原始表中
每一次对视图的查询本质上都是执行了之前创建视图时指定的sql语句
对于原始表的修改也能在视图中查看到前提你修改的数据包含在创建视图时指定的sql语句中
创建视图的语法:
create [or replace] view view_name as sql语句;
修改
alter view view_name as sql语句;
删除
drop view view_name;
触发器
是一段与某个表有关的mysql程序
当达到某种条件时,触发某个东西的执行
条件:
时间:before | after
具体事件:update | delete | insert
达到条件后:自动执行一段mysql程序
语法
create trigger t_name after/before delete/insert/update on tablename for each row
begin
具体执行操作
end
在触发器中有两个隐藏对象
new 新数据 old 旧数据
触发器不会影响原表的操作,只是增加一些额外的操作
注意:表a和表b
b有外键关联a的主键并且设置级联删除和更新
当删除a中的记录时,不会触发b表的触发器
事务
事务是逻辑上一组sql语句的集合
特点是:一个事务的所有sql语句要么全部执行成功,要么全部失败
通过rollback回滚数据
通过savepoint可以创建保存点
commit提交修改,一旦提交修改就无法回滚数据
事务最强大的地方在于,当发生一些不可控因素时,可以保证数据是完整的
事务的四个特征
原子性:一个事务是一个整体,不可拆分,要么都成功,要么都失败
一致性:一个事务无论成功或失败,相关数据的约束一定是完整的
隔离性:与效率息息相关
两个事务之间相互独立
read_uncommitted 不做任何隔离,可能脏读(读取到其他事务未提交的数据)
read_committed 可以防止脏读,不能防止不可重复读(并发修改)和幻读(并发添加和删除)
repeatable_read 可重复读,可以防止脏读,不可重复读(加锁保证查询事务和更新事务不能并发)不能防止幻读
serializable 数据库运行在串行化,所有问题都没有,就是性能低
永久性:一个事务一旦提交,就是永久性的,无法回滚
查看当前隔离级别
select @@tx_isolation;
设置新的隔离级别
set global transaction isolation level Serializable;
存储过程
一个存储过程中包含任意sql语句,以及流程控制,事务等
将一系列较为复杂的逻辑封装到mysql中
好处:降低网络传输次数,调高效率
弊端:学习成本高,运营成本高,沟通成本高
正常开放中有三种常见方式完成数据库相关操作
1 应用程序开发者,只关注业务逻辑
数据相关的逻辑交给存储过程
优点:优化网络传输,降低耦合度
弊端:学习成本高,运营成本高,沟通成本高
存储过程移植性非常差,每种数据库语法都不同
2 应用开发者,不仅关注业务逻辑还要编写原生sql语句
优点:一个人负责没有沟通成本
缺点:sql语句编写繁琐,导致开发效率降低
3 应用程序开发者,仅关注业务逻辑,把sql语句相关的交给ORM(对象关系映射,帮你封装了增删改查自动生成sql语句)
优点:开发效率提高
缺点:执行效率较低
创建存储过程
create procedure p1(type 参数名 数据类型)
type: in 输入参数 out 输出参数 inout 既能输出又能输入
delimiter // 修改结束符号
create procedure p1(参数)
begin
需要执行的sql代码
end //
delimiter ; 及那个结束符号该为;
存储过程与函数的区别:函数仅仅是一个单纯的工具与数据无关,所以函数中不能出现sql语句,存储过程既可以包含mysql逻辑代码也能包含sql语句
输出参数 必须是一个变量用@定义变量
函数
内置函数
自定义函数
流程控制
if语句,while语句等