SQL存储过程和视图

 1 存储过程

存储过程是事先编写好、存储在数据库中的一组SQL命令集合。用来完成对数据库的指定操作。

1.1 优缺点

优点:

1)提高系统性能。创建时进行编译,随后存放在数据库服务器的过程高速缓存中,之后不需要再次执行分析和编译操作,节省了分析、解析和优化SQL代码所需的时间。

2)可自动完成需要预先执行的任务。

缺点:

1)每个连接的内存使用量将增加。

2)开发和维护困难、可移植性差。

1.2 mysql变量

sql变量按范围可划分为三类:

1)全局变量(系统变量),对所有会话生效,需具备super权限才能设置。SET GLOBAL 变量名。

注意:全局变量不能被定义只能修改,只能设置已存在的系统变量,否则报错

2)会话变量,对当前会话生效。SET @变量名或者SET @@变量名。

3)局部变量,作用返回在BEGIN与END之间。

DECLARE

1)设置局部变量。

2)不能以@开始

SET

1)可以以@开始

2)定义会话变量或设置全局变量。

表DECLARE 与 SET的区别

DROP VARIABLE 变量名,删除变量。

1.2.1 变量赋值

1)使用set。 set @变量名 = 变量值 或 set @变量名 := 变量值;

SET @val1 = "123";

SET @val2 := "abc";

2)使用SELECT。必须使用 “:=”,不能使用 “=”(其此时代表比较是否相等)。 注意:SELECT赋值变量时,变量前面一定要是@

SELECT @变量名 := 变量值;

SELECT @val3 := "edf";

SELECT @变量名:= 字段名 FROM table_name WHERE ... LIMIT 0,1; (如果查询结果不止一个,则取结果的最后一个)

SELECT @money := money FROM student WHERE money > 0 LIMIT 0,1;

1.3 定义

存储过程有三种类型变量:1)IN,输入参数;2)OUT,输出参数;3)INOUT,输入/输出参数。

其基本语法如下;

1)语句必须在BEGIN与END之间。

2)DECLARE 来声明变量,默认值在其后面加DEFAULT 值。

3)改变变量值,使用SET 变量=值。

4)调用使用CALL。

5)mysql 不支持 CREATE OR REPLACE PROCEDURE 语法,可以用DROP PROCEDURE IF EXISTS 存储过程名;来删除特定的存储过程。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_age INT,OUT p_count INT)BEGINSELECT @count := COUNT(*) FROM student WHERE age > p_age;SET p_count = @count;END;CALL demo(18,@count);SELECT @count;

1.3.1 条件控制 IF ELSE 与 CASE

只能在BEGIN 及 END 之间使用IF ELSE。需要以 END IF 结尾。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE tempChar CHAR(24);IF p_num = 1 THEN SET tempChar = '一';ELSEIF p_num = 2 THEN SET tempChar = '二';ELSE SET tempChar = "其他";END IF;SELECT tempChar;END;CALL demo(1);CALL demo(5);

注意:不能在SELECT 中直接使用IF ELSE,下面代码是错误的:

SELECTIF p_num = 1 THEN '一';ELSE '其他';END IF;CASE WHEN使用范围更广,可在SELECT中直接使用,需要以END结尾。SELECTCASE ageWHEN 17 THEN '十七'WHEN 18 THEN '十八'ELSE '其他'END AS ageFROM student       

1.3.2 循环 LEAVE与ITERATE

循环需要有个标签,LEVAE相当于Java的break,而ITERATE相当于continue。循环体位于 标签名:LOOP 与 END LOOP 标签名之间。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE p_count INT DEFAULT 0;DECLARE p_pos INT DEFAULT 0;myLabel: LOOPSET p_pos = p_pos + 1;IF p_pos > p_num THENLEAVE myLabel;END IF;IF MOD(p_pos,2) = 1 THENITERATE myLabel;END IF;SET p_count = p_count + 1;END LOOP myLabel;SELECT p_count;END;

1.4 与函数对比

存储过程

函数

返回值

返回0个、一个或多个结果集

有且只有一个结果值。

调用方式

call调用

可以直接在SELECT中使用。

参数

有三种类型 IN、OUT、INOUT

只有类似IN类型参数

其他限制

可以用临时表

不能用临时表

表 存储过程与函数的对比

2 视图

视图是一种虚拟表(逻辑表),本身并不包含数据,作为一个SELECT语句保存在数据字典中。由一个或多个表(报告视图)查询而动态生成的表。

2.1 优缺点

优点:

简单、安全、数据独立。

缺点:

1)性能较低。

2)维护复杂,每当修改与视图相关的基表的表结构时,都必须进行视图更改操作。

