MySQL的进阶使用方法

 【前言】

view
    直接对某张表的操作,就是在对数据库系统的逻辑模型层的操作。但让所有用户都看到整个逻辑模型是不合适的。出于安全的考虑,如会隐藏某个属性。这时就需要这种‘虚表’,它向用户透露一部分的数据,它不属于逻辑模型层的。我们称它为视图。视图并不是预先计算并存储的,而是在使用的时候才通过执行查询被计算出来

定义一个视图:

    create view V as <查询语句> 

create view stuent_view asselect a.*,b.name as gradeName  from student a  join grade b on a.gradeId = b.id where a.age>20;

                存在的视图也可以用来定义另一个视图


视图维护
    为保证视图中数据的一致性,必需有一些的策略对其进行维护

            第一种,数据库系统仅仅只是存储视图的查询表达式。当真正的用到该视图时才去执行这个查询。这种方式保证了数据的一致,但是如果频繁使用该视图,这种方式就不如直接存储视图内容来的划算。

            第二种,数据库系统直接存储视图的内容。为保证数据的一致性,就要求在逻辑视图更新后,相应的视图也要即时的更新。同时暴露的问题就是,如果逻辑层更新频繁,那么视图也会跟着更新。最差的情况是,你还不怎么用这个视图。

            第三种,存储内容后定期的更新视图。这种似乎综合上面两种方案。但有个致命的点是,你没法保证视图中的数据是最新的。

    使用哪种方式,不仅要根据情况来定。而且最重要的是,数据库系统是否支持你使用以上三种的维护方式


视图更新
    视图是一张” 虚表 “,想要这张表支持增删改,却是一个重大的问题。至少目前不能做到

【1】什么是视图

  • 视图就是通过查询得到一张虚拟表,然后保持下来,下次可以直接使用

  • 视图也是一张表

【2】为什么要用视图

  • 如果要频繁操作一张虚拟表(拼表组成),就可以制作成视图,后续直接操作。

【3】视图的优点

  • 简化复杂查询:

    • 视图可以对基本表进行复杂的操作,包括连接多个表、过滤条件、聚合函数等。

    • 通过定义视图,可以将复杂的查询逻辑封装到一个简单的视图中,使用户能够以更简洁明了的方式进行数据检索。

  • 数据安全性:

    • 视图可以限制用户对数据的访问权限,通常用于隐藏敏感数据或只提供部分数据给特定的用户。

    • 通过定义视图并设置相应的权限,可以保护数据的安全性,防止未经授权的用户访问敏感信息。

  • 数据完整性:

    • 视图可以用于实现数据完整性约束,即对数据的有效性进行验证。

    • 通过定义视图并添加计算列、过滤条件等约束,可以确保所返回的数据满足一定的条件,提高数据的准确性和一致性。

  • 逻辑数据独立性:

    • 视图使得应用程序与数据之间解耦,即应用程序不需要了解底层表结构的细节。

    • 这样,当底层数据库发生变化时(如表结构修改),只需调整底层视图的定义而无需修改应用程序,从而提高系统的可维护性和扩展性。

  • 性能优化:

    • 物化视图是一种缓存机制,可以将视图的查询结果存储在磁盘上,以提高查询性能。

    • 当基本表的数据频繁变动时,物化视图可以减少查询的计算开销和响应时间,提升系统的性能。

【4】总结

  • 使用视图可以简化查询操作、保护数据安全性、实现数据完整性、提高系统的可维护性和性能优化。

  • 视图提供了一种灵活安全的数据访问方式,使用户能够根据自身需要方便地获取和操作数据。

【1】语法结构

create view 视图名(表名) as 虚拟表的查询SQL语句

【2】创建视图

  • 首先,要使用create view 语句创建一个视图。

    • 在创建视图时,需要指定视图的名称以及要查询的源表和过滤条件。

删除视图

drop view if exists scores_school;
create view scores_school asselect school.course_name,scores.student_idfrom scores, schoolwhere scores_school.course_name = 'go';

