[沫忘录]MySQL储存对象

[沫忘录]MySQL储存对象

视图

视图本质是对原表(基表)显示上的裁剪,可以当作表进行操作,其操作的结果会直接反馈到原表上,即对视图的操作实质上是对原表的操作。
MySQL不仅支持为基表创建视图,同时也支持为视图创建视图。

基本语法
视图创建
CREATE [OR REPLACE] VIEW 视图名称 AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]

视图查询
#查看创建视图语句
SHOW CREATE VIEW 视图名称;
#查看视图数据(把视图当表操作)
SELECT * FROM 视图名称...;

视图修改
#方式一
#同视图创建,使用关键字OR REPLACE
#方式二
ALTER VIEW 视图名称 AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]

视图删除
DROP VIEW [IF EXISTS] 视图名称
检查选项

当我们创建视图时,添加了限制条件,例如只查询id>10的数据,那么创建的数据只会引用id>10的数据。如果我们通过视图添加了id<10的数据,虽然数据会添加到基表,但视图仍只会显示id>10的数据。这再次表明视图是对基表显示上的裁剪。

但很多时候我们希望对基表的操作限制在视图范围内,避免在视图范围内"不可视"的操作,而增加检查选项可以有效解决这一问题。

检查选项可以有效检查插入、更新和删除等操作,以使其符合视图的定义。

WITH CASCADED CHECK OPTION
#向上检查所有视图及父视图是否满足视图范围
WITH LOCAL CHECK OPTION
#只检查当前视图是否满足视图范围

#当我们在视图中插入数据时,会向上检查所有父视图是否有检查选项。
更新及作用

视图的更新

如果视图中某一待修改元组不是基表上对应元组的子集,则该视图无法被更新。

怎样会造成元组无法对应的情况呢?

  1. 使用聚合函数(COUNT, MAX, SUM)、窗口函数或GROUP BY等会造成多对一字段、一对多字段或字段对应函数计算值。
  2. 使用DISTINCT、HAVING 或UNION(UNION ALL)等关键字时,会导致元组的索引条件不明确,无法定位到对应基表上的元组,故无法更新。

视图作用

  • 便捷性

    常用的SQL查询可被定义为视图,减少了数据范围和查询条件,既简化用户对数据的理解,也简化对数据的操作。

  • 安全性

    数据库只能数据库和表进行权限操作。而通过视图则将权限操作限定到行和列。这样通过视图用户只能查询和修改他们所能见到的数据。

  • 数据独立性

    当表的某字段名发生变化时,往往需要修改和此字段相关的所有SQL语句。而创建视图时为修改字段起固定别名能否屏蔽这种变化,使基于此视图的SQL语句都不会受到影响。

存储过程

储存过程是事先经过编译并储存在数据库中的一段SQL语句的集合(类似于函数对整块执行逻辑的封装)。这种封装能够有效简化开发人员的很多工作,减少数据在数据库和应用服务器之间的传输(调用存储过程可减少对SQL语句的调用次数),对于提高数据处理过程的效率是有好处的。

  • 特点

    1. 封装性和复用性。
    2. 能够接受传出数据。
    3. 减少网络交互,效率提升。
存储过程语法
#创建
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
	SQL语句;
END;

#调用
CALL 名称([参数]);

#查看
#查看指定数据库的所有存储过程的属性信息
SELECT * FROM information_schema.ROUTINES WHERE = '数据库名';
#查看储存过程的创建语句
SHOW CREATE PROCEDURE 名称;

#删除
DROP PROCEDURE [IF EXISTS] 存储过程名称;

特别注意:

在储存过程中SQL语句以分号结尾,储存过程结束也是以分号结尾,而在命令行中分号是执行结束的标志,因此我们需要重新设置结束符。

#手动设置结束符
delimiter $$(可设置为其他符号)
变量

系统变量

​ MySQL服务器提供, 属服务层。分为全局变量(GLOBAL)、会话变量(SESSION)。

#查看系统变量
SHOW [GLOBAL|SESSION] VARIABLES [LIKE ''];
SELECT @@[GLOBAL|SESSION] 指定系统变量名;

#设置系统变量
SET [SESSION | GLOBAL] KEY = VALUE;
SET @@[SESSION | GLOBAL] KEY = VALUE;

用户定义变量

​ 用户变量不需提前声明,使用时直接用"@变量名"使用即可。作用域为当前连接。

#赋值
SET @VAR =[| :=] VALUE[,@VAR2=VALUE2]...;
SELECT @VAR =[| :=]VALUE[...];
SELECT 字段值 INTO @VAR FROM 表名;#将查询结果储存进用户变量。

#查询
SELECT @VAR;

局部变量

​ 局部变量在局部生效。访问前需要declare声明。可作为储存过程内的局部变量和输入参数。

#声明
DECLARE 变量名 变量类型[default 默认值];

#赋值操作同用户变量
if
IF 条件1 THEN
...
ELSEIF 条件2 THEN 
...
ELSE
...
END IF;
参数IO
  • IN: 参数输入,调用时的传入值
  • OUT: 参数输出,参数能做返回值
  • INOUT: 输入输出参数
