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

【学习笔记】MySQL(Ⅲ)

MySQL(Ⅲ)

  • 11、 进阶篇 —— 视图
    •       11.1、概述
    •       11.2、基本语法
    •       11.3、检查选项 CASCADED
    •       11.4、检查选项 LOCAL
    •       11.5、视图的更新原则
  • 12、 进阶篇 —— 存储过程
    •       12.1、概述
    •       12.2、基本语法
    •       12.3、系统变量
    •       12.4、用户定义变量
    •       12.5、局部变量
    •       12.6、条件判断
    •       12.7、CASE
    •       12.8、循环
    •       12.9、游标 及 条件处理程序
    •       12.10、存储函数
  • 13、 进阶篇 —— 触发器
    •       13.1、概述
    •       13.2、基本语法
  • 14、 进阶篇 —— 锁
    •       14.1、概述
    •       14.2、全局锁
    •       14.3、表级锁
    •       14.4、行级锁
  • 15、 终结篇 —— InnoDB 存储引擎
  • 16、 终结篇 —— MySQL管理工具

11、 进阶篇 —— 视图

      11.1、概述

        视图(View)是MySQL中的一种虚拟表,其内容是根据预保留的 SQL 逻辑动态地查询生成的,使用视图时,数据库系统会自动执行相关的 SQL 逻辑,并返回查询结果。因此,视图可以看作是一个预定义的查询语句

优点描述
简化复杂查询通过视图,可以将复杂的查询简化为一个简单的查询,使得数据访问更加方便
安全性通过视图,可以限制用户对基表的访问,只暴露需要的数据,从而提高数据的安全性
数据抽象视图可以隐藏表的复杂结构,为用户提供一个更简洁的接口
数据一致性通过视图,可以确保不同用户看到的数据一致
视图的限制
① 视图不支持索引、触发器和默认值
② 某些复杂的查询可能不能直接转换为可更新的视图
③ 视图的性能可能不如直接查询基表,因为视图需要动态生成数据

      11.2、基本语法

创建:CREATE [ OR REPLACE ] VIEW 视图名 AS SELECT语句
自定义列名字:CREATE [ OR REPLACE ] VIEW(列名1,列名2...) 视图名 AS SELECT语句
查询创建视图的语句:SHOW CREATE VIEW 视图名
查询视图的数据:跟查询普通的表一样
修改视图法1:CREATE OR REPLACE VIEW 视图名 AS SELECT语句
修改视图法2:ALTER VIEW 视图名 AS SELECT语句
删除视图:DROP VIEW [ IF EXISTS ] 视图名

-- 创建视图
create OR REPLACE VIEW user_v_1 AS SELECT * FROM tb_user where age < 30;-- 查询创建视图的语句
SHOW CREATE VIEW user_v_1;-- 查询视图数据
SELECT * FROM user_v_1;-- 修改视图
CREATE OR REPLACE VIEW user_v_1 AS SELECT name,age FROM tb_user WHERE age < 30;
SELECT * FROM user_v_1;
ALTER VIEW user_v_1(姓名,年龄) AS SELECT name,age FROM tb_user WHERE age < 30;
SELECT * FROM user_v_1;-- 删除视图
DROP VIEW user_v_1;

      11.3、检查选项 CASCADED

        当我们往视图中插入数据时,其实会插入到关联的基表中,然而当我们插入的数据不符合视图的 SQL 逻辑时(例如视图呈现年龄小于30的,然后插入了一条年龄40的数据),会出现一种通过这个视图进行插入数据,但插入后这个视图又看不到的情况,显得不太尊重这个视图,例如

-- 建表
CREATE TABLE student(id int AUTO_INCREMENT PRIMARY KEY,name varchar(10),age int,gender char(1)
)--插入数据
INSERT INTO student(name,age,gender) VALUES ('Niki',21,'男'),('Tom',23,'男'),('Siri',27,'女'),('Jerry',28,'男');-- 创建视图
CREATE VIEW stu_v_1 AS SELECT name,age FROM student WHERE age < 25;-- 通过视图插入数据
INSERT INTO stu_v_1(name,age) VALUES ('Sara',24);
INSERT INTO stu_v_1(name,age) VALUES ('Zayn',29);
SELECT * FROM stu_v_1; # 第二条插入的数据看不到

        因此我们可以给视图添加 CASCADED 检查选项,当为视图插入或更新的数据,需要满足其 SQL 逻辑才能插入成功

语法:CREATE VIEW 视图名 AS SELECT语句 WITH [ CASCADED ] CHECK OPTION ;( WITH CHECK OPTION 默认选 CASCADE )

