首页 > 数据库 >【学习笔记】MySQL(Ⅲ)

【学习笔记】MySQL(Ⅲ)

时间:2024-06-19 12:59:22浏览次数:27  
标签:存储 age 视图 学习 插入 笔记 MySQL SELECT VIEW

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
视图 v3 v2 - age<=15 没有检查选项,直接通过
视图 v2 v1 CASCADED age>=10 11:符合,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
视图 v3 v2 - age<<20 没有检查选项,直接通过
视图 v2 v1 LOCAL age>=10 14:符合
视图 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()
BEGIN
    SELECT COUNT(*) FROM student;
END;

标签:存储,age,视图,学习,插入,笔记,MySQL,SELECT,VIEW
From: https://blog.csdn.net/Eddie_hyh/article/details/139678733

相关文章

  • 结构动力学教材-学习笔记
    参考教材:振动力学,(刘延柱,陈文良,陈立群),出版日期1998.10结构动力学,克拉夫,第二版阻尼性能是我硕士课题的主要工作,着眼点在:如何描述符合材料结构的阻尼?什么因素影响了结构的阻尼性能大小?怎么表示阻尼性能的大小?如何计算阻尼性能?阻尼模型梁超锋.混凝土材料与......
  • mysql中先进先出的例子
    在MySQL中,实现"先进先出"(FIFO,FirstInFirstOut)的数据结构通常不直接通过数据库的表结构来完成,因为数据库表本身并不保持元素的插入顺序。然而,你可以通过几种方法来模拟FIFO的行为。以下是一个简单的例子,说明如何在MySQL中模拟FIFO队列:使用带有时间戳的表你可以创建一个......
  • 人工智能(AI)与机器学习(ML):塑造未来的技术引擎
    目录前言一、人工智能(AI)概述二、机器学习(ML)的作用:深入解析与应用前景1、机器学习的作用机制2、机器学习在各个领域的应用3、机器学习的挑战与前景三、AI与ML的融合与应用:深度解析与前景展望1、AI与ML的融合机制2、AI与ML在自动驾驶领域的应用3、AI与ML在医疗领域的应......
  • k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
    文章目录OpenKruise简介OpenKruise来源OpenKruise是什么?核心组件有什么?有什么特性和优势?适用于什么场景?什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理应用环境一、OpenKruise部署1.安装helm客户端工具2.通过helm安装二、Open......
  • Java调用mysql后台函数的例子
    在Java中调用MySQL后台的存储函数(注意,这里我们区分存储过程和存储函数:存储过程没有返回值,但可以通过输出参数返回数据;而存储函数有一个返回值)时,你需要使用CallableStatement来执行这个函数并获取返回值。以下是一个简单的例子,说明如何在Java中调用MySQL的存储函数:MySQL存储函......
  • 小型企业人事管理系统java ssm mysql|全套源码+文章lw+毕业设计+课程设计+数据库+ppt
    小型企业人事管理系统javassmmysql|全套源码+文章lw+毕业设计+课程设计+数据库+ppt小型企业人事管理系统的设计与实现【摘要】:人才是企业发展的核心力量,所以人事管理是企业管理中一项重要的任务。传统的人事管理系统不仅效率慢而且极易出错,使管理者不能清楚的了解每一位......
  • 详解联邦学习中的异构模型集成与协同训练技术
    本文分享自华为云社区《联邦学习中的异构模型集成与协同训练技术详解》,作者:Y-StarryDreamer。引言随着数据隐私和安全问题的日益突出,传统的集中式机器学习方法面临着巨大的挑战。联邦学习(FederatedLearning)作为一种新兴的分布式机器学习方法,通过将模型训练过程分布在多个参与者......
  • 机器学习课程复习——朴素贝叶斯
    1.定义是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。2.公式原版公式简化版公式由于上述公式无法计算,引入条件独立假设条件独立版公式3.贝叶斯分类器由上述公式可得贝叶斯分类器化简为4.参数估计4.1.极大似然估计4.2.学习与分类算法4.2......
  • MySQL存储引擎之MyISAM与InnoDB详解
    文章目录MySQL存储引擎之MyISAM与InnoDB详解MyISAM存储引擎MyISAM的特点InnoDB存储引擎InnoDB的特点InnoDB插入数据示例面试题总结解答为什么InnoDB一定要有一个主键?为什么主键要用整型?为什么主键建议使用自增?总结MySQL存储引擎之MyISAM与InnoDB详解在MySQL中,......
  • MySQL的字符集与排序规则
    在MySQL数据库中,字符集(CharacterSet)和排序规则(Collation)是两个至关重要的概念,它们共同决定了数据库中字符数据的存储、比较和排序方式。对于涉及多语言、国际化或特殊字符处理的应用来说,正确选择和使用字符集与排序规则尤为关键。一、字符集(CharacterSet)字符集定义了数据库......