CREATE PROCEDURE 储存过程名([IN|OUT|INOUT 参数名 参数类型])
...
#示例
CALL p1(input, @outout);
case
CASE 判断值
	WHEN 值1 THEN ...
	[WHEN 值2 THEN ...]
	[ELSE ...]
END CASE;
#-----------------------
CASE 
	WHEN 条件1 THEN ...
	[WHEN 条件2 THEN ...]
	[ELSE ...]
END CASE;
while
WHILE 条件 DO
	SQL逻辑...
END WHILE;
repeat
REPEAT
	SQL逻辑
	UNTIL 条件
END REPEAT
loop

​ loop循环没有退出条件,需配合中断语句来使用。

  • LEAVE: 在循环中退出循环(break)
  • ITERATE: 在循环中跳过本轮(continue)
[label:]LOOP
	SQL 逻辑...
END LOOP [label];
#----------------
LEAVE label;
ITERATE label;
游标cursor

​ 游标是用来储存结果集的数据类型,在储存过程和函数中可以使用游标对结果进行循环的处理。

#声明游标, 游标使用的局部变量的声明应先于游标
DECLARE 游标名 CURSOR FOR 查询语句
#打开游标
OPEN 游标名;
#获取游标内数据
FETCH 游标名 INTO 变量[,变量2]...;#变量数等同于游标行字段数
#关闭游标
CLOSE 游标名;

当游标内有多行数据,就需要通过循环进行取值,但我们需要通过一些手段使游标内数据读完时能够退出循环——条件处理程序。

条件处理程序(handler)

​ 条件处理程序能够处理在流程控制结构执行过程中遇到问题时相应的处理步骤。

DECLARE handler_action HANDLER FOR contition_variable [,...] statement;
handler_action:
	CONTINUE: 继续执行
	EXIT: 终止退出
condition_value:
	SQLSTATE sqlstate_value(状态码, 如02000)
	SQLWARNING(所有以01开头的SQLSTATE代码简写)
	NOT FOUND(所有以02开头的SQLSTATE代码简写)
	SQLEXCEPTION(所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码简写)
statement:
	当handler满足时执行的SQL语句

存储函数

在这里插入图片描述

存储函数适用场景被储存过程覆盖,故存储函数较少用。

触发器

触发器是与表有关的数据库对象,能够在insert/update/delete前后执行定义的SQL语句集合。这种特性可以辅助完成数据完整性确保,日志记录和数据校验等操作。

使用别名OLD和NEW可以引用发生变化前后的数据。同时触发器只支持行级触发,不支持语句级触发。
tip: 行级触发指SQL语句对多行数据(元组)造成修改时(例如update更新多行),会触发对于次数的触发器操作。而语句级触发无论对多少行数据造成修改,都只触发一次。

基本语法
#创建
CREATE TRIGGER 触发器名字 BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名 FOR EACH ROW
BEGIN 
	SQL语句
END;

#查看
SHOW TRIGGERS;

#删除
DROP TRIGGER [schema_name.]trigger_name; 
如果没有指定schema_name数据库名,则默认当前所在数据库

ate更新多行),会触发对于次数的触发器操作。而语句级触发无论对多少行数据造成修改,都只触发一次。

基本语法
#创建
CREATE TRIGGER 触发器名字 BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名 FOR EACH ROW
BEGIN 
	SQL语句
END;

#查看
SHOW TRIGGERS;

#删除
DROP TRIGGER [schema_name.]trigger_name; 
如果没有指定schema_name数据库名,则默认当前所在数据库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】详解STL容器之一的 vector

目录 概述 迭代器 数据结构 优点和缺点 接口介绍 begin end rbegin rend resize reseve insert erase 其他一些接口 模拟实现 框架 获取迭代器 深浅拷贝 赋值重载 reseve resize 拷贝构造 构造 析构 insert erase 其他 概述 vector是STL的容器之一。…

用户页面触发点击事件和 js 执行点击事件的区别

文章目录 情景展示情况一&#xff1a;用户点击页面触发情况二&#xff1a;通过 js 触发点击 结果分析情况一情况二 其实这个谜底揭开之后&#xff0c;第一反应都是&#xff0c;哦~&#xff0c;非常简单&#xff0c;但是细节决定成败&#xff0c;我被这个细节毁掉了&#xff0c;…

[嵌入式系统-72]:RT-Thread-组件:单元测试框架utest

目录 utest 测试框架 ​编辑 测试用例定义 测试单元定义 utest 应用框图 2. utest API assert 宏 测试单元函数运行宏 测试用例导出宏 测试用例 LOG 输出接口 3. 配置使能 4. 应用范式 5. 测试用例运行要求 6. 运行测试用例 测试结果分析 7. 测试用例运行流程 …

RAG 场景对Milvus Cloud向量数据库的需求

虽然向量数据库成为了检索的重要方式,但随着 RAG 应用的深入以及人们对高质量回答的需求,检索引擎依旧面临着诸多挑战。这里以一个最基础的 RAG 构建流程为例:检索器的组成包括了语料的预处理如切分、数据清洗、embedding 入库等,然后是索引的构建和管理,最后是通过 vecto…