-- 先删掉上插入的两条数据
DELETE FROM student WHERE name = 'Sara' OR name = 'Zayn';-- 修改视图
ALTER VIEW stu_v_1 AS SELECT name,age FROM student WHERE age < 25 WITH CASCADED CHECK OPTION ;-- 再次通过视图插入数据
INSERT INTO stu_v_1(name, age) VALUES ('Sara', 24);
INSERT INTO stu_v_1(name, age) VALUES ('Zayn', 29); # 插入失败

        CASCADED 的工作原理是,检查插入的数据是否满足当前视图的 SQL 逻辑,以及满足所依赖的视图的 SQL 逻辑,例如

依赖选项SQL逻辑在v3插入age=11、17、28
视图 v3v2-age<=15没有检查选项,直接通过
视图 v2v1CASCADEDage>=1011:符合,17:符合,28:符合
视图 v1基表-age<=20受 v2 的CASCADED影响,v1也要检查
11:符合,17:符合,28:拦截
基表---11、17插入成功,28插入失败

      11.4、检查选项 LOCAL

        LOCAL 也是一种检查约束,与 CASCADED 不同的是,它只会对当前的视图做检查,而不会让其父视图也要做检查

语法:CREATE VIEW 视图名 AS SELECT语句 WITH LOCAL CHECK OPTION ;

依赖选项SQL逻辑在v3插入age=14
视图 v3v2-age<<20没有检查选项,直接通过
视图 v2v1LOCALage>=1014:符合
视图 v1基表-age<=15没有检查选项,直接通过
基表---14插入成功

      11.5、视图的更新原则

        当视图的每一行与基表中的每一行是一一对应的关系时,视图才可以更新,如果视图的 SQL 逻辑包含以下任何一项,则视图不能更新

不可更新的关键字
聚合函数,例如 SUM(),MIN()、MAX()、COUNT()等
DISTINCE
GROUP BY
HAVING
UNION 或者 UNION ALL

12、 进阶篇 —— 存储过程

      12.1、概述

        存储过程是一组预编译的SQL语句,这些语句存储在数据库中,可以通过调用来执行。存储过程允许你将业务逻辑封装在数据库中,提供了一种更高效和灵活的方法来处理数据(函数)

优点描述
提高性能存储过程在首次执行时会被编译并缓存起来,以后再调用时直接执行编译好的代码,减少了SQL解析和编译的时间
重用代码存储过程可以多次调用,避免了代码重复,提高了代码的可维护性
安全性通过存储过程,可以控制对数据库的访问权限,保护底层数据
简化复杂操作将复杂的业务逻辑封装在存储过程中,使得应用程序调用更简洁
减轻网络负担将多个SQL语句封装起来存储在数据库中,现在发送一次请求即可完成相应的业务,而不是将多个SQL语句一句一句地与数据库交互,减轻了网络负担

      12.2、基本语法

创建:CREATE PROCEDURE 存储过程名([IN输入的参数列表,OUT返回的参数列表]) BEGIN ... END
调用:CALL 存储过程名([参数])
查看指定数据库的存储过程信息:SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '数据库名'
查看存储过程的创建语句:SHOW CREATE PROCEDURE 存储过程名
删除:DROP PROCEDURE 存储过程名

-- 创建存储过程
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) FROM student;
END;

相关文章:

  • 黑苹果睡眠总是自动唤醒(RTC)
  • JavaEE初阶--网络基本概念
  • 2024年宜春市中职“网络建设与运维”竞赛说明竞赛试题
  • 快速压缩前端项目
  • 【Windchill监听器、队列、排程】
  • is not null 、StringUtils.isNotEmpty和StringUtils.isNotBlank之间的区别?
  • 【技巧】Leetcode 67. 二进制求和【简单】
  • uni-app前端,社区团购系统搭建部署
  • 汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片
  • 【MySQL】在CentOS环境下安装MySQL
  • Qt 6.13
  • 源码编译安装 clang/gcc
  • 查看一个网站是否是用React搭建的
  • 安全等保评测-什么是“等保“?
  • 零基础入门学用Arduino 第三部分(二)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • es6
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JAVA多线程机制解析-volatilesynchronized
  • Kibana配置logstash,报表一体化
  • Netty 4.1 源代码学习:线程模型
  • Octave 入门
  • PHP 小技巧
  • Python 反序列化安全问题(二)
  • Python利用正则抓取网页内容保存到本地
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 创建一种深思熟虑的文化
  • 二维平面内的碰撞检测【一】
  • 强力优化Rancher k8s中国区的使用体验
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 智能网联汽车信息安全
  • 进程与线程(三)——进程/线程间通信
  • ​【已解决】npm install​卡主不动的情况
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​iOS实时查看App运行日志
  • ######## golang各章节终篇索引 ########
  • #在 README.md 中生成项目目录结构
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (七)Java对象在Hibernate持久化层的状态
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十八)三元表达式和列表解析
  • (四)opengl函数加载和错误处理
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)activiti-modeler 编辑器初步优化
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原)Matlab的svmtrain和svmclassify
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)详解PHP处理密码的几种方式