当前位置: 首页 > news >正文

MySQL数据库,视图、存储过程与存储函数

数据库对象:

常见的数据库对象:

视图:

  • 视图是一种虚拟表,本身是不具有数据的占用很少的内存空间。

  • 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。

  • 视图的创建和删除只影响视图本身,不影响对应的基表。但是对视图中的数据进行增加、删除和修改操作时,数据表(基表)中的数据会相应地发生变化当对基表中的数据进行增加,删除和操作时,与之对应的视图中的数据记录也会发生相对应的变化

  • 在数据库中,视图不会保存数据,数据真正保存在数据表(基表)中。

创建视图:

精简版:

CREATE  VIEW  视图名称

AS  查询语句;

关于视图中字段的字段名:(若不起字段名,视图中的字段的字段名即为查询字段的字段名)

①可以在查询语句的查询的字段后起别名,查询字段的别名即为视图中字段的字段名

在视图名称后加上括号( ),在括号中写上相应的字段的字段名要一一匹配)。

创建单表视图:

例:

CREATE VIEW view_emp1-- 方式一ASSELECT empno id,ename `name`,deptno dept_idFROM emp;
CREATE VIEW view_emp2(emp_id,`name`,dept_id)-- 方式二ASSELECT empno,ename,deptnoFROM emp;

创建多表视图:

例:

CREATE VIEW view_emp4ASSELECT e.empno,e.ename,e.deptno,d.locFROM emp eJOIN dept dON e.deptno = d.deptno;

利用视图对数据进行格式化:

比如想显示员工的信息的格式为 员工号--姓名--部门号--部门所在地:

CREATE VIEW view_emp5ASSELECT CONCAT(e.empno,'--',e.ename,'--',e.deptno,'--',d.loc) '员工信息'FROM emp eJOIN dept dON e.deptno = d.deptno;

CREATE VIEW view_emp6(员工信息)ASSELECT CONCAT(e.empno,'--',e.ename,'--',e.deptno,'--',d.loc)FROM emp eJOIN dept dON e.deptno = d.deptno;

基于视图创建视图:

例:

CREATE VIEW view_emp7(id,`name`)ASSELECT empno,enameFROM view_emp1;

查看视图:

查看数据库的表对象、视图对象:

SHOW TABLES;

查看视图的结构:

DESC / DESCRIBE 视图名称;

查看视图的属性信息

SHOW TABLE STATUS LIKE 视图;

查看视图的详细信息:

SHOW CREATE VIEW 视图名称;

更新视图中的数据:

类似于更新表的数据

例:

UPDATE view_emp7SET `name` = 'Tony'WHERE id = 7936;DELETE FROM view_emp7WHERE id = 7936;
  • 完成UPDATE操作后,不仅视图view_emp7中的id为7936的员工的名字改为了Tony,基表emp中的id为7936的员工的名字也改为了Tony。通过视图删除了id为7936的员工,基表中的id为7936的员工的信息也会跟着删除

  • 基表中的更新删除操作当然也会同步到视图

  • 如果视图中的字段是基表数据的组函数,更新和删除便不会成功。要使得视图可以更新,视图中的行与基表中的行必须保证有一一对应的关系。

  • 虽然可以更新视图数据,但是总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。

  • 对视图的修改,都是通过对实际基表中的数据的操作来完成的。

修改视图:

方式一:

使用CREATE OR REPLACE VIEW子句修改视图

CREATE OR REPLACE VIEW view_emp1-- 方式一

AS

SELECT 语句;

方式二:

使用ALTER VIEW的方式

ALTER VIEW 视图名

AS 

SELECT 语句;

删除视图:

DROP VIEW 视图名;

也可以删除多个视图:

DROP VIEW 视图名,视图名……;

假如基于一个或多个视图创建了额外的视图,将此一个或多个视图删除后,会导致此额外的视图的查询的失败。

视图的优点:

  1. 操作简单。

  2. 减少数据冗余。

  3. 数据更安全,用户不需要查询数据表,可以直接通过视图来获取数据表中的信息。

  4. 适应灵活多变的需求。

  5. 能够分解复杂的查询逻辑。

视图的缺点:

如果实际数据表的结构变了,就需要及时对相关的视图进行相应的维护。视图过多,会导致数据库运维成本的问题。


存储过程与存储函数:

存储过程与存储函数能将复杂的SQL逻辑封装在一起,供以调用

存储过程

存储过程(Stored Proceduce)是一组经过预先编译的SQL语句的封装

执行过程:存储函数预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以将预先存储好的这一系列SQL语句全部执行。

优点:

  • 简化操作,提高了SQL语句的复用性。

  • 减少网络传输量。

  • 提高了数据查询的安全性。

关于参数前的符号

