ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 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 【标签】; */ ```