视图、存储过程、触发器 整理

news/2024/12/28 16:18:39/文章来源:https://www.cnblogs.com/caigouyizhi/p/18637604

// 视图
// 视图就是基表的映射
// 创建视图
// create [or replace] view 视图名称[(视图列表)] as select语句 [with [cascaded | local] check option];

// 查看创建视图语句
// show create view 视图名称;

// 查看视图书记
// select * from 视图名称...;

// 修改视图
// 方式一:
// create [or replace] view 视图名称[(视图列表)] as select语句 [with [cascaded | local] check option];
// 方式二:
// alter view 视图名称[(视图列表)] as select语句 [with [cascaded | local] check option];

// 删除视图
// drop view [if exists] 视图名称 [,视图名称]...;

// 由于视图只是基表的映射,所以所有对于视图的修改操作都会在基表上生效

// 检查选项
// with [(cascaded | local)] check option
// 如果创建视图时增加以上语句,insert数据时mysql会检查该条数据是否满足视图要求,不满足则组织该条请求
// cascaded会检查是否满足该视图以及该视图依赖的所有视图(不管是否加了cascaded)的条件
// local只会检查是否满足当前视图的条件

// 要使视图可更新,视图中的行与基础表中的行必须存在一对一关系,如果视图中包含一下任何一项,则该视图不可更新:
// 聚合函数或窗口函数(sum(), min(), max(), count()等)
// distinct
// group by
// having
// union 或者 union all

// 视图作用
// 简单:视图可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件
// 安全:数据库可以授权,但是不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们能看到的数据
// 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。

// ----------------------------------------------------------------------------------------------------------------------------------------------
// 存储过程
// 定义:____是实现经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输
// 本质上就是数据库sql语言层面的代码封装与重用
// 类似与创建一个函数

// 创建
// create procedure 存储过程名称([参数列表])
// begin
// --sql语句
// end;
// 注意:在命令行中创建存储过程时,mysql会识别sql语句中的';'从而提前结束sql创建存储过程sql语句,我们需要使用delimiter方法自定义结束符

delimiter $$

create procedure p1()
begin
select * from user;
end$$

delimiter ;

// 调用
// call 名称([参数]);

// 查看指定数据库存储过程及状态信息
// select * from information_schema.routines where routine_schema = 'XXX';

// 查询某个存储过程的定义语法
// show create procedure 存储过程名称;

// 删除
// drop procedure [if exists] 存储过程名称;

// 变量
// 系统变量
// 系统变量分为全局变量global与会话变量session
// 查看系统变量
// show [session | global] variables;
// show [session | global] variables like '...';
// select @@[session | global] 系统变量名; --查看指定变量的值

// 设置系统变量
// set [session | global] 系统变量名 = 值;
// set @@[session | global] 系统变量名 = 值;

// 修改全局变量值之后重启mysql服务器系统变量还是会恢复到默认值
// 想要永久生效需要到/etc/my.cnf中配置

// 用户自定义变量
// 用户变量的作用域只在当前连接

// 赋值
// set @var_name = expr [, @var_name = expr]...;
// set @var_name := expr [, @var_name = expr]...;
// select @var_name := expr [, @var_name := expr]...;
// select 字段名 into @var_name from 表名;

// 使用
// select @var_name;

// 用户变量直接赋值就行,可以不用声明
// 未经过赋值的变量值默认为NULL

// 局部变量
// 局部变量只能在其声明的begin...end块内使用
// 声明
// declare 变量名 变量类型[default...];
// 变量类型有int,bigint,char,varchar,date,time等

// 赋值
// set 变量名 = 值;
// set 变量名 := 值;
// select 字段名 into 变量名 from 表名...;
create procedure p2()
begin
declare stu_count int default 0;
select count(*) into stu_count from student;
select stu_count;
end;

call p2();

// if条件判断
// if 条件1 then
// .....
// elseif 条件2 then
// .....
// else
// .....
// end if;

// 存储过程参数
// in:传入参数
// out:返回值
// inout:既是传入参数又是返回值
// create procedure 存储过程名称([in/out/inout 参数名 参数类型])
// begin
// --sql语句
// end;

// case语句
// 语法一
// case case_value
// when when_value1 then statement_list1
// [when when_value2 then statement_list2]...
// [else statement_list]
// end case;

// 语法二
// case
// when search_condition then statement_list1
// [when search_condition2 then statement_list2]...
// [else statement_list]
// end case;

// while语法
// while 条件 do
// --sql语句
// end while;

// repeat语法
// repeat
// --sql语句
// until 判断条件
// end;

// repeat类似于do...while 语句,与之不同的是repeat判断的是满足条件退出循环

// loop语法
// leave等价于break
// iterate等价于continue
// 以上二者都需要配合着标记进行使用
// loop就是死循环类似于while(1) 或者是go中while
sum : loop
if n <= 0 then
leave sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;

// 游标
// 游标是能够存储一张表的数据类型
// 声明
// declare 游标名称 cursor for select语句;

// 打开游标
// 在使用游标之前必须打开游标
// open 游标名称;

// 获取游标记录
// fetch 游标名称 into 变量[, 变量]...;

// 关闭游标
// close 游标名称;

// 游标的声明必须在局部变量声明之前
// 游标遍历时会自动向下一行遍历