存储过程的参数类型可以是IN、OUT、INOUT,也可以不带参数

IN:当前参数为输入参数,也就是表示入参。如果没有定义参数种类,默认是IN

OUT:当前参数为输出参数,也就是表示出参。

INOUT:当前参数既可以为输入参数,也可以为输出参数。

DELIMITER:

因为MySQL默认的语句结束符号为‘;’。为了避免与存储过程中的语句结束符相冲突,需要用DELIMITER改变存储过程的结束符

格式:DELIMITER 新的结束符

例:

在存储过程的存储过程体中:

DELIMITER $   -- 将结束符设置为‘$’CREATE PROCEDURE 存储过程名(参数列表)BEGIN……(具体的存储过程的操作)END $DELIMITER ;   -- 将结束符设置为‘;’,以方便后面的操作使用‘;’为结束符。

注:使用DELIMITER时,应该注意避免使用‘\’为结束符,因为其为MySQL的转义字符

存储过程的创建:

格式:

DELIMITER 新结束符

CREATE PROCEDURE 存储过程名(参数列表)

[ characteristics]

BEGIN

……(具体的存储过程的操作)

END 新结束符

DELIMITER ;

characteristics

指定存储过程的特性,有以下取值:

  • LANGUAGE SQL:

说明存储过程体部分是由SQL语句组成的,当前系统支持的语言为 SQL。

  • DETERMINISTIC和NOT DETERMINISTIC:指明存储过程执行的结果是否正确.

    • DETERMINISTIC表示结果是确定的每次执行存储过程时,相同的输入会得到相同的输i出。

    • NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。

如果没有指定任意一个值,默认 为 NOT DETERMINISTIC

  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使 用SQL语句的限制

    • CONTAINS SQL表明子程序包含SQL语句,但是不包括读写数据的语句;

    • NO SQL表明子程序不包含SQL语句;

    • READS SQL DATA说明子程序包含读数据 的语句;

    • MODIFIES SQL DATA表明子程序包含写数据的语句。

默认情况下,系统会指定 为 CONTAINS SQL

  • SQL SECURITY {DEFINER | INVOKER }:

表示执行当前存储过程的权限,指明哪些用户有权限来执行

    • DEFINER表示只有定义者才能执行。

    • INVOKER表示拥有权限的调用者可以执行。

默认情况下,系统指定为 DEFINER

  • COMMENT ‘string’:注释信息,可以用来描述存储过程或函数。

存储过程体是SQL代码的内容,用BEGIN…END来表示存储过程体开始和结束。

存储过程的调用

使用CALL关键字:

CALL 存储过程名(参数列表);

①无参的存储过程的使用:

例:创建一个查看所有部门的平均工资的存储过程并调用:

DELIMITER $CREATE PROCEDURE dept_avg_sal()BEGINSELECT deptno,AVG(sal) avg_salFROM test_pro_1GROUP BY deptno;END $DELIMITER ;CALL dept_avg_sal;-- 因为无参,也可以不写括号

②带有传出参数(带有OUT)的存储过程的使用:

例:输出工资最低的员工的工资:

DELIMITER $CREATE PROCEDURE show_min_salary(OUT ms DECIMAL(7,2))BEGINSELECT MIN(sal) INTO msFROM emp;END $DELIMITER ;CALL show_min_salary(@ms);-- 调用show_min_salary过程并将输出值赋值给@ms变量。SELECT @ms;-- 查看@ms变量。

③带有传入参数(带有IN)的存储过程的使用:

例:输入员工的姓名,根据输入的姓名查询员工的工资:

DELIMITER $CREATE PROCEDURE show_someone_sal(IN empname VARCHAR(50))BEGINSELECT salFROM empWHERE ename = empname;END $DELIMITER ;CALL show_someone_sal('KING');-- 调用,输出名字为KING的员工的工资。

④带有输入函数与输出函数(带IN和OUT)的存储过程的使用:

例:输入员工的姓名,根据输入的姓名输出员工的工资:

DELIMITER $CREATE PROCEDURE show_sal(IN emp_name VARCHAR(50),OUT emp_salary DECIMAL(7,2))BEGINSELECT sal INTO emp_salaryFROM empWHERE ename = emp_name;END $DELIMITER ;CALL show_sal('KING',@es);-- 调用show_sal存储过程,将输出值赋值给变量@es。SELECT @es;-- 查看@es。

⑤带INOUT的参数的存储过程的使用:

例:查询某个员工领导的姓名,并用INOUT参数输入员工姓名,输出领导的姓名。

DELIMITER $CREATE PROCEDURE show_mgr_name(INOUT emp_name VARCHAR(50))BEGINSELECT ename INTO emp_nameFROM empWHERE empno = (SELECT mgrFROM empWHERE ename = emp_name);END $DELIMITER ;SET @James = 'JAMES';CALL show_mgr_name(@James);SELECT @James;

