首页 > 数据库 >数据库中了解的知识点:视图、触发器、事务、存储过程、函数、流程控制、索引

数据库中了解的知识点:视图、触发器、事务、存储过程、函数、流程控制、索引

时间:2024-05-19 20:07:44浏览次数:23  
标签:知识点 触发器 create 存储 视图 索引 数据

【视图】

 1 什么是视图?
 2     视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接用
 3     其实视图也是表
 4     
 5 为什么要用视图?
 6     如果要频繁的操作一张虚拟表,就可以制作成视图,下次可以直接操作
 7     
 8 如何操作
 9     # 固定语法
10     create view 表名 as 虚拟表的查询sql语句
11     具体操作
12         CREATE VIEW teacher2course AS
13         SELECT * FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id;
14 
15 视图使用率高不高呢?
16     不高
17     因为当创建很多视图以后,会造成表不好维护
18 
19 
20 注意:创建视图在硬盘上只会有表结构,没有表数据(数据还是来源于之前的表)
21     视图一般只用来查询,里面的数据不要继续修改,可能会影响真正的表
22 
23 视图的总结:
24     使用视图可以简化查询操作、保护数据安全性、实现数据完整性、提高系统的可维护性和性能优化。
25     视图提供了一种灵活且安全的数据访问方式,使用户能够根据自身需要方便地获取和操作数据。

【触发器】

触发器:
在满足对表数据进行增删改的情况下,自动触发的功能
使用触发器可以帮助我们实现监控、日志记录、数据校验等操作
触发器可以在六种情况下自动触发,增前,增后,删前删后,改前改后

基本的语法结构
create trigger 触发器名称 before/after insert/update/delete on 表名 for each row
begin
触发器操作sql语句
end

具体使用:针对触发器的名字,我们要做到见名知意
针对增:
create tigger tri_before_insert_t1 before insert on 表名t1 for each row
begin
sql语句
end
或是:
create tigger tri_after_insert_t1 after insert on 表名t1 for each row
begin
sql语句
end

针对删除和修改 书写格式一致
PS:修改MYSQL默认的语句结束符,只作用于当前窗口
delimiter $$ 将默认的结束符号由; 修改为 $$
改回来: delimiter ;

这个有什么用呢?
案例:
create table cmd(
id int primary key auto_increment,
user char(32),
priv char(10),
cmd char(64),
sub_time datetime,
success enum('yes','no')
);
#
create table errlog(
id int primary key auto_increment,
err_cmd char(64),
err_time datetime
);

# 当cm表中的success字段为no时,自动触发触发器的执行,去errlog表中插入一条记录
delimiter $$ 修改结束语句
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if new.success='no' then # new 指的是cmd里的一条条数据对象
insert into errlog(err_cmd,err_time)
values(new.cmd,new.sub_time);
end if;
end $$
delimiter ;
但是语句一看到;就结束了,那怎么触发呢
其实触发器早就已经工作了

朝cmd表中插入数据
insert into cmd(user,priv,cmd,sub_time,success)
values
('jason','0755','ls -l/etc',now(),'yes'),
('jason','0755','cat /etc/passwd',now(),'no'),
('jason','0755','useradd xxx',now(),'no'),
('jason','0755','ps aux',now(),'yes');

但是errlog表中没有操作却有数据,说明触发器触发成功
那怎么删除触发器呢?
drop trigger tri_after_insert_cmd;

【事务】

 1 开启一个事务可以包含多条sql语句,这些sql语句要么同时成功,要么一个都别想成功,称之为:事务的原子性。
 2 作用:保证了对数据操作的安全性
 3 
 4 事务的四大特性:
 5     ACID
 6     A:原子性:
 7         一个事务中的所有操作,要么同时成功,要么同时失败
 8     C:一致性:
 9         事务必须是使数据库从一个一致性的状态变到另一个一致性的状态
10         一致性和原子性是密切相关的
11     I:隔离性:
12         一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的
13         各个事务之间不能互相干扰
14     D:持久性:
15         一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
16 
17 如何使用事务:
18     事务相关的关键字
19         开启事务:start transaction;
20         回滚(回到事务执行之前的状态):rollback;
21         确认(确认之后就无法回滚了):commit;
22 
23 
24 模拟转账功能
25 create table user1(
26     id int primary key auto_increment,
27     name char(16),
28     balance int
29     );
30 
31 insert into user1(name,balance)
32 values
33 ('jason',1000),
34 ('egon',1000),
35 ('tank',1000);
36 
37 1.开启事务
38     start transaction;
39 2.多条sql语句
40     update user1 set balance=900 where name='jason';
41     update user1 set balance=1010 where name='egon';
42     update user1 set balance=1090 where name='tank';
43 3.回滚
44      rollback;
45 
46 4.二次确认:
47     commit;(确认之后无法回滚)

 。

