MySQL的视图、存储过程、触发器

视图

  • 介绍
    • 视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
    • 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
  • 创建
    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 CHECK OPTION 子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入、更新、删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查范围,mysql提供了两个选项:CASCADED 和 LOCAL ,默认值为 CASCADED。
  • 视图的更新
    • 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系,如果视图包含以下任何一项,则该视图不可更新:
      • 聚合函数或窗口函数(SUM()、MIN()、MAX()、COUNT()等)
      • DISTINCT
      • GROUP BY
      • HAVING
      • UNION 或者 UNION ALL
  • 作用
    • 简单
      • 视图不仅可以简化用户对数据的理解,也可以简化他们的操作。哪些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件
    • 安全
      • 数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能看见的数据
    • 数据独立
      • 视图可帮助用户屏蔽真实表结构变化带来的影响。

存储过程

  • 介绍
    • 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。
  • 特点
    • 封装、复用,可以接收参数,也可以返回数据,减少网络交互,效率提升
  • 创建
    CREATE PROCEDURE 存储过程名称([参数列表])
    BEGIN
       
        --SQL语句
    END;
  • 调用
    CALL 名称([参数]);
  • 查看
    SELECT * FROM INFORMATION)SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='xxx'; --查询指定数据库的存储过程及状态信息
    SHOW CREATE PROCEDURE 存储过程名称; --查询某个存储过程的定义
  • 删除
    DROP PROCEDURE [IF EXISTS] 存储过程名称;
  • 注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符。
  • 变量
    • 系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOVAL)、会话变量(SESSION)。
      • 查看系统变量
        --查看所有系统变量
        SHOW [SESSION|GLOBAL] VARIABLES;     
        --可以通过LIKE模糊匹配方式查找变量
        SHOW [SESSION|GLOBAL] VARIABLES LIKE '......';  
        --查看指定变量的值
        SELECT @@[SESSION|GLOBAL] 系统变量名;
      • 设置系统变量 
        SET [SESSION|GLOBAL] 系统变量名=值;
        SET @@[SESSION|GLOBAL]系统变量名=值;
      • 注意:
        • 如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量。
        • 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。
    • 局部变量 变量是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN...END块。
      • 声明
        DECLARE 变量名 变量类型[DEFAULT...];

        变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等

      • 赋值
        SET 变量名=值;
        SET 变量名:=值;
        SELECT 字段名 INTO 变量名 FROM 表名...;
  • if
    • 语法
      IF 条件1 THEN
          ......
      ELSEIF 条件2 THEN                    --可选
          ....
      ELSE                                --可选
          ...
      END IF;
  • 参数
    类型含义备注
    IN该类参数作为输入,也就是需要调用时传入值默认
    OUT该类参数作为输出,也就是该参数可用作为返回值
    INOUT既可以作为输入参数,也可用作为输出参数
    • 用法
      CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
      BEGIN
          --SQL语句
      END;
  • case
    • 语法1
      CASE case_value
          WHEN when_value1 THEN statment_list1
          [WHEN when_value2 THEN statment_list 2]...
          [ELSE statment_list]
      END CASE;
    • 语法2
      CASE 
          WHEN search_condition1 THEN statment_list1
          [WHEN when_value2 THEN statement_list2]...
          [ELSE statement_list]
      END CASE;
  • while
    • while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:
      #先判定条件,如果条件为true,则执行逻辑,否则不执行逻辑
      WHILE 条件 DO
          SQL逻辑...
      END WHILE;
  • repeat
    • repeat是有条件的循环控制语句,当满足条件的时候退出循环。具体语法:
      #先执行一次逻辑,然后判断逻辑是否满足,如果满足,则退出。如果不满足,则继续下一次循环
      REPEAT
          SQL逻辑...
          UNTIL 条件
      END REPEAT;
  • loop
    • LOOP 实现简单的循环,如果不再SQL逻辑中增加退出循环的条件,可用用其来实现简单的死循环。LOOP可以配合以下两个语句使用:
      • LEAVE:配合循环使用,退出循环。
      • ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
        [begin_label:] LOOP
            SQL逻辑...
        END LOOP [end_label];
        --退出指定标记的循环体
        LEAVE label;
        --直接进入下一次循环
        ITERATE label;
  • 游标
    • 游标(CURSOR)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声、OPEN、FETCH 和 CLOSE ,其语法分别如下。
      • 声明游标
        DECLARE 游标名称 CURSOR FOR 查询语句;
        
      • 打开游标

        OPEN 游标名称;
      • 获取游标记录

        FETCH 游标名称 INTO 变量[,变量];
      • 关闭游标

        CLOSE 游标名称;
    • 条件处理程序

      • 条件处理程序(Handler)可以用来定义在流程控制结构中遇到问题时相应的处理步骤。具体语法为:

        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:所有以02开头的SQLSTATE代码简写
            SQLEXCEPTION:所有没有被SQLWARNING 或 NOT FOUND 捕获的SQLSTATE代码的简写

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下:

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS type [characteristic ...]
BEGIN
    --SQL语句
    RETURN...;
