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

news2024/9/23 5:16:14

数据库对象:

常见的数据库对象:

视图:

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

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

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

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

创建视图:

精简版:

CREATE  VIEW  视图名称

AS  查询语句;

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

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

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

创建单表视图:

例:

CREATE VIEW view_emp1-- 方式一

AS

SELECT empno id,ename `name`,deptno dept_id

FROM emp;
CREATE VIEW view_emp2(emp_id,`name`,dept_id)-- 方式二

AS

SELECT empno,ename,deptno

FROM emp;

创建多表视图:

例:

CREATE VIEW view_emp4

AS

SELECT e.empno,e.ename,e.deptno,d.loc

FROM emp e

JOIN dept d

ON e.deptno = d.deptno;

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

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

CREATE VIEW view_emp5

AS

SELECT CONCAT(e.empno,'--',e.ename,'--',e.deptno,'--',d.loc) '员工信息'

FROM emp e

JOIN dept d

ON e.deptno = d.deptno;

CREATE VIEW view_emp6(员工信息)

AS

SELECT CONCAT(e.empno,'--',e.ename,'--',e.deptno,'--',d.loc)

FROM emp e

JOIN dept d

ON e.deptno = d.deptno;

基于视图创建视图:

例:

CREATE VIEW view_emp7(id,`name`)

AS

SELECT empno,ename

FROM view_emp1;

查看视图:

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

SHOW TABLES;

查看视图的结构:

DESC / DESCRIBE 视图名称;

查看视图的属性信息

SHOW TABLE STATUS LIKE 视图;

查看视图的详细信息:

SHOW CREATE VIEW 视图名称;

更新视图中的数据:

类似于更新表的数据

例:

UPDATE view_emp7

SET `name` = 'Tony'

WHERE id = 7936;

DELETE FROM view_emp7

WHERE 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()

BEGIN

SELECT deptno,AVG(sal) avg_sal

FROM test_pro_1

GROUP BY deptno;

END $

DELIMITER ;



CALL dept_avg_sal;-- 因为无参,也可以不写括号

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

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

DELIMITER $

CREATE PROCEDURE show_min_salary(OUT ms DECIMAL(7,2))

BEGIN

                SELECT MIN(sal) INTO ms

                FROM 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))

BEGIN

                SELECT sal

                FROM emp

                WHERE 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))

BEGIN

                SELECT sal INTO emp_salary

                FROM emp

                WHERE 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))

BEGIN

SELECT ename INTO emp_name

FROM emp

