一 视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。
使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
一 创建视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
二 使用视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
我们不应该修改视图中的记录,而且在涉及多个表的情况下是根本无法修改视图中的记录的,如下图
三 修改视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
四 删除视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
二 触发器
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
一 创建触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。
二 使用触发器
触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。
三 删除触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三 事务
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
四 存储过程
一 介绍
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
使用存储过程的优点:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦 #2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
使用存储过程的缺点:
#1. 程序员扩展功能不方便
补充:程序与数据库结合使用的三种方式
#方式一: MySQL:存储过程 程序:调用存储过程 #方式二: MySQL: 程序:纯SQL语句 #方式三: MySQL: 程序:类和对象,即ORM(本质还是纯SQL语句)
二 创建简单存储过程(无参)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三 创建存储过程(有参)
对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用 #inout 既可以传入又可以当作返回值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
四 执行存储过程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
五 删除存储过程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
五 函数
MySQL中提供了许多内置函数,例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
一 自定义函数
#!!!注意!!! #函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能 #若要想在begin...end...中写sql,请用存储过程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
二 删除函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三 执行函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
六 流程控制
一 条件语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SELECT 2; ELSE SELECT 7; END IF; END // delimiter ;
二 循环语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_while () BEGIN DECLARE num INT ; SET num = 0 ; WHILE num < 10 DO SELECT num ; SET num = num + 1 ; END WHILE ; END // delimiter ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_repeat () BEGIN DECLARE i INT ; SET i = 0 ; repeat select i; set i = i + 1; until i >= 5 end repeat; END // delimiter ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
BEGIN declare i int default 0; loop_label: loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label; END
六 流程控制
一 条件语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SELECT 2; ELSE SELECT 7; END IF; END // delimiter ;
二 循环语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_while () BEGIN DECLARE num INT ; SET num = 0 ; WHILE num < 10 DO SELECT num ; SET num = num + 1 ; END WHILE ; END // delimiter ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // CREATE PROCEDURE proc_repeat () BEGIN DECLARE i INT ; SET i = 0 ; repeat select i; set i = i + 1; until i >= 5 end repeat; END // delimiter ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
BEGIN declare i int default 0; loop_label: loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label; END