MySQL笔记5——视图、存储过程和触发器

news2024/9/23 19:57:05

视图

创建视图

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。

CREATE VIEW view_name as

select……

说明:

  • view_name自己定义的视图名
  • as后面是这个视图所用到的查询结果

视图的操作

视图的查询

查询所有的视图

select * from

information_schema.VIEWS

WHERE table_schema = ‘库名';

视图可以当作一张表来使用,所以用正常的select查询即可

查看视图的建立

SHOW CREATE VIEW view_name

删除存储过程

DROP VIEW view_name

视图的作用

  1. 简化查询
  2. 重写格式化数据
  3. 频发访问数据库
  4. 过滤数据
#视图
-- 视图只能用来查询,不能做增删改
-- 创建视图
-- CREATE VIEW 视图名[view_xxx / v_xxx]
-- as 查询语句
USE myschoolxxx
CREATE VIEW v_stu_man AS
SELECT * FROM student WHERE ssex='男';

-- 视图使用
SELECT * FROM v_stu_man

-- 
CREATE VIEW v_vstuman_class AS
SELECT v_stu_man.*,classname FROM v_stu_man
LEFT JOIN class ON v_stu_man.classid=class.classid

SELECT * FROM v_vstuman_class

UPDATE student SET sname='赵蕾蕾' WHERE sid=1
SELECT * FROM student
SELECT * FROM v_stu_man  -- student 表改变,视图会跟着一起改变

-- 查看库中所有视图
SELECT * from information_schema.views
where table_schema='myschoolxxx'

-- 删除视图
DROP VIEW v_stu_man

存储过程

存储过程(Stored Procedure)是在大型数据量系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

使用存储过程的理由

  1. 业务流程复杂:业务复杂时,SQL语句相互依赖,顺序执行
  2. 频繁访问数据库:每条SQL语句都需要单独连接和访问数据库
  3. 先编译后执行:SQL语句的执行需要先编译

创建存储过程

CREATE PROCEDURE (

[ [IN |OUT |INOUT ] 参数名 数据类型…])

BEGIN DECLARE 变量 变量类型

END

说明:

  • '[ ]'内容不是必须的;
  • in:表示入参;
  • out:表示返回值;
  • inout:表示即是入参又是返回值。

存储过程的操作

调用存储过程

CALL 存储过程名 [参数名]

查看存储过程

SELECT * FROM information_schema.ROUTINES WHERE routine_schema=‘库名’

删除存储过程

DROP PROCEDURE 存储过程名

存储过程与函数的区别

  • 语法:关键字不同,存储过程时procedure,函数function;
  • 执行:存储过程可以独立执行,函数必须依赖表达式的钓鱼;
  • 返回值:存储过程可以定义多个返回结果,函数只有一个返回值;
  • 功能:函数不易做复杂的业务逻辑,但是存储过程可以。

存储过程的缺陷

  • 移植性:大多数关系型数据库的存储过程 存在细微差异。
  • 维护性:存储过程的维护成本高,修改调试较为麻烦。
  • 协作性:没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是依赖文档。
#存储过程 
-- 本质是一个函数,但是比函数强大得多
-- 存储过程创建
CREATE PROCEDURE 存储过程名 [proc_xxx](形参列表)
BEGIN
			一组sql语句集
END

-- 创建最简单的存储过程
delimiter $$
CREATE PROCEDURE proc_test()
BEGIN
		SELECT * FROM student;
END $$
delimiter ;

-- 使用存储过程
CALL proc_test();

-- 带参数的存储过程
delimiter $$
create procedure proc_test2(
    in a int,   -- in 只入参(值传递)
    out b int,  -- out 只出参 (无)
    inout c int -- inout 出入参 (引用传递)
)
begin 
    set a = a+1;
    set b = b+100;
    set c = c+1000;
end $$
delimiter ;
	
-- 环境变量  @ 局部环境变量  @@ 全局环境变量
set @x = 10;   -- 11 10 null
set @y = 20;     -- 120 20 null
set @z = 30;     -- 1030 30 null 

select @x, @y, @z;

call proc_test2(@x,@y,@z)

select @x, @y, @z;

-- 查询学生表(包含总学生数、总页数)
-- 面试题
-- 分页
-- 删除存储过程
DROP PROCEDURE proc_stuPage;
delimiter $$
CREATE PROCEDURE proc_stuPage(
	in curpage int,
	in sizepage int,
	out stucount int,
	out pagecount int
)
BEGIN
	DECLARE cp int; -- 方法内的变量
	SET cp=(curpage-1)*sizepage;
	SELECT COUNT(*) FROM student into stucount;
	SET pagecount=CEILING(stucount/sizepage);
	SELECT * FROM student LIMIT cp,sizepage;
END $$
delimiter;

