1、视图

(1)什么是视图

        视图是虚拟表,是基于查询结果的可视化表,视图的作用有:①简化复杂查询 ②限制数据访问 ③提供数据独立性 ④汇总数据

(2)怎么创建视图

        创建视图 CREATE OR REPLACE VIEW 视图名 AS 查询语句;

我还是以举例进行说明:

-- 1. 创建 departments 表(部门表)
CREATE TABLE departments (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL COMMENT '部门名称'
);-- 2. 创建 employees 表(员工表)
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL COMMENT '员工姓名',dept_id INT COMMENT '部门ID,外键',salary DECIMAL(10,2) COMMENT '薪资',FOREIGN KEY (dept_id) REFERENCES departments(id)
);-- 3. 插入示例数据
-- 插入部门
INSERT INTO departments (name) VALUES 
('技术部'),
('销售部'),
('人事部');-- 插入员工
INSERT INTO employees (name, dept_id, salary) VALUES
('Alice', 1, 8000.00),
('Bob', 1, 9000.00),
('Charlie', 2, 7000.00),
('David', 2, 7500.00),
('Eve', 3, 6000.00);-- 创建视图 CREATE OR REPLACE VIEW 视图名 AS 查询语句;
CREATE OR REPLACE VIEW v_employee_dept AS 
SELECT e.id,e.NAME AS 员工,e.salary AS 薪资,d.NAME AS 部门
FROM employees AS e JOIN departments AS d 
ON e.dept_id = d.id-- 查询视图:SELECT * FROM 视图名;
SELECT * FROM v_employee_dept

通过语句,视图就创建成功了,视图结果如图所示:

(3)视图管理

视图管理其实也就是对视图进行修改,更新,删除,重命名等操作

①修改

首先我们可以对视图进行修改

ALTER TABLE employees
ADD COLUMN hire_date DATE COMMENT '员工入职日期';-- 修改视图
CREATE OR REPLACE VIEW v_employee_dept AS
SELECT e.id, e.name, d.name AS dept_name, e.salary, e.hire_date
FROM employees e INNER JOIN departments d ON e.dept_id = d.id;

前两句话是将我们的employees表添加了一个列

后两句话相当于将视图重新创建了一份,可以看到上面加入的hire_date已经加入到了视图中

②更新

UPDATE v_employee_dept SET salary = 10000 WHERE name = 'Eve';

EVe的薪资被我们修改为了10000

③查询

查询就是每一次运行SQL语句后,我们都可以运行一次查询语句来观察我们的行为成功没有

SELECT * FROM v_employee_dept;

④重命名视图

-- RENAME TABLE 旧视图名 TO 新视图名;
RENAME TABLE v_employee_dept TO new_v_employee_dept

这时候我们就需要查看视图时,就需要查看后者的名称才可以查到,查询之前的则会报错

⑤删除视图

使用下面语句即可删除视图,可以通过再次查询看是否删除成功

DROP VIEW new_v_employee_dept;

2、存储

(1)存储过程

存储过程是一组预编译的SQL语句,保存在数据库中,可通过名称调用

存储过程的优点:①提高性能 ②简化复杂操作 ③增强安全性 ④减少网络流量

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE get_employee_by_dept(IN dept_name VARCHAR(50))
BEGINSELECT e.id, e.name, e.salaryFROM employees e INNER JOIN departments d ON e.dept_id = d.idWHERE d.name = dept_name;
END //
DELIMITER ;-- 调用存储过程
CALL get_employee_by_dept('技术部');

其实存储过程就相当于调用函数,在外面传入数据以进行重复的操作,这里就是读取employees表中的数据,读取的是技术部有关人员的信息

所以我们创建存储过程的公式如下

DELIMITER // 更改语句结束符为 //,避免 MySQL 过早解析 ; 导致错误
CREATE PROCEDURE ... 创建一个名为 get_employee_by_dept 的存储过程
IN dept_name VARCHAR(50) 定义输入参数:部门名称
BEGIN ... END 存储过程的执行体
CALL ... 调用存储过程并传参

(2)存储函数

存储函数是返回值的存储过程,可以在SQL语句中调用