【3】更新视图

  • 如果需要对视图进行更新操作,您可以使用UPDATE语句。
    • 注意,不是所有的视图都可以进行更新,只有满足一定条件的视图才支持更新操作。
    • 以下是一个更新视图的示例语句:
UPDATE my_view SET column1 = value1 WHERE condition;
  • 在上述语句中,column1是要更新的列,value1是要设置的值,condition是更新条件。

【4】删除视图

  • 如果您不再需要某个视图,可以使用DROP VIEW语句将其删除。
  • 示例如下:
DROP VIEW my_view;
  • 上述语句将删除名为my_view的视图。

【三】总结

  • 创建视图咋硬盘上只会有表结构,没有表数据
    • 表数据还是来自之前的表
  • 视图一般只用来查询
    • 不建议对视图内的数据进行更改,有可能会对原始数据产生影响
  • 视图的使用频率并不高
    • 当创建了较多视图后,会造成数据的难以维护

视图小结:

  • 创建视图硬盘上只会有表的结构,没有表的数据

    • 表的数据还是来自之前的表

  • 视图一般只用来查询

    • 不建议对视图内的数据进行更改,有可能会对原始数据产生影响

  • 视图的使用频率并不高

    • 当创建较多视图后,会造成数据的难以维护。

【触发器】

【1】什么是触发器

在满足对表的数据进行增删改的情况下,自动触发的功能,称为触发器

触发器是数据库管理系统中的一个概念,它是一种在数据库中定义的特殊对象,用于在满足特定条件时触发自动化的操作或逻辑。

触发器通常与数据库表关联,当数据库发生特定的数据变化时,触发器会自动执行的相关的操作。

比如插入、更新、删除或者查询数据等操作。

【2】触发器的特点

触发器通常与表一起创建、修改和删除。

触发器可以在特定的数据之前或者之后触发执行。

触发器可以根据用户定义的条件判断是否执行相应的逻辑。

触发器可以调用存储过程、函数、触发其他触发器等,实现更复杂的业务逻辑。

【3】怎么什么情况下使用触发器

  • 可以帮助我们实现日志、监控、处理等操作。

  • 使用触发器可以实现很多功能

  • 比如数据验证、数据补全、数据同步、日志记录

  • 但需要注意,触发器的使用也需要谨慎,过多或者不当的触发器可能会对数据库性能产生负面影响,因此在设计和使用触发器时应考虑到业务需求和性能方面的平衡。

【4】触发器六种使用情况

  • 增前

  • 增后

  • 删前

  • 删后

  • 改前

  • 该后

【5】语法结构

create trigger 触发器的名字
before/after insert / update/delete
on 表名 for each row
begin SQL语句
end

【6】自定义触发器

【1】创建触发器

创建一个新的触发器对象

在创建触发器时,需要指定触发器的名称、触发时机(例如在插入、更新或者删除之前或者之后)触发的表以及触发执行的

【七】参考模板

【1】在表中插入新记录时,自动生成唯一标识符

CREATE TRIGGER generate_uuid_trigger BEFORE INSERT ON table_name
FOR EACH ROW
BEGINSET NEW.uuid = UUID();
END;

【2】在表中更新记录时,更新最后修改时间

CREATE TRIGGER update_last_modified_trigger BEFORE UPDATE ON table_name
FOR EACH ROW
BEGINSET NEW.last_modified = NOW();
END;

【3】在表中删除记录时,将记录添加到历史记录表

CREATE TRIGGER archive_deleted_record_trigger AFTER DELETE ON table_name
FOR EACH ROW
BEGININSERT INTO history_table (id, deleted_at)VALUES (OLD.id, NOW());
END;

【4】在表中插入新记录时,检查是否满足某个条件,若不满足则取消插入操作

CREATE TRIGGER check_condition_trigger BEFORE INSERT ON table_name
FOR EACH ROW
BEGINIF NEW.column_name < 10 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Value must be greater than 10';END IF;
END;

上述模板中的"table_name"和"column_name"应替换为您实际使用的表名和列名。