-- 设置环境变量
SET @a=0;
SET @b=0;
call proc_stuPage(2,3,@a,@b);

SELECT @a,@b

触发器

触发器是数据库中针对数据库表操作触发的特殊的存储过程。(一种存储过程、与表相关联、自动执行)

创建触发器

CREATE TRIGGER 数据库名.触发器名

        BEFORE/AFTER -- 触发顺序

        INSERT/UPDATE/DELETE – 触发事件

ON 数据库.表名 -- 事件表

FOR EACH ROW

BEGIN

        触发器内容 -- 事件出发后要写的语句

END$$

说明:

  • 触发器触发时间分为Before和After两种;
  • 主要针对表的增删改操作,可单独指定,也可全部指定。
  • 查看所有的触发器

SELECT DISTINCT EVENT_OBJECT_TABLE FROM

information_schema.`TRIGGERS`

WHERE EVENT_OBJECT_SCHEMA=‘数据库名'

触发器的查看

查看所有的触发器:

SELECT * FROM information_schema.`TRIGGERS` WHERE trigger_schema = ‘库名'

删除触发器:

DROP TRIGGER 触发器名

触发器常见案例

利用触发器映射部门表中每个部门的总人数和平均工资,步骤:

  1. 创建部门表,包含字段部门编号,部门名称,部门人数和平均工资;
  2. 创建触发器;
  3. 分别执行DML语句验证。

利用触发器记录删除的数据,并保存在删除表中,步骤:

  1. 创建删除记录表;
  2. 创建触发器;
  3. 执行DELETE语句验证。

存储过程和触发器的区别

语法:关键字不同,存储 过程是procedure, 触发器是trigger;

执行:存储过程需要调用才执 行,触发器自动执行;

返回值:存储过程可以定义返回值, 但是触发器没有返回值;

功能:存储过程是一组特定功能的 SQL语句,触发器则是SQL语 句前后执行,本身不影响原功 能。

#触发器
-- 创建触发器
-- 触发器隐式执行
-- delimiter $$
-- CREATE TRIGGER 触发器名 【trig_xxx】
-- BEFORE/AFTER INSERT/UPDATE/DELETE
-- on 表名 for each row
-- BEGIN
-- 	触发后执行的一组sql语句
-- END
-- delimiter ;

-- 删除学生 sid 为 1  在此之前把学生成绩删除
delimiter $$
CREATE TRIGGER trig_delstu_delsc
BEFORE DELETE ON student FOR EACH ROW
BEGIN
	-- old 已经存在的数据、new 还不存在的数据
	DELETE FROM sc WHERE sid=old.sid;
END $$
delimiter ;

DELETE FROM student WHERE sid=2;

SELECT * FROM student
SELECT * FROM sc

-- 触发器隐式执行
[SQL] delete from student where sid = 2;
受影响的行: 1
时间: 0.008ms

SELECT * FROM information_schema.`TRIGGERS`
WHERE trigger_schema = 'myschool'

drop trigger trig_delstu_delsc

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs项目

一、基于域名配置server 1. 一个配置文件一般只有一个 http 模块 2. 一个 http 模块可以有多个 server 模块 3. 一个 server 模块就是一套 web 项目 4. 一个 server 模块中可以有多个 location 5. location 就是项目中的 url 路由 # 第一步 mkdir /zhangmin # 第…

GMII, SGMII 以太网接口

前言: 🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留…

(最全最小白易懂版)Yolov8新手教程-配置环境、数据集处理、目标检测、结果分析处理(图像指标、可视化结果)、报错分析等全过程学习记录

目录 一、安装环境(配置yolo、demo测试) 二、数据集准备(格式学习) 三、训练数据集 1.划分数据集 2.训练数据集 2.1常规训练 2.2微调 3.各种报错记录 3.1AttributeError 3.2TypeError 3.3Error while loading conda en…

贪心问题集

常见问题分类&#xff1a; 1&#xff09;区间问题 2&#xff09;Huffman 3&#xff09;排序不等式 4&#xff09;绝对值不等式 5&#xff09;推公式 一、区间问题 板子&#xff1a; ①区间选点问题 #include <iostream> #include <algorithm> using namespace std;…

【算法 01】快速排序算法与分治思想

深入理解快速排序与分治思想 在算法的世界里&#xff0c;快速排序以其高效的性能著称&#xff0c;它巧妙地运用了分治策略&#xff08;Divide and Conquer&#xff09;&#xff0c;将复杂的排序问题逐步分解为更小的子问题&#xff0c;直至问题变得足够简单&#xff0c;从而轻…

永劫无间:游戏模式操作,云手机游戏辅助教程!

在《永劫无间》中&#xff0c;快速比赛模式和无间模式是提升实力和展示技巧的重要途径。以下是详细的攻略建议&#xff0c;帮助玩家在游戏中取得更好的成绩。 快速比赛模式 快速比赛模式与排位赛的玩法内容一致&#xff0c;但对局结果不会影响你的段位积分和英雄积分&#xff…

