1. 视图  

视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。
使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,
但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,
因此不推荐使用. 而且工作中一般不方便,因为是虚拟表 不方便共用,如果需要修改,可能设计到与DBA的沟通,很麻烦

  -- 使用视图
select .. from v1
select asd from v1
-- 某个查询语句设置别名,日后方便使用 - 创建
create view 视图名称 as SQL PS: 虚拟的,临时表 无法插入操作 - 修改
alter view 视图名称 as SQL - 删除
drop view 视图名称;

2. 触发器

定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
工作中一般也很少用到,因为自己在代码中就能设计操作前后的行为

insert into tb (....)

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语句执行中调用函数会比较耗时,而且对索引的那一列使用了函数,则无法命中索引了。

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

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

-- 内置函数:
执行函数 select CURDATE(); blog
id title ctime
1 asdf 2019-11
2 asdf 2019-11
3 asdf 2019-10
4 asdf 2019-10 select ctime,count(1) from blog group ctime select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")
2019-11 2
2019-10 2 DATE_FORMAT 时间格式化函数,较常用 -- 自定义函数(必须有返回值): delimiter \\
create function f1(
i1 int,
i2 int)
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中代码属于强类型语言, 变量需要先 声明 变量名 和 变量类型.

1.简单示例
delimiter //
create procedure p2(
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)

delimiter //
create procedure p3(
in n1 int,
inout n2 int
)
BEGIN
set n2 = 123123;
select * from student where sid > n1;
END //
delimiter ; -------------------
set @v1 = 10;
call p2(12,@v1)
select @v1; set @_p3_0 = 12
ser @_p3_1 = 2
call 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伪造的返回值?

delimiter //
create procedure p3(
in n1 int,
out n2 int -- 用于标识存储过程的执行结果 一般用 tinyint 1,2等来表示相应的执行结果,方便程序获取后知道执行结果
)
BEGIN
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
END //
delimiter ;
delimiter //
create procedure p4(
out status int
)
BEGIN
-- 伪代码描述
1. 声明如果出现异常则执行{
set status = 1;
rollback;
} 开始事务
-- 由秦兵账户减去100
-- 方少伟账户加90
-- 张根账户加10
commit;
结束 set status = 2; END //
delimiter ; ===============================
delimiter \\
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END; START TRANSACTION;
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT; -- SUCCESS
set p_return_code = 2; END\\
delimiter ;

4.事务

delimiter //
create procedure p6()
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 from A;
declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 开始循环
open my_cursor;
xxoo: LOOP
fetch my_cursor into row_id,row_num;
if done then -- 需要自己判断是否循环结束
leave xxoo; -- 结束循环
END IF;
set temp = row_id + row_num;
insert into B(number) values(temp);
end loop xxoo;
close my_cursor; end //
delimter ;

5.游标-实现循环语句

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

delimiter //
create procedure p7(
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注入)

MySQL视图,函数,触发器,存储过程的更多相关文章

  1. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  2. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  3. Mysql中函数和存储过程的区别

    Mysql中函数和存储过程的区别 存储过程: 1.       可以写sql语句 2.       inout,out构造返回值 3.       调用:call:存储过程名称 4.       可以 ...

  4. mysql导出函数或者存储过程 设置显示方式

    mysql导出函数或者存储过程 mysqldump -hhostname -uusername -ppassword -ntd -R databasename > /app/backupflie ...

  5. SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  6. MySQL 视图、触发器、函数、存储过程

    1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...

  7. python开发mysql:视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  8. MySQL视图、触发器、事务、存储过程、函数

    视图.触发器.事务.存储过程.函数   阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据 ...

  9. Mysql视图、触发器、事务、储存过程、函数

    一.视图 什么是视图 视图是有一张表或多张表的查询结果构成的一张虚拟表 为什么使用视图 当我们在使用多表查询时 我们的sql语句可能会非常的复杂,如果每次都编写一遍sql'的话无疑是一件麻烦的事情,这 ...

  10. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

随机推荐

  1. Django(一) 安装使用基础

    大纲 安装Django 1.创建Django工程 2.创建Django app 3.写一个简单的登录注册相应页面 4.获取用户请求信息并处理 5.前后端交互 6.Django 请求 生命周期  跳转到 ...

  2. 如何从官网下载 Google Chrome 离线安装包

    1.打开 Chrome 浏览器主页:http://www.google.cn/chrome 2.地址栏最后的网址是这样的:http://www.google.cn/chrome/browser/des ...

  3. python登录网页版微信发送消息

    # coding=utf-8 import datetime import time from selenium import webdriver url = "https://wx2.qq ...

  4. HDOJ 5639 Transform

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意:有一个数x,你可以对x进行两种操作,1.反转x二进制其中任意一位2.x^y(y题目给出), ...

  5. nuxt.js实战之引入jquery

    head: { title: 'nuxt', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-widt ...

  6. python中的__metaclass__

    什么是元类: python中类也是一种对象, 可以称为类对象. 元类就是用来创建类对象的"东西". 你创建类就是为了创建类的实例对象, 不是吗? 但是我们已经学习了python中的 ...

  7. Java计算文件MD5值(支持大文件)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.securit ...

  8. java matlab 混合编程 Failed to find the required library mclmcrrt9_2.dll on java.library.path.

    问题描述: Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the requir ...

  9. HTML/CSS: 如何制作未读信息图标

    最近公司项目中涉及到制作通讯界面中未读信息的带数字的红色圆点图标. 拿我目前的博客头像图片为例(其实就是谷歌图片中粗略挑了一张顺眼的图片),效果图如下: HTML代码如下: <img id=&q ...

  10. MongoDB 分片集群技术

    在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...