【5】日志模板

# 创建语句前修改默认语句结束符
delimiter $$
# 主要是为了区分错误执行语句和全局结束语句
create trigger tri_after_insert_cmd after insert on cmd 
for each row
beginif NEW.success = "no" theninsert into errlog(err_cmd,err_time)values(NEW.cmd,NEW.sub_time);end if;
end $$
# 使用完以后要修改回原来的默认语句
delimiter ;

存储过程

【1】什么是存储过程

存储过程就类似与Python中的自定义函数。

内部包含了一系列可以执行的SQL语句,存储过程在MySQL服务器中,可以通过调用存储过程触发内部的SQL语句

储存过程是在关系性数据库中的存储的一组预定的SQL语句集合,可以接收参数并返回结果。

它们被封装在数据库服务器中,并由应用程序通过调用存储过程来执行特定的数据库操作。

【2】如何使用存储过程

【1】定义存储器

create procedure 存储过程的名字(形参1,形参2...)
beginsql 代码
end

【2】调用

call 存储过程的名字();

【3】查看存储过程具体信息

show create procedure pro1;

【4】查看所有存储过程

show procedure status;

【5】删除存储过程

drop procedure pro1;
【具体演示】
(1)在MySQL中
创建存储过程
delimiter $$
​
create procedure p1(in m int, # in表示这个参数必须只能是传入不能被返回出去in n int.out res int, # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
)
beginselect name from emp where dep_id > m and dep_id <m;set res = 666 # 将res变量修改,用来标识当前的存储过程代码确实执行了
end $$
​
delimiter ;
使用存储过程
# 定义存储过程中的变量
set @res=10;  
​
# 查看写好的存储过程
select @res; 
​
# 调用存储过程
call p1(1,5,@res)  
​
# 查看存储过程信息
select @res; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cookie和Session登录注册案例

文章目录 一、需求说明![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f29467ed6b7f4de7a568004ad50de591.png)二、用户登录1、Dao层代码2、Service层代码3、Web层代码 三、记住用户四、用户注册五、展示验证码 一、需求说明 二、用户登录 1、Dao层代码 UserMapp…

__builtin_choose_expr内置函数使用

__builtin_choose_expr 是 GCC 编译器的内置函数&#xff0c;它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下&#xff1a; __builtin_choose_expr(constant_expression, expression1, expression2) 这个内置函数根据第一个参数 constant_expressio…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(时间滑动选择器弹窗)

以24小时的时间区间创建时间滑动选择器&#xff0c;展示在弹窗上。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

机器学习_正则化

文章目录 代价函数 如果我们有非常多的特征&#xff0c;我们通过学习得到的假设可能能够非常好地适应训练集&#xff08;代价函数可能几乎为 0&#xff09;&#xff0c;但是可能会不能推广到新的数据。 下图是一个回归问题的例子&#xff1a; 第一个模型是一个线性模型&#xf…

Windows下使用openssh连接服务器的错误

前言 我在windows中使用openssh连接服务器时候发生了错误&#xff0c;无法连接上 C:\Users\Administrator>ssh roots4.v100.vip -p 11004WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be …

关于RestController发送请求用List<T> 接收数据

1、发送get请求时&#xff0c;后端可用List<T>来接收参数&#xff0c;前端或者其他请求可通过逗号分割参数即可&#xff1b;同时注意特殊字符转换&#xff0c;如日期格式 接收方&#xff08;后端&#xff09;&#xff1a; ApiOperation(value "手动计算扩缩容&quo…

JDBC.

0. 相关知识 在一个接口或类中获取下一个接口或类的对象 0.0 jar包是什么&#xff1f; 别人写好的一些类&#xff0c;然后对这些类进行了打包就形成了&#xff1a;jar包。你可以将这些jar包导入你的项目中&#xff0c;然后就可以直接使用这些jar包中的类和属性以及方法。 0…

js复制内容到剪贴板实现复制粘贴功能

