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

news2024/11/27 4:19:03
1、视图
        1、定义:

                所谓的视图是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,就是视图只保存了查询的SQL逻辑,不保存查询的结果,所以在创建视图的时候,主要的工作就是落在创建这条SQL查询语句的时候。


创建一个视图:

create view 视图的名称 as select 语句

create  view  stu_v as select  id , name from student ;

查询视图:

show  create view 视图的名称;


查询视图表中的数据:

select  * from 视图表的名称;

修改视图的命令:

alter  view 视图的名称 as  select  语句;


删除视图:
 drop  view [if exists ]视图的名称;
        2、视图的检查选项:

                当使用with check option子句在创建视图的时候,MySQL会通过视图检查正在修改的每一行的数据,查看是否符合视图的定义。MySQL允许基于一个视图创建另一个视图,还是会检测依赖视图中的规则,以保证规则的一致性,为了检查范围,mysql提供了两种选项:cascaded和local,默认使用的是cascaded


1、cascaded:

例如:
    create  view  stu_v as select  id ,name ,age from student where age >10 with cascaded check option;

此时如果对上面的视图进行修改的时候,此时就会判断修改的是否符合修改的规则,如果不符合,那么就不会进行修改。

create  view  stu_v as select  id ,name ,age from student where age >10 ;

create   view  stu_v1 as select  id ,age from stu_v where age > 5 with cascaded check option;


此时因为视图stu_v1是依赖于视图stu_v之上进行的查询,此时当修改视图stu_v1时,会判断是否符合stu_v1的规则,也会去判断是否符合stu_v的规则。也就相当于在stu_v后面也添加了with cascaded check option;


2、local:

与cascaded是基本一致的,对于依赖的视图中,如果有条件,就会去判断是否符合条件,如果没有,那么就不会去判断以来的视图。



create  view  stu_v as select  id ,name ,age from student where age >10 with local check option;




create  view  stu_v as select  id ,name ,age from student where age >10 ;

create   view  stu_v1 as select  id ,age from stu_v where age > 5 with local check option;


此时的stu_v1是依赖于stu_v。
3、视图更新

对于视图能更新的前提就是视图中的行和基础表中的行之间是一一对应的。对于存在聚合函数、窗口函数、distinct、having、group by、union的是不能更新视图的。

4、视图的作用:

        1、简单,可以简化用户对数据的理解,也可以简化他们的操作,可以对于那些常用的语句进行视图操作,以至于以后该操作就需要在指定全部的条件。

        2、安全,数据库可以授权,但是不能授权到数据库特定的行和列中,可以通过视图用户可以查询和修改能看见的数据。

例如:在学生系统中,只能让用户看见学生的姓名和学号,此时可以使用视图进行操作

创建一个视图
      create  view  stu_v  as select  id ,name  from student ;

此时用户可以从该视图中查询学生的姓名和学号

      select  id,name from stu_v where id =001;

        3、数据独立,视图可以帮助用户屏蔽真是表结构改变带来的影响。如果在基础表中,某一列发生改变了, 此时可以通过更新视图表与基础表保持一致,但是可以将原先的列名作为别名,此时视图表的结构并没有发生改变。

2、存储过程:
        1、定义

        所谓的存储过程指的是事先编译并存储在数据库中的一点SQL的集合,调用存储过程可以简化数据在数据库和应用服务器之间的传输,可以提高数据处理的效率。

特点:封装、复用、可以接受参数、也可以返回数据、减少网络的交互、效率提高。

1、创建存储过程:

create  procedure 存储过程的名称 ()
begin

    执行的SQL语句;

end;



例如:

 create  procedure  stu ()
begin   
  select  * from student ;

end;



2、调用存储过程:
    call  存储过程的名称 (参数);

例如:
call stu() ;


3、查看存储过程:
show procedure 存储过程的名字;

例如:
show procedure stu();


4、删除存储过程:
drop  procedure   存储过程的名称;

例如:
drop  procedure  stu;
        2、变量 
变量:

1、变量主要分成三种变量:系统变量、用户自定变量、局部变量

2、系统变量:
    主要分成两种:全局变量(global)、会话变量(session)
        全部变量:作用在全局
        会话变量:作用在当前会话内,与其他的会话不会产生影响。

查看系统的全局、会话变量:
show [ global/session ]variables;


设置系统变量:
语法:set [global/session] 环境参数;
set  session  sutocommit = 0;




3、用户自定变量:是用户根据自己的需求定义的变量,作用域只在当前的会话中。

    赋值:语法格式:set @变量名 = 变量参数
    使用:select @变量名;

4、局部变量:指的是在局部生效的变量,在访问之前是需要declare进行声明的,局部变量生效的范围是在begin...end之间。

声明的语法:declare 变量名 变量的类型;

对局部变量进行赋值:set 变量名 = 值
                   或者 select  字段名 into 变量名 from 表名
3、存储函数:

4、触发器:
        1、定义

触发器是与表有关的数据库对象,会在增删改之前或之后进行触发在触发器中定义的SQL的语句集合。使用OLD和NEW来引用触发器中数据发生变化的记录的内容。

        2、触发器的类型