注:由于show_mgr_name存储过程不仅要对参数emp_name进行读取,还要对参数emp_name进行赋值,代入的参数不能是一个字符串值(只能读取,不能赋值),而应该是一个变量

存储过程的缺点:

可移植性差、调试困难、版本管理困难、不适合高并发的场景。

存储函数

函数可以对数据进行各种处理操作,提高用户对数据库的管理效率。MySQL支持自定义函数(存储函数),自定义的调用方式与MySQL预定义的系统函数一样。

格式:

DELIMITER 新结束符

CREATE FUNCTION 函数名(参数列表)

RETURNS 返回值类型

[ characteristics]

BEGIN

……(函数体)

END 新结束符

DELIMITER ;

注:

  • 函数中所有的参数都是IN类型的。

  • 函数体中必定包含RETURN语句

  • 函数体用BEGIN和END来表示函数体中的SQL语句的开始和结束。如果函数体只有一条语句,可省略BEGIN和END。建议统一加上,作为习惯。

  • [ characteristics]部分和存储过程的一致

  • 如果创建存储函数时出现‘you *might* want to use the less safe log_bin_trust_function_creators variable’的报错,有两种方式解决:

    • ①加上必要的函数特性“DETERMINISTIC和NOT DETERMINISTIC”与“{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }”例:

    • DELIMITER $CREATE FUNCTION job_by_name()RETURNS VARCHAR(50)NOT DETERMINISTICCONTAINS SQLREADS SQL DATABEGINRETURN (SELECT job FROM emp WHERE ename = 'KING');END $DELIMITER ;

    • ②执行:SET GLOBAL log_bin_trust_function_creators = 1;

关于带参数的存储函数的创建与调用:(与存储过程类似)

DELIMITER $CREATE FUNCTION job_by_id(emp_id INT)RETURNS VARCHAR(50)BEGINRETURN (SELECT job FROM emp WHERE empno = emp_id);END $DELIMITER ;SELECT job_by_id(empno)FROM emp;

对比存储函数和存储过程:

  • 存储函数可以放在查询语句中使用,存储过程不行。

  • 存储过程的功能更强大,包括能对表的操作和事务操作。

存储过程和存储函数的查看、修改、删除

查看:

①使用SHOW CREATE语句查看存储过程和存储函数的创建信息。

SHOW CREATE PROCEDURE/FUNCTION 存储过程名/存储函数名;

②使用SHOW STATUS语句查看存储过程和存储函数的状态信息。

SHOW PROCEDURE/FUNCTION [LIKE 'patten'];

③从infomation_schema.Routines表中查看存储函数和存储过程的信息。

SELECT *

FROM information_schema.Routines

WHERE ROUTINE_NAME = '存储函数名或存储过程名' [AND ROUTINE_TYPE = 'FUNCTION'/'PROCEDURE'];

修改:

修改存储过程或函数,不影响存储函数或存储过程的功能(不能修改存储函数体或存储过程体),只是修改相关特性。使用ALTER语句实现。

ALTER CREATE PROCEDURE/FUNCTION 存储过程名/存储函数名 [ characteristics];

删除:

DROP CREATE PROCEDURE/FUNCTION [IF EXISTS] 存储过程名/存储函数名;

相关文章:

MySQL数据库,视图、存储过程与存储函数

数据库对象: 常见的数据库对象: 视图: 视图是一种虚拟表,本身是不具有数据的占用很少的内存空间。 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。 视图的创建和删除只影响视图本身,不影响对…...

【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归

【【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归 1. autograd 包,自动微分2. 线性模型回归演示3. GPU进行模型训练 小结:只需要将前向传播设置好,调用反向传播接口,即可实现反向传播的链式求导 1. autograd 包&#x…...

Android Studio实现俄罗斯方块

文章目录 一、项目概述二、开发环境三、详细设计3.1 CacheUtils类3.2 BlockAdapter类3.3 CommonAdapter类3.4 SelectActivity3.5 MainActivity 四、运行演示五、项目总结 一、项目概述 俄罗斯方块是一种经典的电子游戏,最早由俄罗斯人Alexey Pajitnov在1984年创建。…...

【Hive】——DDL(DATABASE)

1 概述 2 创建数据库 create database if not exists test_database comment "this is my first db" with dbproperties (createdByAllen);3 描述数据库信息 describe 可以简写为desc extended 可以展示更多信息 describe database test_database; describe databa…...

【华为OD题库-092】单词加密-java

