视图
基本操作
1 | # 视图 |
视图应用&好处
提高了重用性,就像一个函数
对数据库重构,却不影响程序的运行
提高了安全性能。可以对不同的用户
让数据更加清晰
视图不可编辑表数据的情况
- 包含聚合函数、distinct、group by、having、union、union all
- 常量视图。
- select包含子查询。
- 包含连接操作。
- from 一个不能更新的视图。
- where 子句的子查询引用了 from 子句中的表。
触发器
创建
1 | create trigger [触发器名称] [触发器的执行时间] [执行的动作点] on [表名] for each row [函数 或者动作] |
基本操作
1 | # 触发器 |
相对INSERT触发器中使用NEW关键字,UPDATE/DELETE触发器有OLD 和 NEW关键字.
存储过程
定义
存储过程和函数可以理解为一段 SQL 语句的集合,它们被事先编译好并且存储在数据库中
创建一个存储过程的语法为:
1 | create procedure 存储过程名(参数列表) |
参数类型
- 从上面的过程中我们了解到存储过程有参数类型这种说法,它的类型可以取值有三个:in、out、inout。
- 其中它们的意义如下:
(1) in 表示只是用来输入。
(2) out 表示只是用来输出。
(3) inout 可以用来输入,也可以用作输出。
存储过程理解
- 调用存储过程与直接执行 SQL 语句的效果是相同的,但是存储过程的一个好处是处理逻辑都封装在数据库端。
- 当我们调用存储过程的时候,我们不需要了解其中的处理逻辑,一旦处理逻辑发生变化,只需要修改存储过程即可,对调用它的程 序完全无影响。 3. 调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,可以提高数据处理的效率
show create PROCEDURE user_procedure_out;变量
- 存储过程中是可以使用变量的,我们可以通过 declare 来定义一个局部变量,该变量的作用域只是 begin….end 块中。
- 变量的定义必须写在符合语句的开头,并且在任何其他语句的前面。我们可以一次声明多个相同类型的变量,我们还可以使用default来赋予默认值。 3. 定义一个变量的语法为: declare 变量名 1 [,变量名 2…] 变量类型 [default 默认值]
- 上面的变量类型就是 MySQL 支持的类型,而变量名的取值规则也是一个老生常谈的话题了,就不赘述了。
- 变量可以直接赋值,还可以通过查询赋值。
- 直接赋值就是使用 set 来进行赋值,它的语法为: set 变量名 1 = 表达式 1 [,变量名 2=表达式 2…]
- 也可以通过查询来将结果赋值给变量,它需要要求查询返回的结果只有一行,语法范例: select 列名列表 into 变量列表 from 表名 其他语句;
存储过程中的数据类型
- 数值类型:Int,float,double,decimal
- 日期类型:timestamp,date,year
- 字符串:char,varchar,text
timestamp: 是使用最多的数据类型-》十位数的时间戳 text:一旦用到text类型的时候就可以考虑分表; 如果部分表的话,该字段的查询不会直接放在一起查 询,因为多个字段查询中其中如果有text字段的话,就容易遇到慢查询 所以通常的话,如果需要这个值的时候会根据id单独拿这个text字段
流程控制语句其他语法
1 | if 的语法格式为: |
声明语句结束符,可以自定义: DELIMITER [符合]
delimiter $$
$$
游标
- 游标也有的资料上称为光标。
- 我们可以在存储过程中使用游标来对结果集进行循环的处理。
- 游标的使用步骤基本分为:声明、打开、取值、关闭。
语法:1
2
3
4
5DECLARE test_cursor CURSOR FOR 结果集; //声明游标
OPEN test_cursor;
fetch test_cursor into 变量名,
CLOSE test_cursor;
DECLARE CONTINUE HANDLER FOR NOT FOUND //结果集查询不到数据自动跳出
总结:
- 游标的声明的语法: declare 游标名称 cursor for 查询语句;
- 打开光标的语法: open 游标名称;
- 获取游标数据: fetch 游标名称 into 变量名 1 [,变量名 2 ….]
- 关闭游标的语法: close 游标名称;
- 游标的基本使用须知:对某个表按照循环的处理,判断循环结束 的条件是捕获 not found 的条件,当 fetch 光标找不到下一条记录的 时候,就会关闭光标 然后退出过程。
- 可能有过 Pascal 编程经验的朋友们都会知道,声明的顺序也是很 重要的,在 SQL 中,我们使用 declare 定义的顺序是:变量、条件、 游标、应用程序
操作 查询出来的数据会放置于临时表中,然后再通过游标去读取数据。 案例
1 | delimiter $$ |
存储过程优点
- 第一点优势就是执行速度快。因为我们的每个 SQL 语句都需要经 过编译,然后再运行,但是存储过程都是直接编译好了之后,直接 运行即可。
- 第二点优势就是减少网络流量。我们传输一个存储过程比我们传 输大量的 SQL 语句的开销要小得多。
- 第三点优势就是提高系统安全性。因为存储过程可以使用权限控 制,而且参数化的存储过程可以有效地防止 SQL 注入攻击。保证了 其安全性。
- 第四点优势就是耦合性降低。当我们的表结构发生了调整或变动 之后,我们可以修改相应的存储过程,我们的应用程序在一定程度 上需要改动的地方就较
小了。 - 第五点优势就是重用性强。因为我们写好一个存储过程之后,再 次调用它只需要一个名称即可,也就是”一次编写,随处调用”,而且 使用存储过程也可以让
程序的模块化加强。
//打开游标 //关闭游标
存储过程的缺点
- 第一个缺点就是移植性差。因为存储过程是和数据库绑定的,如 果我们要更换数据库之类的操作,可能很多地方需要改动。
- 第二个缺点就是修改不方便。因为对于存储过程而言,我们并不 能特别有效的调试,它的一些 bug 可能发现的更晚一些,增加了应 用的危险性。
- 第三个缺点就是优势不明显和赘余功能。对于小型 web 应用来说, 如果我们使用语句缓存,发现编译 SQL 的开销并不大,但是使用存 储过程却需要检查
权限一类的开销,这些赘余功能也会在一定程度 上拖累性能。
案例
1 | //插入更新利息 |