END;

characteristic说明:
    DETERMINISTIC:相同的输入参数总是产生相同的结果
    NO SQL:不包含SQL语句
    READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。

触发器

介绍

触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

触发器类型NEW 和 OLD
INSERT 型触发器NEW 表示将要或者已经新增的数据
UPDATE 型触发器OLD 表示修改之前的数据,NEW 表示将要或已经修改后的数据
DELETE 型触发器OLD 表示将要或者已经删除的数据

  • 语法
    • 创建
      CREATE TRIGGER trigger_name
      BEFOR/AFTER INSERT/UPDATE/DELETE
      ON tbl_name FOR EACH ROW --行级触发器
      BEGIN
          tirgger_stmt;
      END;
    • 查看
      SHOW TRIGGERS;
    • 删除
      DROP TRIGGER [schema_name.]trigger_name; --如果没有指定 schema_name ,默认为当前数据库。

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

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

相关文章

【linux-IMX6ULL中断配置流程】

目录 1. Cortex-A7和GIC中断概述1. 1 Cortex-A7中断系统:1. 2 GIC中断控制器简介: 2. 中断配置概述3. 底层中断文件配置3.1 对启动文件.s的配置思路3.2 对中断函数配置思路 4. 上层中断配置流程 1. Cortex-A7和GIC中断概述 学习IMX6UL的中断处理系统&…

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家…

独有病眼花,春风吹不落。 (二维坐标压缩成一个点,并查集)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 3 8 1 1 D 1 1 R 1 2 D 2 1 D 2 2 R 3 1 R 3 2 R 2 3 D 输出 8 思路: 根据题意,要求连接线段后,操作多少次,连接的线段闭合&…

javaweb学习笔记1

1、基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动态web 淘宝,几乎是所有的网站; 提供给所有人看的数据始终会发生变化&…

00后设计师如何通过咸鱼接单实现副业月入过万?

大家好,我是一个00后,拥有6年设计经验的平面/包装/品牌设计师。在裸辞探索自由职业的过程中,误打误撞地通过咸鱼接单做副业,首月收入竟然超过了万元!在这里,我将分享具体的实操经验、心得体会以及一些额外的…

c++游戏小技巧16:实例1(地牢生成算法)

1.前言 (头图) (其实最开始是想写恶魔轮盘的,但没想到它竟然更新了) (等我有时间在更,最近很忙,玩第五玩的) 想法来源:房间和迷宫:一个地牢生成算法https://indienova…

【牛客】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…

MIT加州理工等革命性KAN破记录,发现数学定理碾压DeepMind!KAN论文解读

KAN的数学原理 如果f是有界域上的多元连续函数&#xff0c;那么f可以被写成关于单个变量和加法二元操作的连续函数的有限组合。更具体地说&#xff0c;对于光滑函数f&#xff1a;[0, 1]ⁿ → R&#xff0c;有 f ( x ) f ( x 1 , … , x n ) ∑ q 1 2 n 1 Φ q ∑ p 1 n …