【存储过程】

 1 存储过程类似于python中的自定义函数
 2 它的内部包含了一系列可以执行的sql语句,存储过程放于MYSQL服务端,我们可以通过调用存储过程触发内部sql语句的执行
 3 
 4 基本使用:
 5     create procedure 存储过程名(形参1,形参2)
 6     begin
 7         sql代码
 8     end
 9 
10 调用:
11     call 存储过程名(实参列表)
12 
13 =================================================
14 三种开发模型:
15     第一种:
16         应用程序:程序员写代码开发
17         MYSQL:提前编写好存储过程,供应程序员调用
18         好处:开发效率提升了,执行效率也提升了
19         坏处:存储过程的扩展性差
20 
21     第二种:
22         应用程序:程序员写代码开发之外,涉及到数据库操作也自己写
23         优点:扩展性高
24         缺点:开发效率低,还要考虑sql优化问题
25 
26     第三种:
27         应用程序:只写程序代码,不写sql语句,基于别人写好的操作mysql的python框架直接调用操作即可:ORM框架
28         优点:开发效率比上面两种都高
29         缺点:扩展性一般,可能会出现效率低下的问题
30 
31 存储过程:
32     in 只进不出,m不能返回
33     out 该形参可以返回出去
34     set res=0;  将res变量修改,用来表示当前的存储过程代码确实执行了
35 
36     delimiter $$
37     create procedure p1(
38     in m int,
39     in n int,
40     out res int,
41     )
42     begin
43         select tname from teacher where tid>m and tid<n;
44         set res=666;
45      end $$
46      delimiter ;
47 针对形参res不能直接传参数,应该传一个变量名
48 定义变量
49 set @ret=10;
50 查看变量对应的值
51 select @ret;
import pymysql
#
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='199721',
charset='utf8',
port=3306,
database='day4')

cursor = conn.cursor(pymysql.cursors.DictCursor)
# #调用存储过程
# cursor.callproc('proc_test', [1, 2])
# print(cursor.fetchall())
cursor.execute('select * from user')
print(cursor.fetchall())
调用存储过程
call p1(1,100,@ret);
52 调用存储过程 53 call p1(1,100,@ret);

【函数】

 1 函数跟存储过程是有区别的,存储过程是自定义函数,函数就是类似于内置函数
 2 
 3 ('jason','0755','ls-l/etc',now(),'yes')
 4 
 5 案例
 6 create table blog(
 7     id int primary key auto_increment,
 8     name char(32),
 9     sub_time datetime
10     );
11 
12     insert into blog(name,sub_time)
13     values
14     ('第1篇','2024-01-25 15:30:00'),
15     ('第2篇','2024-01-23 15:00:00'),
16     ('第3篇','2023-11-25 14:30:00'),
17     ('第4篇','2023-11-23 10:00:00'),
18     ('第5篇','2023-11-24 15:30:00'),
19     ('第6篇','2022-02-25 15:30:00'),
20     ('第7篇','2023-02-25 17:30:00');
21      # 对日期进行格式化操作
22     select date_format(sub_time,'%Y-%m') ,count(id) from blog group by
23     date_format(sub_time,'%Y-%m');

 

 。

【流程控制】

 1 if 判断:
 2     delimiter //
 3     create procedure proc_if()
 4     begin
 5         declare i int default 0;
 6         if i=1 then
 7             select 1;
 8         elseif i=2 then
 9             select 2;
10         else
11             select 7;
12         end if;
13     end //
14     delimiter ;
15 ===========================================
16 
17 while循环
18     delimiter //
19     create procedure proc_while()
20     begin
21         declare num int ;
22         set num=0;
23         while num<10 do
24             select
25                 num;
26             set num=num+1;
27         end while;

【索引】

ps:数据都是存在与硬盘上的,查询数据不可避免的需要进行I0操作
索引:就是一种数据结构,类似于书的目录。意味着以后在查询数据的应该先找目录再找数据,而不是一页一页的翻书,从而提升查询速度降低I0操作
索引在MySQL中也叫“键”,是存储引擎用于快速查找记录的一种数据结构
    primary key
     unique key
    index key
注意foreign key不是用来加速查询用的,不在我们的而研究范围之内
上面的三种key,前面两种除了可以增加查询速度之外各自还具有约束条件,
而最后种index key没有任何的约束条件,只是用来帮助你快速查询数据

本质:
    通过不断的缩小想要的数据范围筛选出最终的结果,同时将随机事件(一页一页的翻)变成顺序事件(先找目录,再找数据)
    也就是说有了索引机制,我们可以总是用一种固定的方式查找数据