触发器的种类:
    1、insert触发器
    2、delete触发器
    3、update触发器



查看触发器

show  trigger ;

删除一个触发器

drop trigger  数据库的名称 触发器的名称
5、Mysql的锁:
        1、锁:是计算机中多个线程和进程并发访问某一个资源的机制。主要可以分成三类:

                1、全局锁:锁定的数据库中所有的表

                2、表级锁:锁定的是每一次操作的整张表

                3、行级锁:锁定的是每一次操作对应的行数据

        2、全局锁:

全局锁是对整个数据库实例加锁,在加锁之后整个数据就变成了一个只读的状态,后续的DML、语句、DDL语句和已经更新操作的事务提交语句都将被阻塞。

最典型的引用应用:在进行数据库全库的逻辑备份的时候,对所有的表进行全局锁,从而获取一致性视图,保证数据库的完整性。

在MySQL中的数据备份指定是将数据变成一个SQL文件存储到磁盘中。


1、添加全局锁:
flush  table with read lock;

//对数据进行备份在window中执行:

mysqldump -u  用户名  -p 密码  指定需要备份的数据库的名称  > 指定数据库中的数据存储到那个SQL文件中。

2、解锁全局锁:


unlock table ;



3、在INNODB 计算引擎中,我们可以在备份的时候加上参数  --single-transaction 参数来完成不加锁的一致性数据备份。



mysqldump  --single-transaction  -u  用户名  -p  密码  指定需要备份的数据库  > 指定数据库中的数据存储到哪一个SQL文件中。

全局锁的特点:

        1、如果在主数据库中添加全局锁,在备份期间数据是不能进行更新、插入、删除的操作。

        2、如果在从数据库中备份,那么从库就不能执行主库同步过来的二进制日志。会导致主从延迟。 

        3、表级锁:

又可以分成表锁、元数据锁(meta data lock,MDL)    、意向锁

                1、表锁:

对于表锁又可以分成两种:表共享读锁(read lock)、表独占写锁(write  lock)

 1、表共享读锁(read lock):

加上表的读锁,当前客户端只能读取数据,不能写入数据,并且不会阻碍其他的客户端的读操作,会阻碍其他客户端的写操作。

 2、表独占写锁(write  lock):

加上了写锁,当前客户端既可以读取数据也可以写入数据,单数对于其他的客户端既不能读数据,也不也能写入数据。

对表进行加锁:

lock table  表名...[可以是多张表] read/write


释放锁:

unlock  tables /也可以通过断开客户端的连接来释放表锁。

               2、元数据锁(meta data lock,MDL)

MDL加锁的过程是系统自动控制的,在访问一张表的时候会自动的加上。他的主要作用是维护数据一致性,当表上有活跃的事务的时候,此时就不可以对元数据进行写入操作。 

在MySQL5.5中引入了MDL,当对一张表进行增删改的时候,加上的MDL读锁(共享锁),当对表的结构进行改变的时候,加上DML写锁(排他锁)

    ,

            3、意向锁:

为了避免DML在执行的时候,加的行锁和表锁之间的冲突,在INNODB中引入意向锁,是的表锁不用检查每行是否加锁,使用意向锁来减少表锁的检查。

                        1、意向共享锁(IS):

select  .... lock  in share mode 

                        2、意向排他锁(IX):

insert  update  delete  select .... for update 

        4、行级锁:

行级锁,每次操作锁住对应的行数据,锁定的力度最小,发生锁冲突的概率最低,并发度是最高的。应用在INNODB存储引擎中。

主要分成三种:

        InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类

        1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
        2间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持

        3.临键锁(Next-Key Lock)∶行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持

lnnoDB实现了以下两种类型的行锁:

        1.共享锁(S)∶允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。

        2.排他锁(X)∶允许获取排他锁的事岛更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

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

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

相关文章

图数据库实战-HugeGraph简介

一、HugeGraph简介 HugeGraph是一款易用、高效、通用的开源图数据库系统(Graph Database,GitHub项目地址), 实现了Apache TinkerPop3框架及完全兼容Gremlin查询语言, 具备完善的工具链组件,助力用户轻松…

SketchUp (草图大师) SU2015 中文版软件安装包下载地址及安装教程!

1.鼠标右键【SketchUp2015 v15.0.9350(64bit)】压缩包(win11及以上系统先点击“显示更多选项”)选择【解压到SketchUp2015 v15.0.9350(64bit)】。 2.打开解压后的文件夹,鼠标右键【SketchUp2015】选择【以管理员身份运行】。 3.点击【下一个】。 4.勾选【…

vue2+antd——实现权限管理——js数据格式处理(回显+数据结构渲染)

vue2antd——实现权限管理——js数据格式处理 效果图如下:1.需求说明2.如何展开所有子项及孙子项目——在弹窗之前就获取树形结构,然后直接将数据传到弹窗中3.template部分代码4.script的data部分5.权限tree数据处理——将row中的权限分配到具体的value参…

13.(vue3.x+vite)组件间通信方式之provide与inject

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 依赖注入Provide / Inject 在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就…

JavaScript数据存储

