Mysql--基础篇--视图,存储过程,触发器

1、视图

MySQL视图(View)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

视图作用:

  • 简化复杂的SQL操作:将复杂的SQL查询语句封装成一个简单的视图,用户只需要使用简单的SELECT语句就可以获取到想要的结果。
  • 抽象和保护数据:通过视图,可以只暴露部分数据给用户,隐藏敏感信息或复杂的表结构。
  • 提供一致的数据表示:即使底层表结构发生了变化,只要视图的逻辑不变,基于视图的应用程序就无需更改。
  • 聚合数据:视图可以用来创建汇总数据,比如通过SUM, COUNT等聚合函数对数据进行计算。

创建视图的基本语法如下:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

创建视图示例:
例如,假设有一个名为employees的表,你可以创建一个视图来显示所有部门编号为10的员工信息
sql:

CREATE VIEW dept_10_employees AS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;

创建完视图之后,你可以像查询表一样查询视图。
使用视图:

SELECT * FROM dept_10_employees;

注意:
视图是读取时才执行其定义的查询,因此它们并不占用额外的存储空间(除了存储视图定义本身)。另外,一些视图是可以更新的,即可以通过视图来插入、更新或删除数据,但不是所有的视图都支持这些操作,这取决于视图的复杂程度以及基础表的结构。

2、存储过程

MySQL存储过程(Stored Procedure)是一组预编译的SQL语句,它被作为一个单元存储在数据库中。使用存储过程可以减少网络流量,因为客户端只需要发送一个调用存储过程的请求,而不是多条SQL命令。此外,存储过程还能提高代码的重用性和安全性,简化复杂的操作。

创建存储过程的基本语法如下:

DELIMITER //CREATE PROCEDURE procedure_name (IN parameter1 datatype, OUT parameter2 datatype, INOUT parameter3 datatype)
BEGIN-- SQL statements
END$$DELIMITER ;

解释:

  • DELIMITER //:更改结束符为//,这样可以避免与SQL语句中的分号冲突。
  • CREATE PROCEDURE:定义新的存储过程。
  • procedure_name:存储过程的名称。
  • IN, OUT, INOUT:参数模式,分别表示输入、输出和输入/输出参数。
  • datatype:参数的数据类型。
  • BEGIN … END:存储过程体,包含要执行的一系列SQL语句。
  • DELIMITER ;:还原结束符,更改为默认的;

创建并调用存储过程示例:
假设我们有一个名为employees的表,并且想要创建一个存储过程来获取某个部门的所有员工。
创建存储过程sql:

DELIMITER $$CREATE PROCEDURE get_dept_employees(IN dept_id INT)
BEGINSELECT employee_id, first_name, last_nameFROM employeesWHERE department_id = dept_id;
END$$DELIMITER ;

调用存储过程sql:

CALL get_dept_employees(10);

解释:
这将返回所有属于部门ID为10的员工信息。

带输出参数的存储过程示例:
如果我们需要计算某个部门的平均工资并将其作为输出参数返回
创建存储过程sql:

DELIMITER $$CREATE PROCEDURE avg_salary_by_dept(IN dept_id INT, OUT avg_salary DECIMAL(10, 2))
BEGINSELECT AVG(salary) INTO avg_salaryFROM employeesWHERE department_id = dept_id;
END$$DELIMITER ;

调用存储过程sql:

CALL avg_salary_by_dept(10, @average_salary);
SELECT @average_salary;

解释:
这会计算部门ID为10的员工的平均工资,并将结果存储到用户变量@average_salary中,然后通过SELECT语句显示出来。

修改和删除存储过程:

  • 修改存储过程:可以使用ALTER PROCEDURE命令,但通常需要先删除再重新创建存储过程以更新其内容。
  • 删除存储过程:使DROP PROCEDURE命令,如DROP PROCEDURE IF EXISTS procedure_name;。

注意事项:

  • 存储过程中可以包含控制结构(如IF, CASE, LOOP, REPEAT, WHILE等),以及游标(Cursor)用于逐行处理数据。
  • 如果存储过程内有错误,可能会导致整个事务失败。因此,在编写存储过程时,考虑使用TRY…CATCH(在MySQL 8.0+支持)或适当的错误处理机制。
  • 存储过程是数据库对象的一部分,因此它们的安全性也是重要的考量因素。可以通过权限管理来控制谁可以创建、修改或执行存储过程。

3、触发器

MySQL触发器(Trigger)是一种特殊的存储过程,它在特定的表上执行插入(INSERT)、更新(UPDATE)或删除(DELETE)操作时自动触发。触发器可以用来维护数据的完整性和一致性,执行复杂的业务规则,或者在数据库中实现事件驱动的逻辑。