题目 输入一个英文句子,句子中包含若干个单词,每个单词间有一个空格需要将句子中的每个单词按照要求加密输出。要求: 1)单词中包括元音字符(‘aeuio’、‘AEUIO’,大小写都算),则将元音字符替换成’*) 2)单词中不包括元音字符&…...

构建一个简单的 npm 验证项目

构建一个简单的 npm 验证项目 0. 背景1. 构建过程1-1. 创建项目并初始化1-2. 安装 mjs 支持的 package1-3. 在 package.json 中添加 mjs 脚本1-4. 创建 index.mjs 文件1-5. 执行脚本 2. (Optional)环境变量配置 0. 背景 工作上需要验证一下 npm 程序,所以需要构建一…...

利用vue-okr-tree实现飞书OKR对齐视图

vue-okr-tree-demo 因开发需求需要做一个类似飞书OKR对齐视图的功能,参考了两位大神的代码: 开源组件vue-okr-tree作者博客地址:http://t.csdnimg.cn/5gNfd 对组件二次封装的作者博客地址:http://t.csdnimg.cn/Tjaf0 开源组件v…...

持续集成交付CICD:CentOS 7 安装SaltStack

目录 一、理论 1.SaltStack 二、实验 1.主机一安装master 2.主机二安装第一台minion 3.主机三安装第二台minion 4.测试SaltStack 三、问题 1.CentOS 8 如何安装SaltStack 一、理论 1.SaltStack (1)概念 SaltStack是基于python开发的一套C/S自…...

vscode 环境配置

必备插件 配置调试 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","confi…...

pytorch文本分类(二):引入pytorch处理文本数据

pytorch文本数据处理 目录 pytorch文本数据处理1. Pytorch背景2. 数据分割3. 数据加载Dataset代码分析字典的用途代码修改的目的 Dataloader 4. 练习 原学习任务链接 相关数据链接:https://pan.baidu.com/s/1iwE3LdRv3uAkGGI2fF9BjA?pwdro0v 提取码:ro…...

Centos硬盘操作合集

一、硬盘命令说明 lsblk 列出系统上的所有磁盘列表 查看磁盘列表 参数意义 blkid 列出硬盘UUID [rootzs ~]# blkid /dev/sda1: UUID"77dcd110-dad6-45b8-97d4-fa592dc56d07" TYPE"xfs" /dev/sda2: UUID"oDT0oD-LCIJ-Xh7r-lBfd-axLD-DRiN-Twa…...

三大循环语句

goto 我们看代码去感受goto的循环,那么goto循环最经常搭配的就是loop,那么就像如下代码 这个代码中loop:就是个标志,然后程序正常向下运行,goto loop;就会让她回到loop,然后在运行到goto loop…...

Mybatis详解

MyBatis是什么 MyBatis是一个持久层框架,用于简化数据库操作的开发。它通过将SQL语句和Java方法进行映射,实现了数据库操作的解耦和简化。以下是MyBatis的优点和缺点: 优点: 1. 灵活性:MyBatis允许开发人员编写原生的…...

spring cloud alibaba RocketMQ 最佳实践

目录 概述使用准备工作引入依赖创建Topic代码应用启动消息接收再扩展一个 结束 概述 github 文档地址 rocket mq example RocketMQ 版本为 5.1.4 使用 准备工作 阅读此文需要事先准备 RocketMQ ,如有疑问,请移步 RocketMQ 服务搭建 引入依赖 此处…...

php使用OpenCV实现从照片中截取身份证区域照片

<?php // 获取上传的文件 $file $_FILES[file]; // 获取文件的临时名称 $tmp_name $file[tmp_name]; // 获取文件的类型 $type $file[type]; // 获取文件的大小 $size $file[size]; // 获取文件的错误信息 $error $file[error]; // 检查文件是否上传成功 if ($er…...

抖音ip地址切换会看不到视频吗

随着社交媒体平台的快速发展&#xff0c;抖音已经成为了许多人分享生活点滴、展示才艺的热门平台。然而&#xff0c;有时候使用抖音时会遇到一些问题&#xff0c;比如IP地址切换后无法观看视频。那么&#xff0c;为什么会出现这种情况呢&#xff1f;让我们分析一下。 首先&…...

有关爬虫http/https的请求与响应

简介 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff1a;是一种发布和接收 HTML页面的方法。 HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;简单讲是HTTP的安全版&#xff0c;在HTT…...

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…...

排序算法(二)-冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序

排序算法(二) 前面介绍了排序算法的时间复杂度和空间复杂数据结构与算法—排序算法&#xff08;一&#xff09;时间复杂度和空间复杂度介绍-CSDN博客&#xff0c;这次介绍各种排序算法——冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序。 文章目录 排…...

智能优化算法应用:基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.探路者算法4.实验参数设定5.算法结果6.参考文…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...