本文源码:GitHub·点这里 || GitEE·点这里

一、存储过程

1、概念简介

存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行。存储过程核心思想就是数据库SQL语言层面的封装与重用性。使用存储过程可以较少应用系统的业务复杂性,但是会增加数据库服务器系统的负荷,所以在使用时需要综合业务考虑。

2、基本语法格式

CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
  • 案例一:计算消费折扣
-- 创建存储过程
DROP PROCEDURE IF EXISTS p01_discount ;
CREATE PROCEDURE p01_discount(IN consume NUMERIC(5,2),OUT payfee NUMERIC(5,2))
BEGIN
-- 判断收费方式
IF(consume>100.00 AND consume<=300.00) THEN
SET payfee=consume*0.8;
ELSEIF (consume>300.00) THEN
SET payfee=consume*0.6;
ELSE
SET payfee = consume;
END IF;
SELECT payfee AS result;
END ;
-- 调用存储过程
CALL p01_discount(100.0,@discount);
  • 案例二:While..Do写数据

提供一张数据表

CREATE TABLE `t03_proced` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`temp_name` varchar(20) DEFAULT NULL COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='触发器写数据';

存储程序

根据传入的参数,判断写入t03_proced表的数据条数。

DROP PROCEDURE IF EXISTS p02_batch_add ;
CREATE PROCEDURE p02_batch_add(IN count INT(11))
BEGIN
DECLARE temp int default 0;
WHILE temp < count DO
INSERT INTO t03_proced(temp_name) VALUES ('pro_name');
SET temp = temp+1 ;
END WHILE;
END ; -- 测试:写入10条数据
call p02_batch_add(10);

3、注意事项

  • 业务场景

存储过程在实际开发中的应用不是很广泛,通常复杂的业务场景都在应用层面开发,可以更好的管理维护和优化。

  • 执行速度

假如在单表数据写入的简单场景下,基于应用程序写入,或者数据库连接的客户端写入,相比存储过程写入的速度就会慢很多,存储过程在很大程度上没有网络通信开销,解析开销,优化器开销等。

二、MySQL视图

1、基本概念

视图本身是一张虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,获取的数据是MySQL从其它表中生成的,视图和表在同一个命名空间。视图查询数据相对安全,视可以隐藏一些数据和结构,只让用户看见权限内的数据,使复杂的查询易于理解和使用。

2、视图用法

现在基于用户和订单管理演示视图的基本用法。

  • 基础表结构
