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

MySQL-视图、存储过程和触发器

一、视图的定义和使用 

        视图是从一个或者几个基本表(或视图)导出的表。它与基本表不同,是一个虚表,视图只能用来查询。不能做增删改查(虚拟的表)

1.视图的作用

  1. 简化查询
  2. 重写格式化数据
  3. 频繁访问数据库
  4. 过滤数据
2.创建视图

-- 创建视图
-- 语法:create view 视图名 【view_xxx / v_xxx】
-- as 查询语句


CREATE VIEW v_stu_man AS
SELECT * FROM student WHERE ssex = '男';
3.视图的使用
-- 视图的使用
SELECT * FROM v_stu_man;

运用:

//创建一个新视图
CREATE VIEW v_vstuman_class AS
SELECT v_stu_man.*,classname FROM v_stu_man
LEFT JOIN class ON v_stu_man.classid = class.classid
//使用这个视图
SELECT * FROM v_vstuman_class

若修改表中的Sid = 1的Sname='赵蕾蕾',查看数据显示结果

UPDATE student SET sname = '赵蕾蕾' WHERE sid = 1

4.查看库中所有的视图
-- 查看库中所有的视图
SELECT * FROM
information_schema.VIEWS 
WHERE table_schema = 'schoolp';

5.删除视图 
-- 删除视图
DROP VIEW v_stu_man;

二、存储过程的创建和使用

1.什么是存储过程

        存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数)来执行它。

简单来讲就是:SQL语句集+预编译+特定功能

2.为什么要使用存储过程
  1. 业务流程复杂:业务复杂时,SQL语句相互依赖, 顺序执行;
  2. 频繁访问数据库:每条SQL语句都需单独连接和访 问数据库;
  3. 先编译后执行:SQL语句的执行需要先编译。
3.创建存储过程

语法:# 存储过程
-- create procedure 存储过程名字【proc_xxx】(形参列表)
-- begin
--     一组sql语句集
-- end

-- 创建最简单存储过程
DELIMITER $$
CREATE PROCEDURE proc_test()
BEGINSELECT * FROM student;
END  $$
DELIMITER;
4.存储过程的操作
调用存储过程CALL 存储过程名 [参数名]
查看存储过程SELECT * FROM information_schema.ROUTINES WHERE routine_schema=‘库名’
删除存储过程DROP PROCEDURE 存储过程名;
-- 存储过程的基本用法
DELIMITER $$ -- 定制定界符
creat PROCEDURE pro_showstudent()
BEGINSELECTstudent.Sname,student.birthday,student.classid,student.Sid,student.Ssex
FROM student 
LEFT JOIN sc  ON student.Sid = sc.Sid
LEFT JOIN course ON course.Cid = sc.Cid
END$$
DELIMITER ; -- 恢复默认的定界符
CALL pro_showstudent();
-- 带参数的存储过程
DELIMITER $$
CREATE PROCEDURE proc_test2(IN a INT,   -- in 只入参(值传递)OUT b INT,  -- out 只出参 (无)INOUT c INT -- inout 出入参 (引用传递)
)
BEGIN SET a = a+1;SET b = b+100;SET c = c+1000;
END $$
DELIMITER ;-- 环境变量  @ 局部环境变量  @@ 全局环境变量
SET @X = 10;   
SET @Y = 20;     
SET @z = 30;      SELECT @X, @Y, @z;CALL proc_test2(@X,@Y,@z)SELECT @X, @Y, @z;

(面试题)写一个分页的存储过程

DELIMITER $$
CREATE PROCEDURE proc_stuPage(IN curpage INT,-- IN sizepage INT,OUT stucount INT,OUT pagecount INT
)
BEGIN DECLARE cp INT;-- 声名和定义局部变量的语句SET cp = (curpage-1)*sizepage;SELECT COUNT(*) FROM student INTO stucount;SET pagecount = CEILING(stucount / sizepage); -- ceiling 向上取整SELECT * FROM student LIMIT (curpage-1)*sizepage;,sizepage;
END $$
DELIMITER ;SET @a = 0;
SET @b = 0;
CALL proc_stuPage(2,3,@a,@b);SELECT @a,@b