js复制内容到剪贴板实现复制粘贴功能第一种方法&#xff0c;用到 clipboard.js 插件 clipboard 版本是1.5.12&#xff0c;cdn地址如下&#xff1a; <script srchttps://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js></script> 情况一&#xff1a;复制…

[python]bar_chart_race设置日期格式

1、设置日期标签的时间格式 # 设置日期格式&#xff0c;默认为%Y-%m-%dbcr.bar_chart_race(df, covid19_horiz.gif, period_fmt%b %-d, %Y) 2、更改日期标签为数值 # 设置日期标签为数值bcr.bar_chart_race(df.reset_index(dropTrue), covid19_horiz.gif, interpolate_period…

#Linux(VMwareTOOL安装)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;打开虚拟机然后安装&#xff0c;出现灰色可能是已经安装过但是自己没有找到 &#xff08;3&#xff09;删除VM…

三份天注定,七分靠XX?

文 | 螳螂观察 作者 | 陈小江 1988年&#xff0c;中国宝岛台湾&#xff0c;蒋经国过世后&#xff0c;社会运动风起云涌。在所谓“解严”的时代氛围里&#xff0c;人们对前途虽然迷茫&#xff0c;但却充满打拼的热情。 那时节&#xff0c;40岁的台湾歌手叶启田&#xff0c;开…

用 Delphi 做 FTP 服务器以及如何配置防火墙

使用 Delphi 的 TIdFTPServer 这个控件&#xff0c;做一个 FTP 服务器很简单。可以直接拿官方提供的 FTP Server 的那个 Demo 程序来修改。 本文主要描述如何配置服务器端防火墙 网络环境&#xff1a; 1. 客户端在路由器后面&#xff0c;局域网&#xff1b; 2. 服务器端在路…

StartAI创成式填充(扩图)功能使用教程 约等于Photoshop Beta 25.0

创成式填充&#xff0c;是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。StartAI PS智能AI插件通过【扩图】&#xff0c;【局部重绘】&#xff0c;【背景移除】等功能来实现PS的“创成式填充” StartAI当前最新版本&#xff1a;V0.7.…

java核心面试题解析(持续更新)

1.索引 1.1创建索引: create index 索引名称 on 某张表 (列名) 示例: create index index_name on table (Column names) 1.2索引优化 MySQL数据库索引优化是提高查询性能的重要手段。以下是一些关键的索引优化策略: 选择正确的索引列: 经常需要排序、分组和联…

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述&#xff1a; 对于这类问题的解决思路应该都差不多&#xff0c;本文以calico插件安装为例&#xff0c;发现有个Pod的镜像没有pull成功 第一步&#xff1a;查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

第十三届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 星期计算试题 B: 山试题 C: 字符统计试题 D: 最少刷题数试题 E \mathrm{E} E : 求阶乘试题 F : \mathrm{F}: F: 最大子矩阵试题 G: 数组切分试题 H: 回忆迷宫试题 I: 红绿灯试题 J 拉箱子 发现宝藏 前些天发现了一个巨牛的人工智能学习…

精密空调制冷量计算公式

制冷系统设计 环境设计参数 空调系统以《采暖通风与空气调节设计规范》GB50019-2003、《数据中心设计规范》GB50174-2017、《 数据中心用恒温恒湿空调系统》YD/T2061-2009 及《核心机房节能热管理技术规范》QB-H-001-2009 等国家及行业标准规范作为设计依据,总体把握安全可靠、…

Apache FtpServer在Windows上下载安装与使用

Apache FtpServer在Windows上下载安装与使用 1、Apache Ftp Server下载 进入apache官网 https://mina.apache.org/ftpserver-project/old-downloads.html 下载自己使用的版本。 Apache FtpServer 1.1.1及以下的版本需要JDK1.7的支持 Apache FtpServer 1.1.1以上的版本需要JDK…

【Kafka系列】Kafka事务一般在什么场景下使用呢

面试官&#xff1a;听说你精通Kafka&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以【面试官面试】的形式来分享技术&#xff0c;本期是《Kafka系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;生产者重…