mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程

1. 视图

视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。

使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,

但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,

因此不推荐使用. 而且工作中一般不方便,因为是虚拟表 不方便共用,如果需要修改,可能设计到与DBA的沟通,很麻烦

1 --使用视图

2 select .. fromv13 select asd fromv14 --某个查询语句设置别名,日后方便使用

5

6 -创建7 create view 视图名称 asSQL8

9 PS: 虚拟的,临时表 无法插入操作10

11 -修改12 alter view 视图名称 asSQL13

14 -删除15 drop view 视图名称;

2. 触发器

定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

工作中一般也很少用到,因为自己在代码中就能设计操作前后的行为

insert intotb (....)

delimiter// --修改结束标记

create trigger t1 BEFORE INSERT on student for EACH ROW --创建insert操作前的触发器

BEGIN --触发器具体内容

INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);END //delimiter ;--恢复默认的语句结束标记

------------------------------------------------

insert into student(gender,class_id,sname) values('女',1,'涛'),('女',1,'根');--NEW,代指新数据 可以在触发器中点语法使用--OLD,代指老数据 删除的那一行记录被OLD引用

3.函数

因为在sql语句执行中调用函数会比较耗时,而且对索引的那一列使用了函数,则无法命中索引了。

所以工作中对响应速度要求高,一般不会不使用函数处理结果集。而是在架构级别或者程序级别处理结果集。

内置的函数很多,详情参看官方文档

--内置函数:

执行函数 selectCURDATE();

blog

id title ctime1 asdf 2019-11

2 asdf 2019-11

3 asdf 2019-10

4 asdf 2019-10

select ctime,count(1) from blog groupctimeselect DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")2019-11 2

2019-10 2DATE_FORMAT 时间格式化函数,较常用--自定义函数(必须有返回值):

delimiter \\create functionf1(

i1int,

i2int)returns int

BEGIN

declare num int default 0;set num = i1 +i2;return(num);END\\

delimiter ;SELECT f1(1,100);

4. 存储过程

包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,可以让程序与sql解耦合,且执行通过一个名字减少数据传输。mysql 5.5版本以后才有的功能

开发岗位一般也比较少使用。主要会是DBA使用。

用MySQL的三种方式:

方式一:

MySQL: 存储过程

程序:调用存储过程

方式二:

MySQL:。。

程序:SQL语句

方式三:

MySQL:。。

程序:类和对象(SQL语句)

MySQL中代码属于强类型语言, 变量需要先 声明 变量名 和 变量类型.

2d45cf2920ad5ae99d562e11d54b93ca741.jpg

1.简单示例

9b7224e39629b92a10e1b321b3dd5d730e9.jpg

7146bfbbda3d57934a4fb4149f496d05839.jpg

delimiter //

create procedurep2(in n1 int,in n2 int)BEGIN

----- 获取大于传参数字的id行

select * from student where sid >n1;END //delimiter ;---------------- 命令行

call p2(12,2)--------------- pymsql

cursor.callproc('p2',(12,2))

2.传参数(in)

58b10229a6df818db18e1d9a82f7298a34e.jpg

38d391c7b163fac9803ed226c94c976a11a.jpg

delimiter //

create procedurep3(in n1 int,

inout n2int)BEGIN

set n2 = 123123;select * from student where sid >n1;END //delimiter ;-------------------

set @v1 = 10;

call p2(12,@v1)select @v1;set @_p3_0 = 12ser@_p3_1 = 2call p3(@_p3_0,@_p3_1)select @_p3_0,@_p3_1

------------------------ pymysql

cursor.callproc('p3',(12,2))

r1= cursor.fetchall()print(r1)cursor.execute('select @_p3_0,@_p3_1') # @_p3_0是底层创建好的名字

r2= cursor.fetchall() # 去除out值print(r2)

3.参数 out

为什么有结果集又有out伪造的返回值?

5be28d27172163af73b41d65d79396aabd3.jpg

604eba3c2151cec0ee957efba6fc25bc4f4.jpg

delimiter //

create procedurep3(in n1 int,

out n2int --用于标识存储过程的执行结果 一般用 tinyint 1,2等来表示相应的执行结果,方便程序获取后知道执行结果

)BEGIN

insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)END //delimiter ;

View Code

a50783f213d6167eedd1ede42f1cfc227f6.jpg