3)修改限制,当用户试图修改视图信息时,数据库必须把它转化为对基表的某些信息的修改。对于比较复杂的试图,可能就不能进行修改了。

2.2 定义

简单创建视图的语法为:

CREATE VIEW 视图名 AS SELECT 查询语句;

对于单表的视图,我们可以像对待基表一样对其进行增删改操作(结果最终会作用于基表)。

2.2.1 创建语法

CREATE[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

ALGORITHM:创建视图使用的算法。UNDEFINED,默认值,不指定算法(没指定时一般采用merge算法);MERGE,合并算法,在基于视图创建新的视图时,将创建旧视图所使用的SELECT语句与将要创建新的视图的SELECT语句进行合并处理,效率更高;TEMPTABLE,临时表算法,在基于视图创建新的视图时,先执行旧视图的SELECT语句,然后再执行新视图的SELECT语句,效率较低。

DEFINER:视图创建者。user 为指定创建的用户;CURRENT_USER为当前登录用户。

SQL SECURITY:视图的安全策略。DEFINER 默认值,验证是否拥有对视图本身的权限;INVOKER,验证对视图的权限及对视图所涉及到的表的权限。

WITH:更改视图数据时,对更改的数据进行检查。基本检查策略是,当更改视图中的数据时,如更改之后的结果不符合创建该视图的权限,则不允许。CASCADED和LOCAL都具备基础检查策略。LOCAL,如果该视图关联了其他视图,对视图进行数据操作时,只需满足当前视图的创建条件即可。CASCADED,既要符合当前视图的条件,也要符合关联视图的条件。

CREATEALGORITHM=MERGEDEFINER=CURRENT_USERSQL SECURITY INVOKERVIEW student_viewAS SELECT * FROM studentWITH CASCADED CHECK OPTION;

通过GRANT <权限> ON <数据对象> TO <数据库用户> 来进行授权:

GRANT SELECT,UPDATE ON study.student_view TO 'root'@'localhost';

通过REVOKE <权限> ON <数据对象> FROM <数据库用户> 来移除授权:

REVOKE SELECT ON study.student_view FROM 'root'@'localhost';

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

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

相关文章

uniapp app将base64保存到相册,uniapp app将文件流保存到相册

如果是文件流可以先转base64详情见>uniapp 显示文件流图片-CSDN博客 onDown(){let base64 this.qrcodeUrl ; // base64地址const bitmap new plus.nativeObj.Bitmap("test");bitmap.loadBase64Data(base64, function() {const url "_doc/" new Dat…

Backend - Dbeaver

目录 一、说明 二、下载并安装 &#xff08;一&#xff09;官网下载 &#xff08;二&#xff09;安装 三、使用 &#xff08;一&#xff09;操作步骤 &#xff08;二&#xff09;相关问题&#xff1a;无法加载驱动类oracle.jdbc.oracledriver 1. 新建驱动 2. 再重新连接数据库 …

PyTorch2.0环境搭建

一、安装python并配置环境变量 1、打开python官网&#xff0c;下载并安装 Welcome to Python.org 下载 寻找版本&#xff1a;推荐使用3.9版本&#xff0c;或其他表中显示为安全&#xff08;security&#xff09;的版本 安装&#xff1a;&#xff08;略&#xff09; 2、配置环…

数据增强改进,实现检测目标copypaste,增加目标数据量,提升精度

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

python圣诞树代码编程

以下是一个简单的Python圣诞树代码&#xff1a; def draw_tree(height): for i in range(height): print( * (height - i - 1) * * (2 * i 1)) print( * (height - 1) |)draw_tree(10) 这个函数会绘制一个等腰三角形&#xff0c;其中每一行的星号数量从1开…

Java基础知识

JVM&#xff0c;JRE&#xff0c;JDK JVM 运行Java字节码的机器 JRE Java运行时环境&#xff0c;包括JVM&#xff0c;Java类库&#xff0c;运行时类库&#xff0c;国际化支持&#xff0c;安全管理器&#xff0c;启动器等 比JVM多的内容 Java类库&#xff1a;提供大量已经实…

【TiDB理论知识09】TiFlash

一 TiFlash架构 二 TiFlash 核心特性 TiFlash 主要有 异步复制、一致性、智能选择、计算加速 等几个核心特性。 1 异步复制 TiFlash 中的副本以特殊角色 (Raft Learner) 进行异步的数据复制&#xff0c;这表示当 TiFlash 节点宕机或者网络高延迟等状况发生时&#xff0c;Ti…

亿胜盈科ATR2037 无限射频前端低噪声放大器

亿胜盈科ATR2037 是一款应用于无线通信射频前端&#xff0c;工作频段为 0.7 到 6GHz 的超低噪声放大器。 ATR2037 低噪声放大器采用先进的 GaAs pHEMT 工艺设计和制作&#xff0c;ATR2037 低噪声放大器在整个工作频段内可以获得非常好的射频性能超低噪声系数。 亿胜盈科ATR203…

WGCLOUD v3.5.0 新增支持监测交换机的接口状态UP DOWN

WGCLOUD v3.5.0开始 可以监测交换机或SNMP设备的接口状态了&#xff0c;直接上图

什么是ElasticSearch中的过滤器?

在Elasticsearch中&#xff0c;过滤器&#xff08;Filters&#xff09;是一种用于在查询中筛选文档的强大工具。过滤器可以根据特定条件来评估文档是否符合搜索查询。这些条件通常应用于字段数据&#xff0c;并根据匹配结果返回符合条件的文档。 过滤器的主要优点包括&#xf…

如何给网页和代码做HTML加密?

​ 本篇文章给大家谈谈html混淆加密在线&#xff0c;以及HTML在线加密对应的知识点&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 如何给代码加密? 1、源代码加密软件推荐使用德人合科技的加密软件&#xff0c;是一套从源头上保障数据安全和使用安全的软…

vue2+datav可视化数据大屏(1)

开始 &#x1f4d3; 最近打算出一个前端可视化数据大屏的系列专栏&#xff0c;这次将很全面的教大家设计可视化大屏&#xff0c;从开始到打包结束&#xff0c;其中&#xff0c;包括如何设计框架&#xff0c;如何封装axios&#xff0c;等等&#xff0c;本次使用的数据均为mock数…

linux C++监听管道文件方式

方式一&#xff08;传统读取文件&#xff0c;一直监听循环读取文件&#xff09; 非阻塞打开文件&#xff0c;用read循环定时读取&#xff0c;性能不好 代码如下&#xff1a; #include <iostream> #include <fstream> #include <functional> #include <…

spring boot项目如何自定义参数校验规则

spring boot项目对参数进行校验时&#xff0c;比如非空校验&#xff0c;可以直接用validation包里面自带的注解。但是对于一些复杂的参数校验&#xff0c;自带的校验规则无法满足要求&#xff0c;此时需要我们自定义参数校验规则。自定义校验规则和自带的规则实现方式一样&…

时域频域(学习记录1)

1 小伙伴们&#xff0c;今天让我们一起来聊聊Something about DATA 系列。我们先回顾一下本系列对NVH测试中的数据采集做的整体介绍&#xff1a; A 数据采集过程&#xff1b; B 硬件设备&#xff1b; C 数采软件&#xff1b; D ATOM中的数据采集&#xff1b; 接下来的几篇文章…

java如何编写 Restful API

一、什么是RESTful API RESTful API是指符合REST&#xff08;Representational State Transfer&#xff09;架构风格的API。RESTful API是一种架构设计风格&#xff0c;它基于HTTP协议&#xff0c;使用常见的HTTP方法&#xff08;例如GET、POST、PUT、DELETE等&#xff09;对资…

cmake生成表达式

不积小流&#xff0c;无以成江海 <CONFIG:RELEASE> config这个关键字&#xff0c;主要是看CMAKE_BUILD_TYPE这个变量的值是不是和冒号后的一样&#xff0c;一样的话就返回true, 否则就是false. cmake_minimum_required(VERSION 3.10) project(Test) set(CMAKE_CXX_STA…

数据结构--二叉树

目录 1.二叉树链式结构的实现 1.1 前置说明 1.2 二叉树的遍历 1.2.1 前序、中序以及后序遍历 1.2.2 层序遍历及判断是否为完全二叉树 1.3 节点个数&#xff0c;叶子节点个数&#xff0c;第k层节点个数以及高度等 1.4 二叉树的创建和销毁 1.二叉树链式结构的实现 1.1 前置说…

Mysql启动占用内存过高解决

Hi, I’m Shendi Mysql启动占用内存过高解决 前言 最近服务器内存不够用了&#xff0c;甚至还出现了内存溢出问题&#xff0c;导致程序宕机。但请求与用户量并没有多少&#xff0c;所以从各种启动的程序中想方设法的尽可能的减少其占用的内存。 而在我的服务器中&#xff0c;…

几何尺寸智能测量仪为您带来经济效益提升

线材、棒材、管材、板材等产品的品质检测离不开一些基础几何尺寸的检测&#xff0c;随着产线自动化的提升&#xff0c;越来越多的产线开始使用智能测量仪&#xff0c;这不仅仅是因为其能带来品质的提升&#xff0c;更是因为其能带来的经济效益。 几何尺寸智能测量仪种类繁多&am…