触发器的组成部分:

  • 触发时机:可以是BEFORE(在操作之前触发)或AFTER(在操作之后触发)。BEFORE通常用于验证和修改输入的数据,而AFTER用于处理已完成的操作。
  • 触发事件:INSERT, UPDATE, 或DELETE,分别对应于插入、更新和删除操作。
  • 表名:触发器关联的表。
  • 触发器体:包含一组SQL语句,这些语句会在触发事件发生时执行。

创建触发器的基本语法:

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
BEGIN-- SQL statements
END;

解释:

  • trigger_name:触发器的名字。
  • {BEFORE | AFTER}:触发器的触发时机。
  • {INSERT | UPDATE | DELETE}:触发器响应的事件类型。
  • table_name:触发器关联的表。
  • FOR EACH ROW:表示这个触发器将在每一行受影响时被调用一次。
  • BEGIN … END:触发器体,其中包含触发器要执行的SQL语句。

触发器中的特殊变量:

  • OLD.column_name:引用旧行的列值,仅适用于UPDATE和DELETE触发器。
  • NEW.column_name:引用新行的列值,仅适用于INSERT和UPDATE触发器。

示例:

(1)、插入时触发的触发器

假设我们有一个名为orders的订单表,并且每次插入新的订单时,我们都想记录下该订单的创建时间。
sql:

DELIMITER $$CREATE TRIGGER insert_order_timestamp
BEFORE INSERT ON orders
FOR EACH ROW
BEGINSET NEW.order_date = NOW();
END$$DELIMITER ;

解释:
orders表中,新增的每一行数据,会在插入前将order_date设置为当前时间。

(2)、更新时触发的触发器

如果我们想要确保价格不能低于0,并且在更新产品价格时记录下最后一次的价格变动。
sql:

DELIMITER $$CREATE TRIGGER update_product_price
BEFORE UPDATE ON products
FOR EACH ROW
BEGINIF NEW.price < 0 THENSET NEW.price = OLD.price; -- 保持原价不变END IF;INSERT INTO price_history (product_id, old_price, new_price, change_time)VALUES (NEW.product_id, OLD.price, NEW.price, NOW());
END$$DELIMITER ;

解释:
更新products表时,如果price字段的新值小于0,则price字段不更新。同时在price_history历史表中插入一条记录。

(3)、删除时触发的触发器

如果我们要在删除用户时,同时删除与该用户相关的所有订单。
sql:

DELIMITER $$CREATE TRIGGER delete_user_orders
AFTER DELETE ON users
FOR EACH ROW
BEGINDELETE FROM orders WHERE user_id = OLD.user_id;
END$$DELIMITER ;

解释:
删除users表数据时,同时删除当前用户在orders 表中的全部关联数据。

管理触发器:

  • 查看触发器:可以使用SHOW TRIGGERS命令来查看当前数据库中的所有触发器。
  • 删除触发器:使用DROP TRIGGER命令来删除一个触发器,如DROP TRIGGER IF EXISTS trigger_name;。

注意事项:

  • 触发器应当谨慎使用,因为它们会增加数据库操作的复杂性,并可能影响性能。
  • 触发器可能会导致意外的行为,特别是在多个触发器相互作用的情况下。因此,测试是非常重要的。
  • 触发器不能直接调用,只能通过它们所关联的表上的DML(数据操纵语言)操作来触发。
  • 在设计触发器时,请考虑事务的影响。触发器内的操作和触发它的DML语句是在同一个事务中执行的。如果触发器内有任何错误,整个事务可能会回滚。

乘风破浪会有时,直挂云帆济沧海!!!

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

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

相关文章

某团 mtgsig1.2 | sdkVersion: 3.0.0 签名算法分析记录(2025/1/9)

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#…

(二)最长公共子序列、最长上升子序列、最大子段和、三角形最小路径和、矩阵连乘、0-1背包

最近刚考完算法设计分析课的考试&#xff0c;复习总结一下期末考试的几道算法题吧 目录 LCR 095. 最长公共子序列 300. 最长递增子序列 53. 最大子数组和 LCR 100. 三角形最小路径和 矩阵连乘问题 0-1背包 LCR 095. 最长公共子序列 给定两个字符串 text1 和 text2&#xff…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

通义灵码在跨领域应用拓展之物联网篇