a54c01b5609644f2d7f5a13a6babf57835c.jpg

delimiter //

create procedurep4(

out statusint)BEGIN

--伪代码描述

1. 声明如果出现异常则执行{set status = 1;rollback;

}

开始事务--由秦兵账户减去100

--方少伟账户加90

--张根账户加10

commit;

结束set status = 2;END //delimiter ;===============================delimiter \\create PROCEDUREp5(

OUT p_return_codetinyint)BEGIN

DECLARE exit handler forsqlexceptionBEGIN

--ERROR

set p_return_code = 1;rollback;END;

STARTTRANSACTION;DELETE fromtb1;insert into tb2(name)values('seven');COMMIT;--SUCCESS

set p_return_code = 2;END\\

delimiter ;

4.事务

75365e5b4abfc5bf6a5eef1780d1f2fa8fd.jpg

3cea33f5d8239390830c0182a1097303351.jpg

delimiter //

create procedurep6()begin

declare row_id int; --自定义变量1

declare row_num int; --自定义变量2

declare done INT DEFAULT FALSE; --默认为false 表述循环未执行完

declare temp int;--声明游标

declare my_cursor CURSOR FOR select id,num fromA;declare CONTINUE HANDLER FOR NOT FOUND SET done =TRUE;--开始循环

openmy_cursor;

xxoo: LOOPfetch my_cursor intorow_id,row_num;if done then --需要自己判断是否循环结束

leave xxoo; --结束循环

END IF;set temp = row_id +row_num;insert into B(number) values(temp);endloop xxoo;closemy_cursor;end //delimter ;

5.游标-实现循环语句

游标性能比较差,一般很少用,使用场景是:针对每一行都需要专门的处理计算的时候可能会用到,但是一般update+ 循环也能解决 如:UPDATE B set num=id+num;

851c027f7daf85dc72d057927a909430109.jpg

7430f13943e3f0b740ba3a993af53570a53.jpg

delimiter //

create procedurep7(in tpl varchar(255),in arg int)begin

set @xo =arg;PREPARE prod FROM 'select * from student where sid > ?'; --1. 预检测某个东西 SQL语句合法性

EXECUTE prod USING @xo; --2. SQL =格式化 tpl + arg

DEALLOCATE prepare prod; --3. 执行SQL语句

end //delimter ;---------------------------

call p7("select * from tb where id > ?",9)

6. 动态执行SQL(防SQL注入)

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

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

相关文章

socket抓包_64、抓包分析tcp与udp

从前面的两个案例,我们了解到了如何通过原生socket函数分别创建tcp和udp服务,以及通过相应的客户端进行连接测试。在本文中,我们将继续深入地去了解tcp和udp的差别,和思考它们两者如何应该多个客户端请求1、抓包分析这里采用tcpdu…

fw313r手机登录_迅捷(FAST)fw313r路由器手机设置教程

本文中,鸿哥主要给大家介绍,迅捷(FAST)fw313r路由器用手机设置的方法。一台新买回来的迅捷(FAST)fw313r路由器,要用手机来设置它连接Internet上网,需要以下几个步骤:1、正确连接FW313R路由器2、手机连接FW313R的信号3、…

mysql 5.6.21不能选择安装路径_mysql5.6.21服务器安装图解(选择安装和数据目录)

mysql安装图解(服务器上安装mysql,只安装mysql服务)1.3 mysql安装及配置版本:MySQL5.6.21 64位1.3.1 安装.net framework.exe 4.0注意:mysql5.6版本需要安装.net framwork.exe 4.0环境1.3.2 安装mysql数据库(1)打开安装程序后,…

爬空气质量MySQL_爬虫:利用selenium采集某某环境网站的空气质量数据

前言:在上一篇文章中,我们介绍了在http://PM2.5.in这个网站采集空气质量的数据,本篇文章是对其产生的一些问题的另一种解决方案,提供更加权威的数据采集。技术框架:selenium、json、etree这里的selenium是一种自动化测…

操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成

01.png02.png03.png04.png05.png06.png07.png08.png09.png一、mysql服务的启动和停止net stop mysqlnet start mysql二、登陆mysql语法如下: mysql -u用户名 -p用户密码键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,…

selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记

