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

news2025/1/11 22:46:31

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)
BEGIN
    SELECT employee_id, first_name, last_name
    FROM employees
    WHERE 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))
BEGIN
    SELECT AVG(salary) INTO avg_salary
    FROM employees
    WHERE 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
BEGIN
    SET 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
BEGIN
    IF NEW.price < 0 THEN
        SET 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
BEGIN
    DELETE 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.coloradmin.cn/o/2275156.html

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

相关文章

【Java项目】基于SpringBoot的【校园新闻系统】

【Java项目】基于SpringBoot的【校园新闻系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。系统中的核心用户是管理员&#xff0c;管理员…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …

【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)

前言 大家好&#xff0c;我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们&#xff0c;记得给晓晓点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 简介 该…

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript&#xff08;简称TS&#xff09;相似&#xff0c;在TS的生态基础上进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…

【python A* pygame 格式化 自定义起点、终点、障碍】

- pip install pygame test.py(chatgpt版本) 空格键&#xff1a;运行 A* 算法。CtrlC 键&#xff1a;清空路径。CtrlS 键&#xff1a;保存当前地图到 map.json 文件。CtrlL 键&#xff1a;从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…

xfs扩容目录lvm

pve增加磁盘&#xff1a; -bash-4.2# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 …

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

【PPT解密】ppt只读文档怎么改成可编辑文档

PPT文档打开是只读模式&#xff0c;如何改成可编辑文档呢&#xff1f;这需要分几种情况来说&#xff0c;所以今天将介绍几种方法帮助PPT只读文档改为可编辑文档。 方法一&#xff1a; 我们可以先查看一下文件属性&#xff0c;属性中有只读属性&#xff0c;当我们打开文档之后…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车车体运动的功能&#xff0c;控制车体从而使摄像头会保持标签码在视觉中间左右运动&#xff0c;在根据物体在摄像头成像近大远小的原理根据这一特性&#xff0c;从而实现标签码跟随功能。 2. 启…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本&#xff1a;关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时&#xff0c;部分文档已经修改&#xff0c;而大部分没有修改&#xff0c;为了减少在众多已打开文档中来回跳转的不便&#xff0c;可以将没有修改的文档全部关闭&#xff0c;但目前提供的快速关闭窗…

IIS部署.NetCore/.Net8/.Net9项目(从装环境到配置Swagger)

一、介绍 随着.NetCore开源、以及版本的更新迭代&#xff0c;.NetCore的性能越来越好、功能也越来越丰富&#xff0c;作为纯后端提供Api已经变得越来越频繁&#xff0c;与之配套的接口组件Swagger也成为很多人的选择。下面介绍在IIS上部署Swagger的详细过程。 二、安装IIS服务…

第R4周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X&#xff0c;y6、划分数据集7、构建模型8、定义训练函…

【python自写包模块的标准化方法】

目标: 自写一个包,提供关于字符串和文件的模块 要求对异常可以检测 str_tools.py: def str_reverse(s):""":param s: 传入的字符串:return: 反转后的字符串"""# i -1# j 0# s2 ""# while i > (-len(s)):# s2 s[i]# …

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B&#xff5c;开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行&#xff0c;在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…