视图、存储过程、触发器

embedded/2024/10/21 21:03:14/

  一、视图

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

1.创建视图

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

sql">create view v_stu_man as
select * from student where ssex='男';

2.视图的使用 

sql">select * from v_stu_man;

 

sql">create view v_vstuman_class as
select v_stu_man.* from v_stu_man 
left join class on v_stu_man.classid=class.classid

sql">select * from v_vstuman_class;

此时,若修改表中的sname='赵蕾蕾' ,查看数据显示结果

3.查看库中所有的视图 

sql">-- 查看库中所有的视图
select * from information_schema.VIEWS 
WHERE table_schema = 'myschool';

 4.删除视图

sql">drop view v_stu_man;

5 视图的作用

1.简化查询

2.重写格式化数据

3.频繁访问数据库

4.过滤数据

二、存储过程

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

1.为什么使用存储过程 

  • 业务流程复杂:业务复杂时,SQL语句相互依赖,顺序执行;
  • 频繁访问数据库:每条SQL语句都需单独连接和访问数据库;
  • 先编译后执行:SQL语句的执行需要先编译。

2.创建存储过程

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

end 

3.创建最简单的存储过程

sql">delimiter $$
create procedure proc_test()
begin select * from student;end $$
delimeter ;

4. 使用存储过程

sql">call proc_test();

存储过程与函数的区别:

①语法 :关键字不同,存储过程是procedure, 函数是function; 

②执行 :存储过程可以独立执行,函数必须依 赖表达式的调用;

③返回值 :存储过程可以定义多个返回结果, 函数只有一个返回值;

④功能 :函数不易做复杂的业务逻辑,但是存 储过程可以。

5. 带参数的存储过程

-- in 只入参(值传递)
-- out 只出参 (无)

-- inout 出入参 (引用传递)

-- 环境变量  @ 局部环境变量  @@ 全局环境变

sql">-- 带参数的存储过程
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;   -- 11 10 null
set @y = 20;	 -- 120 20 null
set @z = 30;	 -- 1030 30 null select @x, @y, @z;call proc_test2(@x,@y,@z)select @x, @y, @z;

6.删除存储过程

sql">drop procedure proc_stuPage; 

7.分页(面试题!) 

sql">-- 面试题
-- 分页
-- 删除存储过程
drop procedure proc_stuPage;
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);select * from student limit cp,sizepage;
end $$
delimiter ;set @a = 0;
set @b = 0;
call proc_stuPage(2,3,@a,@b);
select @a,@b

8.存储过程的缺陷

维护性 :存储过程的维护成本高,修改调试较为麻烦

移植性:大多数关系型数据库的存储过程存在细微差异。

协作性 :没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是 依赖文档。

三、触发器

        触发器数据库中针对数据库表操作触发的 特殊的存储过程。 

1.创建触发器

创建触发器的语法:
delimiter $$
create trigger 触发器名【trig_xxx】
before/after  insert/ update / delete 
on 表名  for each row 
begin 
     触发后执行的一组sql语句
end $$
delimiter ; 

注意

• 触发器触发时间分为Before和After两种;

• 主要针对表的增删改操作,可单独指定,也可全部指定。

• 查看所有的触发器 SELECT DISTINCT EVENT_OBJECT_TABLE FROM information_schema.`TRIGGERS` WHERE EVENT_OBJECT_SCHEMA=‘数据库名' 

sql">-- 删除学生 sid 为 1  在此之前把学生成绩删除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 ;delete from student where sid = 1;select * from student;select * from sc;[SQL] delete from student where sid = 2;
受影响的行: 1
时间: 0.008ms

2.查看所有的触发器

sql">SELECT * FROM information_schema.`TRIGGERS`
WHERE trigger_schema = 'myschool'

3.删除触发器

sql">drop trigger trig_delstu_delsc

4.存储过程和触发器的区别

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

 

 

 

 

 

 

 

 

 


http://www.ppmy.cn/embedded/86654.html

相关文章

【笔记】人工智能大模型在电力系统运行控制中的应用综述及展望

据统计,截至 2019 年底,我国风电和光伏的装机容量已经达到 415 GW,美国的可再生能源全年发电量已超过燃煤发电,同时欧洲计划在 2050 年完成 100% 可再生能源互联电网的建设。为了响应国家提出的“碳达峰”“碳中和”政策,国家电网公司提出在有效保障能源安全供应的前提下,…

shopee虾皮 java后端 一面面经 整体感觉不难

面试总结:总体不难,算法题脑抽了只过了一半,面试官点出了问题说时间到了,反问一点点,感觉五五开,许愿一个二面 1.Java中的锁机制,什么是可重入锁 Java中的机制主要包括 synchronized关键字 Loc…

C++ 类和对象 终篇

一 static成员: 静态成员变量是属于整个类的,而不是某个特定对象的。也就是说,所有对象共享同一个静态成员变量。它的特点包括: 非静态成员变量: class A { public:int _x; // 非静态成员变量 };int main() {A a1…

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始

我是从excel中将数据导入,然后再通过sql插入数据,就报错。 需要设置自增ID开始值 1、确定序列名称: 首先,需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id,可以使用以下查询来获取序列名称…

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考: https://blog.csdn.net/sw150811426/article/details/137147783 下载: https://nodejs.org/dist/v20.15.1/ 安装: 点击下载msi直接运行安装 安装完直接cmd打开可以,默认安装就已经添加了环境变量&…

my.ini配置文件中port有什么作用?

my.ini配置文件 [mysqld] port 13306 [client]port13306在my.ini配置文件中,[client] 和 [mysqld] 节中的 port 参数有着不同的作用: [client] port 这个参数定义的是MySQL客户端尝试连接到MySQL服务器时所使用的端口号。 当你在命令行或其他客户端工具…

golang中运行main下存在多个文件方式

golang中运行main下存在多个文件方式 1.问题描述:2.正常方式3.解决13.解决2 1.问题描述: 在编写某些功能时候 main包下面存在多个程序 例如 web |----main.go---含有main函数 |----routes.go都属于mian包 那么该怎么运行呢?? main.go package main func main() {//用route…

Apache Kafka 使用详解

文章目录 引言官网链接Kafka 原理核心概念工作原理 基础使用安装与启动生产者示例消费者示例 高级使用Kafka Streams示例:单词计数 Kafka Connect示例:使用Kafka Connect将MySQL数据导入Kafka 优缺点优点缺点 结论 引言 Apache Kafka 是一个分布式流处理…