一张表中可以有多个索引(多个目录)
索引虽然能够加快查询速度,但是也有缺点:

    1. 当表中有大量数据存在的前提下,创建索引速度会很慢
    2.在索引创建完毕以后,对表的查询性能会大幅度的提升,但是写的性能也会大幅度的降低


===========b+树
只有叶子节点存放的是真实的数据 其他节点存放的是虚拟数据
仅仅是用来指路的
树的层级越高查询数据所需要经历的步骤就越多(树有几层查询数据就需要几步)
一个磁盘块存储是有限制的
为什么建议你将id字段作为索引
    占得空间少 一个磁盘块能够存储的数据多那么久降低了树的高度 从而减少査询次数



==========================聚集索引
聚集索引:primary key
    InnoDB只有两个文件,直接将主键存放在idb表中
    MyISAM有三个文件,主键和数据分别存放在两个文件中

============================辅助索引
辅助索引:unique ,index
查询数据的时候不可能一直使用主键,也有可能会使用到name password等字段,
那么这个时候无法利用聚集索引,这个时候我们可以根据情况给其他字段设置辅助索引(也就是b+树)

叶子节点存放的是数据对应的主键值
先按照辅助索引拿到数据的主键值
之后还是需要去主键的聚集索引里面查询数据


========================覆盖索引
在辅助索引的也在节点就已经拿到了需要的数据,

# 给name设置辅助索引
select name from user where name='张三';
# 非覆盖索引
select age from user where name='张三';

 

 

标签:知识点,触发器,create,存储,视图,索引,数据
From: https://www.cnblogs.com/liuliu1/p/18200672

相关文章

  • 《Linux程序设计》各章知识点梳理
    《Linux程序设计》各章知识点梳理第1章软件包的管理方式方面,Ubuntu、CentOS的差异如何添加一个新用户?useradduser1什么是Shell?Shell是系统的用户界面,提供了用户与内核进行监护操作的一种接口。它接受用户输入的命令并把它们送去内核去执行。实际上Shell是一个命令......
  • salesforce零基础学习(一百三十七)零碎知识点小总结(九)
    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_conditional_visibiliy_tab.htm&release=250&type=5https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_automation_lightning_app.htm&release=......
  • ASP.NET Core应用程序7:使用视图组件
      视图组件是类,为支持分部视图或者在父视图中注入少量Html或Json数据提供了应用程序逻辑。1准备工作  Models文件夹中添加City.cs类和CitiesData类,为CitiesData添加服务。publicclassCity{publicstringName{get;set;}publicstringCo......
  • 达梦表级触发器
     //达梦触发器CREATEORREPLACETRIGGER"K_BASIC"."B_BASE_ENGINEERING_CATEGORYTOB_PROJECT_INVESTMENT"AFTERUPDATEORINSERTON"K_BASIC"."B_BASE_ENGINEERING_CATEGORY"REFERENCINGOLDROWAS"OLD"NEWR......
  • 数据库视图
    1.什么是视图?视图是一个虚拟表,它不在数据库中以存储的形式保存(本身不含数据),在使用视图的时候动态生成。2.视图的优点2.1.提高了查询效率数据库中的数据查询非常复杂,可以简化sql语句2.2安全有些保密字段,可以通过创建视图限制用户对某些字段进行操作。2.3简单不需要关心后买......
  • MySql5.6 关于视图访问权限问题记录
    问题描述使用zstack或root账号访问视图view3出现[root@172-26-52-170mariadb]#mysql-uzstack-pzstack.passwordzstack-e"select*fromview3"ERROR1045(28000)atline1:Accessdeniedforuser'zstack'@'localhost'(usingpassword:YES)......
  • webpack相关知识点
    一、webpack打包过程。首先读取配置文件,确定入口文件及其依赖关系,然后,从入口文件开始,递归解析所有模块,通过相应的加载器(loaders)处理不同类型的文件内容,如Javascript、css等。接着,使用插件(plugins)执行额外的任务,如代码压缩、环境变量注入等。最后,将处理后的模块按照指定的格式......
  • drf之视图类
    drf视图组件类一、两个视图基类【1】继承APIView+序列化类+Response写接口views视图层classBookView(APIView):defget(self,request):book_list=Book.objects.all()ser=BookSerializer(book_list,many=True)returnResponse(ser.da......
  • mysql触发器
    1.介绍  触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。  使用别名OLD和NEW来引用触发器中发生......
  • NumPy 数组复制与视图详解
    NumPy数组的复制与视图NumPy数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别。复制复制会创建一个包含原始数组相同元素的新数组,但这两个数组拥有独立的内存空间。这意味着对复制进行的任何更改都不会影响原始数组,反之亦然。创建副本可以使用以下方......