CREATE TABLE v01_user (
id INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
user_name VARCHAR(20) DEFAULT NULL COMMENT '用户名',
phone VARCHAR(20) DEFAULT NULL COMMENT '手机号',
pass_word VARCHAR(64) DEFAULT NULL COMMENT '密码',
card_id VARCHAR(18) DEFAULT NULL COMMENT '身份证ID',
pay_card VARCHAR(25) DEFAULT NULL COMMENT '卡号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户表'; CREATE TABLE v02_order (
id INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
user_id INT(11) NOT NULL COMMENT '用户ID',
order_no VARCHAR(32) DEFAULT NULL COMMENT '订单编号',
good_name VARCHAR(60) DEFAULT NULL COMMENT '商品名称',
good_id INT(11) DEFAULT NULL COMMENT '商品ID',
num INT(11) DEFAULT NULL COMMENT '购买数量',
total_price DECIMAL(10,2) DEFAULT NULL COMMENT '总价格',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '订单表';
  • 基本语法
CREATE OR REPLACE VIEW view_name
AS select_statement

注意事项:表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。

  • 用户订单视图
CREATE OR REPLACE
VIEW user_order_view AS SELECT
t1.id,t1.user_name,t2.order_no,t2.good_id,
t2.good_name,t2.num,t2.total_price
FROM v01_user t1
LEFT JOIN v02_order t2 ON t2.user_id = t1.id;
  • 视图调用

这里和MySQL的表查询基本一致,可以使用各种查询条件。

SELECT * FROM user_order_view WHERE user_name='Cicada';
  • 查看视图
SHOW CREATE VIEW user_order_view ;
  • 修改视图
ALTER VIEW view_name AS select_statement ;
  • 删除视图
DROP VIEW [IF EXISTS] view_name ;

3、视图更新

在指定条件允许的情况下,可以通过在视图上操作更新,删除,甚至写入数据,进而更新视图所涉及的相关表。

UPDATE user_order_view SET user_name='smile' WHERE id='1';

这里就通过对视图执行更新操作,进而更新v01_user表数据。如果视图定义时使用聚合函数,分组等特殊操作,则无法更新。MySQL不支持在视图上创建触发器。

4、视图实现

  • 临时表算法

服务器会把视图查询SQL的数据保存在临时表中,临时表的结构和视图字段结构一致,这样是SQL查询优化中最忌讳的操作,数据量稍微偏大,就会严重影响性能。如果视图无法和原有表产生一对一的映射关系,就会产生临时表,由此也可见视图并不是很简单,甚至是非常复杂的功能。

  • 合并算法

服务器基于视图中使用的表执行查询,最后把查询结构合并后返回给客户端。

  • 区别方法

执行如下查询语句,可以分析执行的性能参数。

EXPLAIN SELECT * FROM user_order_view ;

观察查询结果中select_type字段,如果是DERIVED则说明使用临时表。这里SQL执行分析的语法后面优化部分再详解。

5、注意事项

  • 性能问题

MySQL并不支持在视图中创建索引,使用视图的时候可能会引发很多查询性能问题,所以建议使用的时候要慎重,多角度审视和测试。

  • 特殊用法

基于视图的查询,可以修改部分表结构,只要不是在视图中使用的字段,就不会影响视图的查询。

三、源代码地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

MySQL基础篇(04):存储过程和视图,用法和特性详解的更多相关文章

  1. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

  2. MySQL入门篇(三)之my.cnf配置文件详解【转】

    转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html #*** client options 相关选项 ***# #以下选项会被MySQL客 ...

  3. 单片机成长之路(51基础篇) - 013 MCS-51单片机控制详解–T2MOD

    T2CON:定时器控制寄存器 寄存器地址0C8H,位寻址0C8H-0CFH. 位地址 CF CE CD CC CB CA C9 C8 位符号 TF2 EXF2 RCLK TCLK EXEN2 TR2 ...

  4. 单片机成长之路(51基础篇) - 012 MCS-51单片机控制详解–TMOD T2MOD

    TMOD:工作方式控制寄存器 寄存器地址89H,不可位寻址. 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 GATE C/T M1 M0 GATE——门控 ...

  5. 基础篇-http协议《http 简介、url详解、request》

    目录 一.http 简介 二.url 详解 三.request 1.get 和 post 2.请求方法 3.request 组成 4.请求头 5.get 请求参数 6.post 请求参数 7.post ...

  6. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  7. 【目录】mysql 基础篇系列

    随笔分类 - mysql 基础篇系列 mysql 开发基础系列22 SQL Model(带迁移事项) 摘要: 一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql m ...

  8. 重新整理 mysql 基础篇————— 介绍mysql[一]

    前言 准备整理mysql的基础篇了,前面整理了sql语句序列的的<sql 语句系列(八百章)>,感觉很多用不上,就停下来了,后续还是会继续整理. mysql 基础篇主要是对一些基础进行整理 ...

  9. MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...

随机推荐

  1. HZOJ 大佬(kat)

    及其水水水的假期望(然而我已经被期望吓怕了……). 数据范围及其沙雕导致丢掉5分…… 因为其实每天的期望是一样的,考虑分开. f[i][j]表示做k道题,难度最大为j的概率. 则f[i][j]=(f[ ...

  2. Serverless助力AI计算:阿里云ACK Serverless/ECI发布GPU容器实例

    ACK Serverless(Serverless Kubernetes)近期基于ECI(弹性容器实例)正式推出GPU容器实例支持,让用户以serverless的方式快速运行AI计算任务,极大降低AI ...

  3. [Pytorch]基于混和精度的模型加速

    这篇博客是在pytorch中基于apex使用混合精度加速的一个偏工程的描述,原理层面的解释并不是这篇博客的目的,不过在参考部分提供了非常有价值的资料,可以进一步研究. 一个关键原则:“仅仅在权重更新的 ...

  4. 系统学习前端之FormData详解

    FormData 1. 概述 FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利. 2. 构造函数 创建一 ...

  5. 在Linux/Unix上运行SuperSocket

    SuperSocket通过(Mono 2.10或更新版本)来实现跨平台的特性 由于Unix/Linux不同于Windows上的文件路径格式,SuperSocket提供了专用于Unix/Linux系统上 ...

  6. lrj 9.4.1 最长上升子序列 LIS

    p275 d(i)是以Ai为结尾的最长上升子序列的长度 <算法竞赛入门经典-训练指南>p62 问题6 提供了一种优化到 O(nlogn)的方法. 文本中用g(i)表示d值为i的最小状态编号 ...

  7. 利用谓词实现List<>的Find等高级操作

    public class Person        {            public int Id { get; set; }            public string Name { ...

  8. Codeforces Round #178 (Div. 2)

    A. Shaass and Oskols 模拟. B. Shaass and Bookshelf 二分厚度. 对于厚度相同的书本,宽度竖着放显然更优. 宽度只有两种,所以枚举其中一种的个数,另一种的个 ...

  9. H3C 基本ACL

  10. 【codeforces 761B】Dasha and friends

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...