目录 一.引言 二.通义灵码简介 三.通义灵码在物联网领域的设备端应用 1.传感器数据采集 (1).不同类型传感器的数据读取 (2).数据转换与预处理 2.设备控制指令接收和执行 (1).指令解析与处理 (2).设备动作执行 四.通义灵码在物联网领域的云端平台应用 1.数据存储和管…

python_excel列表单元格字符合并、填充、复制操作

读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字符&#xff0c;删除多余的列&#xff0c;每行复制四次&#xff0c;最后写入新的文件中。 import pandas as pd""" 读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字…

C++ STL 中的 vector 总结

1. 什么是 std::vector&#xff1f; std::vector 是 C STL 提供的动态数组容器&#xff0c;可以动态调整大小并存储任意类型的元素。 与普通数组相比&#xff0c;std::vector 更加灵活&#xff0c;提供了丰富的操作接口。 2. 基本特性 动态大小&#xff1a;支持在运行时动态增…

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务&#xff1a; current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行&#xff1a; 定时周期调度设置…

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)

视频效果演示: 基于K210与STM32协同工作的智能垃圾分类系统设计与实现 目录: 目录 视频效果演示: 目录:

CISAW-ES应急服务方向信息安全事件分级

网络安全事件事件分级 网络安全事件分为四级&#xff1a;特别重大网络安全事件、重大网络安全事大网络安全事件、一般网络安全事件。 1&#xff0e;特别重大网络安全事件 符合下列情形之一的&#xff0c;为特别重大网络安全事件。 &#xff08;1&#xff09;重要网络和信息系…

油猴支持阿里云自动登陆插件

遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆不丝滑,通过元素发现机制,解决此问题并做到丝滑登陆根据密钥计算校验码之…

简聊MySQL的顺序读写和随机读写

在MySQL数据库中&#xff0c;顺序读写和随机读写的应用区别主要体现在以下几个方面&#xff1a; 一、定义回顾 顺序读写&#xff1a;数据按照物理地址的连续性进行读写操作&#xff0c;通常用于处理大型文件或连续的数据块。随机读写&#xff1a;数据分散在磁盘的不同位置进行…

[Git] git reset --hard / git reset --soft

git reset --hard 功能&#xff1a;重置索引&#xff08;暂存区&#xff09;和工作目录到指定的提交状态。这意味着它会丢弃所有未提交的更改和已暂存的更改。 适用场景&#xff1a;当你想要完全放弃当前工作目录中的所有更改并回退到某个特定提交状态时&#xff0c;可以使用这…

C语言基本知识复习浓缩版:scanf函数

C语言基本知识复习浓缩版&#xff1a;scanf函数 1 scanf()函数用于读取用户的键盘输入 2 scanf()函数的基本形式&#xff1a;scanf("参数列表1",参数列表2): 参数列表1&#xff1a;用户键盘输入的数据的类型&#xff0c;用占位符表示。 参数列表2&#xff1a;用户键…

Ubuntu 24.04 LTS系统安装Docker踩的坑

一开始我跟着Docker给出的官网文档 Ubuntu | Docker Docs 流程走&#xff0c;倒腾了两个多小时&#xff0c;遇到了各种坑&#xff0c;最后放弃了。在我们使用脚本安装Docker命令前&#xff0c;我们先把已经安装的Docker全部卸载掉。 卸载Docker 1.删除docker及安装时自动安装…

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…

城市生命线安全综合监管平台

【落地产品&#xff0c;有需要可留言联系&#xff0c;支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要&#xff0c;聚焦城市安全重点领域&#xff0c;围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…

关于内网外网,ABC类地址,子网掩码划分

本文的三个关键字是&#xff1a;内网外网&#xff0c;ABC类地址&#xff0c;子网掩码划分。围绕以下问题展开&#xff1a; 如何从ip区分外网、内网&#xff1f;win和linux系统中&#xff0c;如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑&#xff0c;接口…

后端Java开发:第十二天

第十二天&#xff1a;封装 - 理解与应用 欢迎来到今天的学习内容&#xff01;今天&#xff0c;我们将一起深入探讨 Java 中的 封装&#xff08;Encapsulation&#xff09;。封装是面向对象编程的四大基本特性之一&#xff0c;它的核心思想是把对象的状态&#xff08;属性&…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

Spring Boot + MyBatis Plus 存储 JSON 或 List 列表全攻略

在现代的后端开发中&#xff0c;我们常常需要处理复杂的数据结构&#xff0c;JSON 数据以及列表&#xff08;List&#xff09;数据屡见不鲜。如何高效地使用 Spring Boot 和 MyBatis Plus 来存储这些复杂数据类型&#xff0c;是这篇博客要探讨的重点。 一、为什么要存储 JSON …