-- 创建存储函数
-- 设置全局参数:允许用户创建存储函数
-- 当 MySQL 开启了二进制日志(binlog)时,出于复制安全考虑,默认限制创建不确定的函数。
-- 将此参数设为 TRUE 后,MySQL 会信任函数创建者,不会检查函数是否为确定性(DETERMINISTIC),
-- 从而允许创建函数,避免出现 "FUNCTION does not exist" 或权限拒绝的问题。
SET GLOBAL log_bin_trust_function_creators = TRUE;-- 更改语句结束符
-- 默认情况下,MySQL 使用分号(;)作为语句结束符。
-- 但在定义存储函数或存储过程中,函数体内部也包含分号,
-- 因此需要临时将结束符改为其他符号(如 //),以避免 MySQL 过早解析语句。
DELIMITER //-- 创建一个名为 get_dept_avg_salary 的存储函数
-- 函数接收一个输入参数 dept_name(部门名称),类型为 VARCHAR(50)
-- 返回值类型为 DECIMAL(10,2),表示最多 10 位数字,保留 2 位小数(如 9500.00)
-- DETERMINISTIC 表示该函数是“确定性的”:对于相同的输入,总是返回相同的结果(本例中成立)
CREATE FUNCTION get_dept_avg_salary(dept_name VARCHAR(50))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN-- 声明一个局部变量 avg_sal,用于存储查询到的平均薪资DECLARE avg_sal DECIMAL(10,2);-- 查询指定部门的平均薪资,并将结果存入变量 avg_sal-- 通过 INNER JOIN 关联 employees 和 departments 表,根据 dept_id 匹配-- 筛选出部门名称等于输入参数 dept_name 的员工,计算其 salary 的平均值SELECT AVG(e.salary) INTO avg_salFROM employees eINNER JOIN departments d ON e.dept_id = d.idWHERE d.name = dept_name;-- 返回计算得到的平均薪资值-- 如果没有匹配的员工,AVG() 返回 NULL,函数也将返回 NULLRETURN avg_sal;
END //-- 恢复默认的语句结束符为分号(;)
-- 完成函数定义后,将分隔符改回 ;,以便后续 SQL 语句正常执行
DELIMITER ;-- 调用存储函数:获取“技术部”的平均薪资
-- 使用 SELECT 语句调用函数,传入参数 '技术部'
-- 函数执行后返回该部门所有员工的平均工资
SELECT get_dept_avg_salary('技术部');

(3)触发器

触发器就是在表上定义的特殊存储过程,就是MySQL服务器在满足特定事件(INSERT/UPDATE/DELETE)并满足给定表时自动执行的一段SQL代码

要素取值/说明
触发事件INSERT、UPDATE、DELETE
触发时机BEFORE(语句真正修改数据前)或 AFTER(语句已改完提交前)
作用表只能建在 基表(不能建在视图或临时表)

创建触发器

创建只有一个执行语句的触发器

create trigger 触发器名 before|after 触发事件
on 表名 for each row
执行语句;

创建有多个执行语句的触发器

create trigger 触发器名 before|after 触发事件
on 表名 for each row
begin执行语句列表
end;

可以根据实例来加深印象

-- 创建日志表 employee_log,用于记录员工表的操作日志
-- 该表将存储对 employees 表的增删改操作记录
CREATE TABLE employee_log (id INT PRIMARY KEY AUTO_INCREMENT, -- 日志ID,主键,自动递增operation VARCHAR(20), -- 操作类型,如 'INSERT'、'UPDATE'、'DELETE'employee_id INT, -- 被操作的员工ID,对应 employees 表的 idoperation_time DATETIME -- 操作发生的时间,精确到秒
);-- 更改语句结束符
-- 由于触发器定义中包含分号(;),需要临时将结束符改为其他符号(如 //)
-- 避免 MySQL 将内部语句误认为整个 CREATE TRIGGER 语句的结束
DELIMITER //-- 创建触发器:after_employee_insert
-- 触发器名称:after_employee_insert
-- 触发时机:AFTER INSERT(在向 employees 表插入新记录之后)
-- 触发对象:employees 表
-- 触发粒度:FOR EACH ROW(每插入一行数据,触发一次)
CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN-- 触发器执行的操作:向日志表插入一条记录-- 记录内容包括:-- operation: 操作类型,固定为 'INSERT'-- employee_id: 新插入的员工ID,使用 NEW.id 获取(NEW 代表新行)-- operation_time: 当前时间,使用 NOW() 函数获取INSERT INTO employee_log (operation, employee_id, operation_time)VALUES ('INSERT', NEW.id, NOW());
END //-- 恢复默认的语句结束符为分号(;)
-- 完成触发器定义后,将分隔符改回 ;,以便后续 SQL 语句正常执行
DELIMITER ;-- 测试触发器:向 employees 表插入一条新员工记录
-- 插入姓名为 '孙八',部门ID为 1,薪资为 9500 的员工
-- 此操作将触发上面定义的 after_employee_insert 触发器
INSERT INTO employees (name, dept_id, salary) VALUES ('孙八', 1, 9500);-- 查询日志表,查看触发器是否成功记录了操作
-- 应该能看到一条 operation 为 'INSERT',employee_id 为新插入员工ID,时间接近当前时间的记录
SELECT * FROM employee_log;

注意

(1)触发器内不能对本表进行更新/删除,否则会报错

(2)触发器失败会导致原语句整体回滚

(3)复杂逻辑尽量放到存储过程或应用层,保持可维护性

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

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

相关文章

Pytest项目_day13(usefixture方法、params、ids)

usefixture 我们还可以使用mark.usefixtures来调用fixture 这样相比在传入参数处调用fixture,会更加直接 但是如果我们在一个测试用例中使用了多个usefixtures,那么测试用例会先调用离他最近的那个fixtureparams fixture中还可以带参数 当我们用request.…

Rust 异步生态实战:Tokio 调度、Pin/Unpin 与零拷贝 I/O

🌟 Hello,我是蒋星熠Jaxonic! 🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。 🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。 &#x…

通用 maven 私服 settings.xml 多源配置文件(多个仓库优先级配置)

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.…

AT F-Intervals 题解

简化题意&#xff1a; 有 nnn 个区间&#xff0c;保证所有区间同时覆盖一个点&#xff0c;每次将区间平移一个单位&#xff0c;问使得区间两两不交的最小操作数&#xff08;端点处可重叠&#xff09;。n≤5000。l,r≤231−1n\leq 5000。l,r\leq 2^{31}-1n≤5000。l,r≤231−1。…

《飞算Java AI:从安装到需求转实战项目详细教学》

前引&#xff1a;在当今快速发展的技术环境中&#xff0c;人工智能&#xff08;AI&#xff09;与编程语言的结合为开发者提供了前所未有的便利。飞算Java AI作为一款智能化编程工具&#xff0c;能够显著提升Java开发效率&#xff0c;减少重复性工作&#xff0c;并帮助开发者更专…

6深度学习Pytorch-神经网络--过拟合欠拟合问题解决(Dropout、正则化、早停法、数据增强)、批量标准化

过拟合、欠拟合 在机器学习和深度学习中&#xff0c;过拟合&#xff08;Overfitting&#xff09;和欠拟合&#xff08;Underfitting&#xff09;是模型训练过程中常见的两种问题&#xff0c;直接影响模型的泛化能力&#xff08;即对未见过的数据的预测能力&#xff09;。 1. 欠…

新手向:Python编写简易翻译工具

Python 编写简易翻译工具&#xff1a;从零开始入门指南对于刚接触编程的新手来说&#xff0c;编写一个实用的工具是快速入门的好方法。本文将详细介绍如何用 Python 编写一个简易的翻译工具&#xff0c;帮助理解基础编程概念和实际应用。无需任何编程基础&#xff0c;只需按照步…

爬虫与数据分析结和

任务描述 爬取目标&#xff1a;高三网中国大学排名一览表&#xff0c;网址为 2021中国的大学排名一览表_高三网。爬取内容&#xff1a;学校名称、总分、全国排名、星级排名、办学层级。数据存储&#xff1a;爬取后的数据保存在 CSV 文件中。 代码实现&#xff08;爬取&#xff…

linux下安装php

1.php官网下载所需要的php版本 下载php 2.将下载好的压缩包上传至linux服务器&#xff0c;解压并配置 tar -xzvf php-8.4.11.tar.gz cd php-8.4.11 ./configure --prefix/home/admintest/php/php-8.4.11 # 配置安装路径和选项 make sudo make install3.使用make命令编译完成…

nurbs曲线的matlab

基于MATLAB的NURBS曲线生成与可视化程序 %% NURBS曲线生成与可视化 clc; clear; close all;%% 基本参数设置 degree 3; % 曲线阶数 (degree k-1, k为控制点数) numCtrlPts 6; % 控制点数量 weights ones(1, numCtrlPts); % 权重向量&#xff08;可调整&#…

AWS WAF防护机制深度研究:多模式验证与绕过技术解析

AWS WAF防护机制深度研究&#xff1a;多模式验证与绕过技术解析 技术概述 AWS WAF&#xff08;Web Application Firewall&#xff09;作为亚马逊云服务的核心安全组件&#xff0c;为Web应用提供了多层次的防护机制。该系统基于先进的机器学习算法和规则引擎&#xff0c;能够实…

嵌入式 - Linux软件编程:文件IO

一、概念标准IO是有缓存的IO&#xff0c;文件IO没有缓存&#xff0c;适合于通信、硬件设备操作标准IO是库函数&#xff0c;文件IO是系统调用文件 IO 与标准 IO&#xff08;基于 C 库函数的 IO&#xff09;是 Linux 中两种主要的 IO 方式&#xff0c;二者的核心差异如下&#xf…

ESP32 MQTT对接EMQX本地服务器

文章目录一、搭建EMQX本地MQTT服务器1.1 下载1.2 使用二、MQTT.fx安装使用2.1 破解及安装2.2 客户端界面说明2.3 与 WebSocket 客户端互发消息2.3.1 使用MQTT.fx连接到EMQX本地服务器1.General设置2.User Credentials设置3.进行连接2.3.2 MQTT.fx发布和订阅主题1.发布主题2.订阅…

【Node.js从 0 到 1:入门实战与项目驱动】2.2 验证安装(`node -v`、`npm -v`命令使用)

文章目录 第 2 章:环境搭建 —— 准备你的开发工具 2.2 验证安装(`node -v`、`npm -v`命令使用) 一、基础验证命令解析 二、基础验证场景案例 案例 1:首次安装后的基础验证 案例 2:检查版本兼容性 三、进阶场景案例 案例 3:在脚本中动态获取 Node.js 版本 案例 4:在 npm…

【虚拟机】VMwareWorkstation17Pro安装步骤

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 工作中时常会遇到各种各样的系统&#xff0c; 需要做各种测试&#xff0c; 比如要验证某个软件在某个系统版本上是否适配&#xff0c; 这时候将自己的电脑系统换成要测试的系统就会比较麻烦。 这时候使用虚拟机就…

C语言库中的字符函数

目录 求字符串长度 认识strlen 自主实现strlen 字符串拷贝 认识strcpy 自主实现strcpy strncpy 字符串拼接 认识strcat 自主实现sracat strncat 字符串大小比较 认识strcmp 自主实现strcmp strncmp 字符串中寻找子字符串 认识strstr 自主实现strstr 根据符号…

学习日志31 python

1 x, y y, x 是合法的,这是Python的特色语法x, y y, x 是 Python 中一种非常简洁且实用的特色语法&#xff0c;用于交换两个变量的值。这种语法的优势在于&#xff1a;无需额外的临时变量即可完成交换操作代码简洁易读&#xff0c;一眼就能理解其目的执行效率高&#xff0c;在…

Mac配置服务器工具Royal TSX

Royal TSX是mac上类似xshell的工具&#xff0c;可以远程连接服务器、连接ftp等 下载Royal TSX 官网&#xff1a;Royal TSX 下载插件 在设置中的插件市场plugins中下载需要的插件 例如 远程shell插件&#xff1a;Terminal ftp插件&#xff1a;File Transfer 新建一个文档 开…

【小程序】微信小程序开发,给用户发送一次性订阅消息,常见参数长度和数据类型说明,你值得收藏

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《小程序》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&a…

Pytorch深度学习框架实战教程-番外篇05-Pytorch全连接层概念定义、工作原理和作用

相关文章 视频教程 《Pytorch深度学习框架实战教程01》《视频教程》 《Pytorch深度学习框架实战教程02&#xff1a;开发环境部署》《视频教程》 《Pytorch深度学习框架实战教程03&#xff1a;Tensor 的创建、属性、操作与转换详解》《视频教程》 《Pytorch深度学习框架实战…