## 7.1视图:
- 从一个或几个基本表(或视图)导出的表。它与基本表不同,
是一个虚表。
- 数据库只存放视图的定义,而不存放视图对应的数据,
这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
- mysql5.1版本出现的新特性,是通过表动态生成的数据
只是保存了sql逻辑,不占用物理空间,只是一般不能增删改
**优点:**
可以暴露特定字段,做权限管理
1. 视图能够简化用户的操作
2. 视图使用户能以多钟角度看待同一数据
3. 视图对重构数据库提供了一定程度的逻辑独立性
4. 视图能够对机密数据提供安全保护
5. 适当的利用视图可以更清晰的表达查询
**缺点:**
1. 性能差:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
2. 表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的
表的结构时,都必须更改视图。
>[info]视图创建:
```
create view v1[id,name,salary]
as
select employee_id,last_name,salary from employees
```
<br>
## 7.2存储过程
```
/*
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
*/
```
>[danger]创建语法
```
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
/*
1、参数列表包含三部分
参数模式 参数名 参数类型
举例:
in stuname varchar(20)
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2、如果存储过程体仅仅只有一句话,begin end可以省略
存储过程体中的每条sql语句的结尾要求必须加分号。
存储过程的结尾可以使用 delimiter 重新设置,默认结尾为分号";"
语法:
delimiter 结束标记
案例:
delimiter $
*/
```
>[danger]调用语法
CALL 存储过程名(实参列表);
>[danger]删除存储过程
#语法:drop procedure 存储过程名
DROP PROCEDURE p1;
>[danger]查看存储过程的信息
DESC myp2;×
SHOW CREATE PROCEDURE myp2;
## 7.3 函数
```
/*
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1 个返回,适合做处理数据后返回一个结果
*/
```
>[success]创建语法
```
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
```
```
/*
注意:
1.参数列表 包含两部分:
参数名 参数类型
2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议
return 值;
3.函数体中仅有一句话,则可以省略begin end
4.使用 delimiter语句设置结束标记
*/
```
- 调用语法
`SELECT 函数名(参数列表)
`
- 查看函数
`SHOW CREATE FUNCTION myf3;
`
- 删除函数
`DROP FUNCTION myf3;
`
*案例:创建函数,实现传入两个float,返回二者之和
```
CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
DECLARE SUM FLOAT DEFAULT 0;
SET SUM=num1+num2;
RETURN SUM;
END
SELECT test_fun1(1,2);
```
## 7.4 循环控制
```
/*
分类:
while、loop、repeat
循环控制:
iterate类似于 continue,继续,结束本次循环,继续下一次
leave 类似于 break,跳出,结束当前所在的循环
*/
```
**1.while**
```
/*
语法:
【标签:】while 循环条件 do
循环体;
end while【 标签】;
*/
```
**2.loop**
```
/*
语法:
【标签:】loop
循环体;
end loop 【标签】;
可以用来模拟简单的死循环
*/
```
**3.repeat**
```
/*
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
*/
```