5.存储过程与函数的区别
语法关键字不同,存储过程是procedure, 函数是function;
执行存储过程可以独立执行,函数必须依 赖表达式的调用;
返回值存储过程可以定义多个返回结果, 函数只有一个返回值;
功能函数不易做复杂的业务逻辑,但是存 储过程可以。
6.存储过程的缺陷
维护性存储过程的维护成本高,修改调试较为麻烦。
移植性大多数关系型数据库的存储过程存在细微差异。
协作性没有相关的版本控制或者IDE,团 队中对于存储过程的使用大多是 依赖文档。

三、触发器

1.什么是触发器

.

一种存储过程与表相关联自动执行
 触发器是数据库中针对数据库表操作触发的 特殊的存储过程。
2.创建触发器
DELIMITER $$
CREATE TRIGGER trig_delstu_delsc
BEFORE DELETE ON student FOR EACH ROW 
BEGIN -- old 已经存在的数据 、 new  还不存在的数据DELETE FROM sc WHERE sid = old.sid;
END $$
DELIMITER ;
3.触发器的查看
SELECT * FROM information_schema.`TRIGGERS`
WHERE trigger_schema = 'schoolp'

四、存储过程和触发器的区别

语法关键字不同,存储 过程是procedure, 触发器是trigger;
执行存储过程需要调用才执 行,触发器自动执行;
返回值存储过程可以定义返回值, 但是触发器没有返回值;
功能存储过程是一组特定功能的 SQL语句,触发器则是SQL语 句前后执行,本身不影响原功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTML常用的转义字符——怎么在网页中写“<div></div>”?
  • ArcGIS Pro SDK (九)几何 15 转换
  • 6.3 面向对象技术-设计模式
  • C++ - 基于多设计模式下的同步异步⽇志系统
  • 如何系统的学习C++和自动驾驶算法
  • SAP PP学习笔记31 - 计划运行的步骤2 - Scheduling(日程计算),BOM Explosion(BOM展开)
  • 把redis用在Java项目
  • python_基础编程_字典、集合
  • C语言图书信息管理系统
  • 导航网站WP主题/WP黑格导航主题BlackCandy-简约酷黑色高逼格+焕然一新的UI设计
  • 多区域DNS以及主从DNS的搭建
  • 【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(下)
  • 防火墙与入侵检测系统(IDS/IPS)在现代网络安全中的关键角色
  • java--jvm虚拟机(都是要点)
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卡牌游戏(200分) - 三语言AC题解(Python/Java/Cpp)
  • @angular/forms 源码解析之双向绑定
  • “大数据应用场景”之隔壁老王(连载四)
  • 【mysql】环境安装、服务启动、密码设置
  • java2019面试题北京
  • JavaScript 奇技淫巧
  • js ES6 求数组的交集,并集,还有差集
  • Mysql数据库的条件查询语句
  • mysql外键的使用
  • Python连接Oracle
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 回顾2016
  • 机器学习中为什么要做归一化normalization
  • 基于HAProxy的高性能缓存服务器nuster
  • 聚类分析——Kmeans
  • 面试遇到的一些题
  • 排序(1):冒泡排序
  • 前端面试总结(at, md)
  • 设计模式 开闭原则
  • 手机app有了短信验证码还有没必要有图片验证码?
  • ​比特币大跌的 2 个原因
  • ​马来语翻译中文去哪比较好?
  • # 安徽锐锋科技IDMS系统简介
  • #define与typedef区别
  • #if等命令的学习
  • #Linux(Source Insight安装及工程建立)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)丶RabbitMQ的六大核心
  • (二十四)Flask之flask-session组件
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (算法设计与分析)第一章算法概述-习题
  • (杂交版)植物大战僵尸
  • ***检测工具之RKHunter AIDE
  • ./configure、make、make install 命令
  • .NET C# 配置 Options
  • .NetCore实践篇:分布式监控Zipkin持久化之殇