简介selenium录制器是最近刚流行起来的一个WEB自动化测试工具,由多测测团队开发。Selenium录制器采用关键字驱动的理念,简化测试用例的创建和维护,可以直接运行在浏览器中,就像真正的用户在操作一样。自动化脚本录制、一键回放、报…

cass坡度土方计算案例_60度斜坡怎么计算_南方CASS土方计算方法—方格网法

01概述在我们的日常工作中,遇到大量的土方修正算的相关咨询,为什么CASS的方格网土方修正算,方格设定为10米和20米,修正算结果有很大差异呢?从软件计算原理、数据质量等方面进行分析,读了这篇文章&#xff0…

rabbitmq+topic+java_译:5.RabbitMQ Java Client 之 Topics (主题)

我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换),并且有可能选择性地接收日志。虽然使用direct(直接交换)改进了我们的系统,但它仍然有局限性 - 它不能基于多个标准进行路由。在我们的日志系统中,我…

php 查找无限级,Ztree + PHP 无限级节点 递归查找节点法

一、前言简单的描述一下,实习几个原理,思想,其实写很多东西,思想算是最重要的。1、目标:将写一个无限节点的树形目录结构,如下图步骤:1、你的下载 插件 ztree。然后布置在你的项目中。2、相关C…

用php实现一个简易的web表单生成器,网络编程PHP Web表单生成器案例分析

本文实例讲述了PHP Web表单生成器。分享给大家供大家参考,具体如下:1.实例:2. 需求分析在项目的实际开发中,经常需要设计各种各样表单。直接编写HTML表单虽然简单,但修改、维护相对麻烦。因此,可以利用PHP实…

matlab示波器有功功率,巧用示波器计算功率-测试测量-与非网

示波器主要用于测量电流和电压,然后通过一系列魔术般的数学公式就可以计算出功率。遗憾的是,功率有许多种类:瞬时功率、有功功率、视在功率和无功功率。这么多的功率术语经常让人感到困惑。本文介绍了如何在Teledyne LeCroy HDO 6000示波器上…

php 表单提交文件大小,PHP如何通过表单直接提交大文件详解

PHP如何通过表单直接提交大文件详解前言我想通过表单直接提交大文件,django 那边我就是这么干的。而对于 php 来说,我认为尽管可以设置最大上传的大小,但最大也无法超过内存大小,因为它无法把文件内容都放到 php://input 里面。直…

php登陆项目,ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)

一、定义中间件namespace app\middleware;class Check{public function handle($request, \Closure $next){if ($request->param(name) think) {return redirect(index/think);}return $next($request);}}中间件类可以随意命名,中间件的入口执行方法必须是handl…

蓝桥杯第七届决赛之---阶乘位数

阶乘位数9的阶乘等于:362880它的二进制表示为:1011000100110000000这个数字共有19位。请你计算,9999 的阶乘的二进制表示一共有多少位? 思路总结: 根据平时做题规律得到如下规律:public class SwingDesign …

生日快乐模板php,可会有人跟我说句生日快乐

一个人一年可以经历三百六十五次零点的跨越,可是真正有意义的却只有那么一次。从呱呱坠地到现在芳华正茂,今晚将是我要度过的第二十二个零点。从此以后,我便会进入到一个崭新的年龄,弱弱的问一句:可会有人跟我说句生日…

Java排序算法之--快速算法--快速上手

何为快速算法:它是冒泡排序的改进~ 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以…

排序算法值--堆排序

堆实际上是一棵完全二叉树&#xff0c;其任何一非叶节点满足性质&#xff1a;Key[i]<key[2i1]&&Key[i]<key[2i2]或者Key[i]>Key[2i1]&&key>key[2i2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆&#x…

linux 彻底删除oracle,Linux下完美卸载Oracle

先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Oracle时出现一个错误&#xff0c;倒致oracle没有安先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Orac…

spring常见术语理解

SpringMVC工作流程&#xff1a;流程 1、用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 …

linux ssh服务,Linux配置SSH服务以便实现远程连接

Linux用户们一定想要知道该怎么开启SSH服务吧&#xff0c;SSH服务是Linux系统远程连接的重要方式&#xff0c;所以如何配置SHH服务也让很多用户感到纠结。现在小编就帮大家解决这个问题。配置方法&#xff1a;查询\安装SSH服务1.登陆linux系统&#xff0c;打开终端命令。输入 r…