解决Pyppeteer下载chromium慢或者失败的问题[INFO] Starting Chromium download.

文章目录 1.进入网址2.选择上面对应自己系统的文件夹进去3. 然后找到自己的python环境中的site-packages中pyppeteer中的chromium_downloader.py文件并打开 在首次使用Pyppeteer时需要下载chromium 1.进入网址 https://registry.npmmirror.com/binary.html?pathchromium-bro…

贪心算法应用例题

最优装载问题 #include <stdio.h> #include <algorithm>//排序int main() {int data[] { 8,20,5,80,3,420,14,330,70 };//物体重量int max 500;//船容最大总重量int count sizeof(data) / sizeof(data[0]);//物体数量std::sort(data, data count);//排序,排完数…

品高虚拟化后端存储的发展演进

在品高虚拟化技术不断发展的过程中&#xff0c;虚拟化的后端存储一直是关注的焦点之一。 本文将从最初的文件存储和NFS开始&#xff0c;追溯到集中式存储SAN&#xff0c;然后选择了Ceph的RBD方式&#xff0c;并最终抵达选择支持vhost协议的后端存储的现状&#xff0c;我们将探…

使用wxPython和pandas模块生成Excel文件

介绍&#xff1a; 在Python编程中&#xff0c;有时我们需要根据特定的数据生成Excel文件。本文将介绍如何使用wxPython和pandas模块来实现这个目标。我们将创建一个简单的GUI应用程序&#xff0c;允许用户选择输出文件夹和输入的Excel文件&#xff0c;并根据Excel文件中每个单…

图像处理技术与应用(四)

图像处理技术与应用入门 颜色空间及其转换 颜色空间是一种用于在数字图像中表达和指定颜色的方法。不同的颜色空间使用不同的方式来定义颜色&#xff0c;每种方式都有其特定的用途和优势。以下是一些常见的颜色空间及其特点&#xff1a; RGB&#xff08;红绿蓝&#xff09;&a…

每日一题(PTAL2):列车调度--贪心+二分

选择去维护一个最小区间 代码1&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int num;vector <int> v;int res0;for(int i0;i<n;i){cin>>num;int locv.size();int left0;int rightv.size()-1;while(left<…

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么&#xff1f;基于AIGC原理以及技术更迭的思考 前言 AI&#xff0c;这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物&#xff0c;更有意思的是&#xff0c;出现频率仅次于这个词的&#xff0c;几乎都会加上一个修饰亦或是前缀——AI&#…

快速排序找出第K大的元素

有序数组里第 K 大的元素就是index 为 array.length - k 的元素。 快速排序的思路主要就是选一个基准值p&#xff0c;然后将小于p的值放在p的左右&#xff0c;大于p的值放在p的右边&#xff0c;然后对左右数组进行递归。 利用这个思路&#xff0c;当我们找到这个基准值对应的 i…

【教学类-50-14】20240505“数一数”图片样式12:数一数(12个“人物”图案)

作品展示 背景需求&#xff1a; 前文做了“”材料”图片的数一数学具&#xff0c;效果不错&#xff0c; https://blog.csdn.net/reasonsummer/article/details/138466325https://blog.csdn.net/reasonsummer/article/details/138466325 为了让图案内容更丰富&#xff0c;我又…

Python Dash库:一个Web应用只需几行代码

大家好&#xff0c;在数据科学领域&#xff0c;数据可视化是将数据以图形化形式展示出来&#xff0c;帮助我们更直观地理解数据。Python中有一个非常流行的数据可视化库叫做Dash&#xff0c;Dash以其简洁、高效和强大的功能而闻名&#xff0c;它允许开发者快速构建交互式Web应用…

【智能算法】人类进化优化算法(HEOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;J Lian受到人类进化启发&#xff0c;提出了人类进化优化算法&#xff08;Human Evolutionary Optimization Algorithm, HEOA&#xff09;。 2.算法原理 2.1算法思想 …

JavaWEB 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…
最新文章