WHERE empno = (

                            SELECT mgr

                            FROM emp

                            WHERE 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 DETERMINISTIC
      
      CONTAINS SQL
      
      READS SQL DATA
      
      BEGIN
      
                      RETURN (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)

BEGIN

RETURN (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] 存储过程名/存储函数名;

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

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

相关文章

案例058:基于微信小程序的智能社区服务管理系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

计算机设计大赛信息可视化设计的获奖经验剖析解读—基于本专栏文章助力4C大赛【全网最全万字攻略-获奖必读】

文章目录 一.中国大学生计算机设计大赛1.1赛道解读1.2 信息可视化设计小类介绍1.2 小类区别解读 二.信息可视化设计赛道获奖经验2.1 四小类作品预览2.1.1 数据可视化小类-优秀参赛作品展览2.1.2 信息图形设计小类-优秀参赛作品展览2.1.3 动态信息影像(MG动画&#x…

2024免费mac苹果电脑系统电脑管家CleanMyMac X

macOS已经成为最受欢迎的桌面操作系统之一,它提供了直观、简洁的用户界面,使用户可以轻松使用和管理系统。macOS拥有丰富的应用程序生态系统;还可以与其他苹果产品和服务紧密协作,如iPhone、iPad,用户可以通过iCloud同…

理解JSX:提高前端开发效率的关键(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

spring 笔记五 SpringMVC的数据响应

文章目录 SpringMVC的数据响应SpringMVC的数据响应方式回写数据 SpringMVC的数据响应 SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 返回字符串形式 直接返回字符串:此种方式会将返回的字符…

nodejs+vue+微信小程序+python+PHP血液中心管理平台的设计与实现-计算机毕业设计推荐

实现采血的完整功能,系统用户主要分为两类,一类是管理员,一类是采血工作人员。管理员主要对采血工作人员以及血库进行管理。派发账号给员工作为采血工作人员,对血库的出库入库进行信息化管理。采血工作人员主要完成采血工作。通过…

jmeter,通过Ant插件生成html报告,展示接口详细信息

一、下载Ant 下载地址:Apache Ant - 二进制发行版 二、安装 1、Ant环境变量 解压Ant目录;配置系统环境变量,添加ANT_PATH,值为D:\Software\Ant_plugIn\apache-ant-1.10.14配置系统环境变量Path,添加Ant路径 %ANT_H…

MyBatisPlus基础入门笔记

MyBatisPlus基础入门笔记,源码可见下载链接 大家阅读时可善用目录功能,可以提高大家的阅读效率 下载地址:MyBatisPlus源码笔记 初识MyBatisPlus 入门案例 SpringBoot整合MyBatis(复习) 创建SpringBoot工程勾选使用的…

设计模式——适配器模式(结构型)

引言 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 问题 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格式的股票数据, 然后向用户呈现出美观的图表。 在开发过程中, 你决定在程序…

使用qt实现四则运算计算机项目

这是我们要包含的头文件 #include <QWidget> #include<QStack> #include<string.h> #include<string> 这是我在ui界面创建的计算机基础框架。 接下来要实现按住每个按钮在白框内显示&#xff1b; 因此我们要定义一个QString 类型的变量 QString e…

nginx服务前端访问查看无响应的问题

问题 nginx 启动之后&#xff0c;前端访问无数据&#xff0c;F12 查看&#xff0c;提示挂起。 以为是配置问题&#xff0c;查看配置文件&#xff0c;未发现配置的有问题。 原因 通过查看配置文件&#xff0c;发现转发的服务地址为127.0.0.1&#xff0c;手动ping 127.0.0.1&a…

AI人工智能与云原生:创新科技的完美结合

人工智能&#xff08;AI&#xff09;是当今科技领域的热门话题&#xff0c;而云原生则是一种新兴的软件开发和部署模式。AI人工智能与云原生的结合&#xff0c;为现代技术创新提供了无限的可能性。本文将探讨AI与云原生的关系&#xff0c;并介绍其如何在实际应用中实现协同效应…

谷歌宣布向云计算客户开放 Gemini Pro,开发者可用其构建应用

12 月 14 日消息&#xff0c;美国时间周三&#xff0c;谷歌宣布了一系列升级的人工智能&#xff08;AI&#xff09;功能&#xff0c;旨在为其云计算客户提供更好的服务。这家科技巨头正试图赶上竞争对手&#xff0c;比如微软和 OpenAI&#xff0c;它们都在积极利用人工智能的热…

docker安装最新版SQL Server并还原备份的数据库

docker安装数据库 拉取微软官方最新版镜像 docker pull mcr.microsoft.com/mssql/server 拉去镜像并创建容器 docker run -e "ACCEPT_EULAY" -e "SA_PASSWORDsa_password_123456" -p 1433:1433 -v /opt/:/opt --name sqlserver -d mcr.microsoft.com/ms…

〖大前端 - 基础入门三大核心之JS篇(54)〗- 原型和原型链

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

LOF基金跟股票一样吗?

LOF基金&#xff0c;全称为"上市型开放式基金"&#xff0c;是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

微服务 Nacos服务注册与发现

一、Nacos 功能介绍 在微服务架构下&#xff0c;一个业务服务会被拆分成多个微服务&#xff0c;各个服务之间相互通信完成整体的功能。另外&#xff0c;为了避免单点故障&#xff0c;微服务都会采取集群方式的高可用部署&#xff0c;集群规模越大&#xff0c;性能也会越高&…

linux磁盘空间清理

查看磁盘使用情况 查看磁盘分区上可以使用的磁盘空间 $ df -h若要查看文件类型和block&#xff0c;使用下面的命令 $ df -T查看每个文件和目录的磁盘使用空间&#xff0c;也就是文件的大小。 $ sudo du -sh /* $ sudo du -h --max-depth1 /清理旧的 Snap 包版本以释放磁盘空…

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

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