原始类型:存储在栈内存中,每次开辟的空间大小是固定 引用类型(对象、函数、数组):存储在堆内存中,开辟的空间大小根据数据的大小决定 // 声明变量会在栈内存中开辟空间 // 创建对象在堆内存中开辟空间&…

OpenAI:我们暂停了ChatGPT Plus新用户注册

今天中午,OpenAI 首席执行官 Sam Altman 在 X 平台发文说,将暂停 ChatGPT Plus 新用户注册。 we are pausing new ChatGPT Plus sign-ups for a bit > :( the surge in usage post devday has exceeded our c> apacity and we want to make sure e…

Spring 国际化:i18n 如何使用

1、i18n概述 国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国…

一文搞懂CAN总线协议

1.基础概念 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层…

OpenAI发布会震撼AI界,千字文全面解读

你的朋友圈是否被近日 OpenAI 的开发者大会刷屏了?这是预料之中的事。在近日,OpenAI 首度召开了旨在定义未来应用市场的开发者大会。 让我们迅速捕捉 OpenAI 最新的动态以及 ChatGPT 的更新亮点。 1、OpenAI 最新动态 今晨的盛会聚焦于以下要点&#xf…

Web服务Openlab的搭建

Web服务Openlab的搭建 网站需求: 基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站 基于 www.openlab.com/student 网站访问学生信息, 基于 www.openlab.…

5个用于地理空间数据分析的Python包

大家好,地理空间数据分析在城市规划、环境研究、农业和交通等行业中至关重要。不断增长的需求导致Python包在各种地理数据分析要求上的使用增加,例如分析气候模式、研究城市发展或跟踪疾病传播等,评估和选择具有快速处理、修改和可视化能力的…

Leetcode2652. 倍数求和

Every day a Leetcode 题目来源:2652. 倍数求和 解法1:模拟 计算在 [1,n] 范围内能被 3、5、7 整除的所有整数之和。 代码: /** lc appleetcode.cn id2652 langcpp** [2652] 倍数求和*/// lc codestart class Solution { pu…

【Nginx】使用nginx进行反向代理与负载均衡

使用场景 反向代理:一个网站由许多服务器承载的,网站只暴露一个域名,那么这个域名指向一个代理服务器ip,然后由这台代理服务器转发请求到网站负载的多台服务器中的一台处理。这就需要用到Nginx的反向代理实现了 负载均衡&#xf…

LOWORD, HIWORD, LOBYTE, HIBYTE的解释

文章目录 实验结论 实验 int 类型大小正常为4Byte 以小端序来看 0x12345678在内存中的存储为 0x78 0x56 0x34 0x120x78在低地址&#xff0c;0x12在高地址 程序输出 #include <stdio.h> #include <string.h> #include<windows.h>int main() {int a 0x12345…

第四代管网水位监测仪:管网水位监测仪使用方法

排水管网水位监测是城市管理的重要环节之一&#xff0c;城市管理部门一直都想要确保排水管网的正常运行&#xff0c;以此促进城市的发展和智慧城市的建设。想要依靠人工对城市排水管网设施进行检修是一个大工程&#xff0c;不仅要耗费大量的人工和时间成本&#xff0c;还有可能…

《QT从基础到进阶·二十七》进度条QProgressBar

ui.ProgressBar.setValue(45); //45% ui.ProgressBar.setMin(0); ui.ProgressBar.setMax(255);0到100分为255份&#xff0c;值为215时&#xff0c;进度条为100/255*215 84% 点击主界面弹出进度条QProgressDialog 常用功能&#xff1a; setWindowFlags(Qt::Dialog | Qt::Cu…

沉醉于代码的境界:探寻计算机书籍的奇妙之旅

文章目录 书中的代码乐章科技解密的乐趣技术指南的引路明灯书籍带给我的启示结语 &#x1f389;欢迎来到数据结构学习专栏~沉醉于代码的境界&#xff1a;探寻计算机书籍的奇妙之旅 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f38…

掌握Python中的控制流语句:break, continue, quit的应用技巧详解

引言 在Python编程中&#xff0c;控制流语句是非常重要的一部分&#xff0c;它们可以帮助我们控制程序的执行流程。其中&#xff0c;break、continue和quit是常用的控制流语句&#xff0c;它们可以在循环中起到关键作用。本文将详细介绍这些控制流语句的应用技巧&#xff0c;帮…

无烟火焰:探索酒精壁炉的魅力

随着技术的不断发展&#xff0c;现代生活的很多方面都发生了变化&#xff0c;包括我们如何取暖和装饰我们的家。酒精壁炉是一个迅速崭露头角的家居装饰方式&#xff0c;为家庭带来了一种别具一格的现代化火焰体验。 过去&#xff0c;我们可能依赖于传统的木材壁炉或煤气取暖系统…

无线终端掉线问题专题

一、终端连接过程 1、通过beacon或者probe帧发现设备 2、accoc和auth过程 3、EAP过程 4、DHCP过程 5、portal过程 6、终端检测wlan是否可以上网 7、正常接入网络 二、终端无法上网 终端无法上网则说明终端在连接过程中某一个环节除了问题 1、发现AP过程&#xff0c;p…