// 条件处理程序
// 类比于try
// declare handler_action handler for condition_value [, condition_value]... statement;
// handler_action
// continue: 继续执行当前程序
// exit: 终止执行当前程序
// condition_value
// sqlstate sqlstate_value: 状态码,如02000
// sqlwarning: 所有01开头的sqlstate代码的简写
// not found: 所有以 开头的sqlstate代码的简写
// sqlexception: 所有没有被sqlwarning或not found捕获的sqlstate代码的简写
// statement
// 代表判定成功之后执行的操作

// -------------------------------------------------------------------------------------------------------------------------
// 存储函数

// 存储函数就是有返回值的存储过程,存储函数的参数只能是in类型
// create function 存储函数名称([参数列表(必须是in类型)])
// returns type [characteristic...]
// begin
// --sql语句
// return...;
// end;

// characteristic
// deterministic: 相同的输入参数总是产生相同的结果
// no sql: 不包含sql语句
// reads sql data: 包含读取数据的语句,但不包含写入数据的语句

// 存储函数比较类似于一般变成语言函数的写法
create function solve(n int)
returns int deterministic
begin
declare addd int default 0;
while n > 0 do
set addd := addd + n;
set n := n - 1;
end while;
return addd;
end;

select solve(100);

drop function if exists solve;

// -------------------------------------------------------------------------------------------------------------------------
// 触发器

// 与表相关的数据库对象,指的是在insert/update/delete操作之后,触发并执行触发器中定义的sql语句集合。用于保证数据的完整性,日志记录,数据校验等
// 使用别名来引用触发器中发生改变的记录内容分别为 old与new,现在触发器只支持行级触发,不支持语句级触发。

// 创建
// create trigger trigger_name
before/after insert/update/delete on tbl_name for each row --行级触发器
begin
trigger_stmt;
end;

// 查看
// show triggers;

// 删除
// drop trigger [schema_name.]trigger_name; --如果没有指定schema_name,默认为当前数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860430.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速体验chatGPT(AI问答)

由于账号的原因无法使用chatGPT,那有什么其他的办法可以体验一下这样的AI问答呢? 1、豆包 https://www.doubao.com/ 2、在魔塔modelscope的选择要体验的模型,在model详情页里,体验模型 https://www.modelscope.cn/studios/Qwen/QwQ-32B-preview/ 3、智谱AI https://open.…

合作招募

介绍 2025年将为潜在客户解决技术问题,并整理技术文档以满足其需求。根据问题的复杂度,文档的字数通常在1000-2500字之间,并配有相关截图 但为了提高合作效率并确保项目成功,彼此需共同承担部分前期成本(单次共承担最高不超30元,可当做找工作时的路费)。 该费用用于支持前…

第三次Blog 题目集7~8

一,前言 在题目集7和8中,我们逐步完善了智能家居强电电路模拟程序的功能和复杂性。题目集7以基本电路元件的特性和连接为核心,涵盖了开关、调速器、灯、风扇等设备的模拟,实现了多种控制设备和受控设备的电路设计与状态输出;而题目集8在此基础上新增了管脚电压显示、电流限…

题集7-8的总结

一:前言: 1.知识点:主要包括类和对象的使用、数据封装、方法的定义和使用、继承、多态、泛型、抽象类,集合框架,异常处理,字符串处理、以及基本的输入输出操作。 2.题量:现在的题目集都是一道题了,题量没什么说的。 3.难度:每次题集的难度都较大,每次都要7.8小时及以…

『联合省选2025集训』『图的连通性进阶』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

『联合省选2025集训』『耳分解,双极定向,三连通分量』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

第七-八次作业总结

一、前言 该系列题目均为设计与实现一个家居强电电路模拟程序,题目难度复杂度逐步提升,题目数量和输入信息也逐步增加。以下是对这两道题的总结: 1. 知识点家居强电电路模拟程序-3 受控窗帘设备的模拟 多个并联电路串联在一起的情况 串联电路中包含其他串联电路的情况 家居强…

AD 原理图如何进行DRC检查

如果画到PCB才发现原理图画错了,那么就为时太晚了。 画完或者后期修改PCB应该及时进行原理图的DRC检查。 1. 右下角Panels打开工程: 2. 然后我们选中整个工程的工程处,点击右键: 3. 然后左键点击compile PCB Project......... : 参考资料: https://www.fanyedu.com/content…

Vue3甘特图 - dhtmlx-gantt

Vue3甘特图 <template><div style="height:100%; background-color: white"><div id="gantt_here" style="width:100%; height:100%;"></div></div> </template><script setup> import { onMounted }…

恍恍惚惚,走到了尾声

课程链接 https://edu.cnblogs.com/campus/fzu/SE2024/作业链接 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标 回顾自己的软工实践课程学号 102202157一、学期回顾 1.1 回顾你对于软件工程课程的想象在课程开始前,我一直以为软件工程课程会聚焦于各种编…

转正了!!!!!!!!

近期&感受、问题: 1.版本优化描述:秘境排行榜;一键探险功能的顺序;背包随机类宝箱一键开启;美食家一键合成闪光美食;电玩活动跳过动画功能;许愿池自动投币;结晶一键熔炼 感受/反思:感觉自己菜菜的QAQ,各种版本的本地数据处理错误(删早了删晚了/先notify后notify…

Navicat密码导出解密导入到DataGrip中

使用Navicat导出密码:目前使用Navicat17亲测有效使用php解密代码 <?php class NavicatPassword {protected $version = 0;protected $aesKey = libcckeylibcckey;protected $aesIv = libcciv libcciv ;protected $blowString = 3DC5CA39;protected $blowKey = null;protec…