webpack从零到1 构建 vue3

为什么要手写webpack 不用cli &#xff08;无的放矢&#xff09;并不是 其实是为了加深我们对webpack 的了解方便以后灵活运用webpack 的技术 初始化项目结构&#xff08;跟cli 结构保持一致&#xff09; 新建 public src 等文件夹npm init -y 创建package.json文件tsc --init…

【Ubuntu20.04安装java-8-openjdk】

1 下载 官网下载链接&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz&#xff0c;并解压&#xff1a; tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…

NGINX App Protect现已支持NGINX开源版 全方位加强现代应用安全防护

近日&#xff0c;F5 NGINX 发布全新升级的NGINX App Protect 5.0版本&#xff0c;将先前专属于NGINX 商业版本NGINX Plus 的现代应用安全能力拓展至NGINX开源版中&#xff0c;为增强现代应用和API安全防护提供全方位支持。此次升级后&#xff0c;适用于云端及本地部署的NGINX A…

C++:位图和布隆过滤器

一&#xff0c;位图 1.1 位图的概念 究竟什么是位图呢&#xff1f;&#xff1f;我们用一道问题来引入 问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 根据这个问题&#x…

java——嵌套(二)

目录 一&#xff1a;方法的重写&#xff08;覆盖/覆写&#xff09; 1. 方法的重写的意义&#xff1a; 2. 重写&#xff08;overide&#xff09; 3. 案例 二&#xff1a;继承中构造方法的调用 1. 子类的构造方法会默认调用父类的构造方法&#xff1b; 2. super 关键字调用…

基于MPPT最大功率跟踪和SVPWM的光伏三相并网逆变器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪和SVPWM的光伏三相并网逆变器simulink建模与仿真。包括PV模块&#xff0c;MPPT模块&#xff0c;SVPWM模块&#xff0c;电网模块等。 2.系统仿真结果 1不…

JavaScript异步编程——04-同源和跨域

同源和跨域 同源 同源策略是浏览器的一种安全策略&#xff0c;所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口完全相同。 跨域问题的解决方案 从我自己的网站访问别人网站的内容&#xff0c;就叫跨域。 出于安全性考虑&#xff0c;浏览器不允许ajax跨域获取…

二总线,替代传统485总线通讯,主站设计

二总线通信设计专栏 《二总线&#xff0c;替代传统485总线通讯&#xff0c;选型及应用-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;低成本直流载波方案实现及原理-CSDN博客》《二总线&#xff0c;替代传统485总线通讯&#xff0c;调试避坑指南之最大的电流…

基于控制工程的牛鞭效应simulink建模与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 牛鞭效应”对供应链性能和绩效产生了严重的影响。基于控制理论建立了多级线性供应链的模型&#xff0c;分别利用噪声带宽和Matlab&#xff0f;Simulink对一个可扩…

【快捷部署】024_Hive(3.1.3)

&#x1f4e3;【快捷部署系列】024期信息 编号选型版本操作系统部署形式部署模式复检时间024Hive3.1.3Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;cx…

竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

CopyClip for Mac - 高效复制粘贴,轻松管理剪贴板

CopyClip for Mac&#xff0c;一款专为Mac用户打造的剪贴板管理工具&#xff0c;让你在复制粘贴的日常任务中&#xff0c;享受到前所未有的高效与便捷。 它常驻在菜单栏中&#xff0c;时刻准备为你服务。一旦你复制了内容&#xff0c;CopyClip就会自动将其保存至历史记录中&…

使用ffmpeg对视频进行转码(支持浏览器播放)

在开发中&#xff0c;算法保存的mp4视频文件通过路径打开该视频发现视频播放不了&#xff0c;需要转码进行播放。使用java代码进行转码。代码如下&#xff0c;inputFilePath是转之前的视频路径&#xff0c;outputFilePath是转之后的视频路径。ffmpeg命令中libx264也可以改为其它…

经验浅谈!伦敦银如何交易?

近期&#xff0c;伦敦银价格出现很强的上涨&#xff0c;这促使一些新手投资者进入了市场&#xff0c;但由于缺乏经验&#xff0c;他们不知道该怎么在市场中交易&#xff0c;下面我们就从宏观上介绍一些方法&#xff0c;来讨论一下伦敦银如何交易。 首先我们要知道&#xff0c;要…

vue3创建响应式数据ref和reactive的区别

reactive和ref在Vue.js中都是用于创建响应式数据的&#xff0c;但它们之间存在一些区别 定义数据类型不同。ref主要用于定义基本数据类型&#xff0c;如字符串、数字、布尔值等&#xff1b;reactive主要用于定义对象&#xff08;或数组&#xff09;类型的数据&#xff0c;但re…

【uniapp】阿里云OSS上传 [视频上传]

引用uniapp插件市场的插件,使用的是视频上传 &#xff08;阿里云 oss上传&#xff09; 我只使用了H5和App端&#xff0c;需要后端配置跨域 yk-authpup详情请参考 》》【用户告知权限申请的目的】 【插件市场】阿里云存储OSS前端直接上传(全端通用) - 前端JASON <template>…