昇思 25 天学习打卡营第 25 天 | MindSpore Diffusion 扩散模型

1. 背景&#xff1a; 使用 MindSpore 学习神经网络&#xff0c;打卡第 25 天&#xff1b;主要内容也依据 mindspore 的学习记录。 2. Diffusion 介绍&#xff1a; Diffusion也是从纯噪声开始通过一个神经网络学习逐步去噪&#xff0c;最终得到一个实际图像。 具体的 Diffusi…

二进制部署k8s集群之CoreDNS部署及多master节点负载均衡以及高可用(下)

目录 1.部署 CoreDNS 2.在master01节点基础上&#xff0c;完成master02节点部署 3.部署nginx做负载均衡器 4.部署keepalived做高可用 1.部署 CoreDNS CoreDNS&#xff1a;CoreDNS 是 Kubernetes 的默认 DNS 实现。可以为 K8S 集群内的 Pod 提供 DNS 服务。 使用 CoreDNS 可…

【C++BFS】1162. 地图分析

本文涉及知识点 CBFS算法 LeetCode1162. 地图分析 你现在手里有一份大小为 n x n 的 网格 grid&#xff0c;上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋&#xff0c;1 代表陆地。 请你找出一个海洋单元格&#xff0c;这个海洋单元格到离它最近的陆地单元格的距…

67.利用FreeLibrary函数实现无痕注入的核心代码

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;66.FreeLibrary隐藏模块 以 65.破坏特征码防止内存定位查杀 它的代码为基础进行修改 效…

前端实现文本超出指定行数显示”展开”和”收起”效果

目录 效果演示步骤一&#xff1a;实现整体框架步骤二&#xff1a;实现样式步骤三&#xff1a;js实现元素控制完整代码 效果演示 本文方法是利用js原生进行实现的&#xff0c;可根据相关vue或react语法进行相关的改写&#xff0c;并实现效果 步骤一&#xff1a;实现整体框架 <…

今天分享分享缓冲器小故事

在一个繁华都市的角落&#xff0c;有一家小小的修理铺。铺子里堆满了各种老旧的机械零件和工具&#xff0c;而铺子的主人是一位名叫老陈的工匠。 老陈手艺精湛&#xff0c;尤其擅长修理那些复杂而精密的机械。但他的铺子生意却一直不温不火&#xff0c;因为在这个快节奏的时代…

⌈ 传知代码 ⌋ 使用稀疏查询进行3D目标检测

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Linux基础知识之Shell命令行及终端中的快捷键

1.察看历史命令快捷键 按键 操作 ctrl p 返回上一次输入命令字符 ctrl n 返回下一次输入命令字符 ctrl r 输入单词甚至词组搜索匹配历史命令 alt p 输入字符查找与字符相接近的历史命令 alt . 向之前执行的命令的最后一个参数轮循, 并将之添加到当前光标之后…

WPF数据绑定对象Binding中的辅助属性

以下案例使用的统一的数据源&#xff1a; public class Data{public string Value { get; set; } "123";public int IntValue { get; set; } 100;public float FloatValue { get; set; } 0.114f;public DateTime DateTimeValue { get; set; } DateTime.Now;publi…

《品牌与观察》深度剖析:格行如何成为随身WiFi行业标杆?如何成为排名第一名随身WiFi?央视推荐的随身WiFi!官方认证的随身WiFi!

在随身WiFi行业乱象频发的背景下&#xff0c;格行以一股清流之姿&#xff0c;毅然决然地选择了一条“难而正确”的道路——大力发展线下门店&#xff0c;发展续航技术以品质和服务重塑市场格局。格行现已宣布其线下合作门店已突破万家&#xff0c;并且续航技术已经遥遥领先于其…

计算机毕业设计选题推荐-医疗废物管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

思科认证有哪些?有什么区别?选哪个比较好?考试多少钱?

思科认证体系庞大且全面&#xff0c;涵盖了从基础到高级的多个方向和等级。那么&#xff0c;思科认证究竟有哪些?有什么区别?选哪个比较好?考试多少钱&#xff1f;下面将为您一一揭晓。 思科认证有哪些? 思科认证体系丰富多样&#xff0c;涵盖了从基础到高级的多个层次和…

AI助力工艺|利用机器学习实现泡沫浮选工艺优化

浮选是一种矿物处理过程&#xff0c;它利用矿物颗粒的自然疏水性或通过添加化学试剂使其变得疏水&#xff0c;从而使它们能够附着在空气泡上&#xff0c;从矿浆中分离出来。在处理铁矿石时&#xff0c;浮选过程特别重要&#xff0c;因为它可以帮助减少二氧化硅&#xff08;SiO2…