linux12 -MYSQL数据库 -->08视图触发器存储过程函数流程控制

Posted FikL-09-19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12 -MYSQL数据库 -->08视图触发器存储过程函数流程控制相关的知识,希望对你有一定的参考价值。

一、开发模式介绍

#   程序员(开发人员)                          数据库管理者 DBA
    应用程序(调用存储过程)                  存储过程
    应用程序+sql语句                                管理好数据
    应用程序+orm框架                              管理好数据 # 用的最多
    
 # IO多路复用
https://blog.csdn.net/sehanlingfeng/article/details/78920423

IO多路复用

1、三种开发模型

# 第一种
应用程序:程序员写代码开发
mysql:提前编写好存储过程 ,供应用程序调用

优点:开发效率提升了,执行效率上去了
缺点:考虑到人为元素、跨不忙沟通的问题,后续存储过程的跨扩展性差

# 第二种
应用程序:程序员写代码开发之外,设计到数据库操作也自己手写

优点:存储过程的跨扩展性很高
缺点:编写sql语句太多频繁,后续还需要考虑sql优化的问题
# 第三种
应用程序:只写程序代码,不写sql语句,基于别人写好的mysql的python框架直接调用即可 
#框架 半成品  ORM跨架
优点: 开发效率比上面两种效率高
缺点:语句扩展性差,可能出现效率低下爱的问题
# 一般用第三种,出现效率问题在手动写sql

二、视图

视图就是通过查询一张虚拟表,然后保存下来,下次直接使用

1、为什么要用视图

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

2、如何操作

 #固定语法
 create view 表名 as 虚拟表的查询sql语法
 create view teacher2coure as SELECT * FROM course INNER JOIN teacher on teacher.tid =     course.teacher_id

3、注意

1、创建视图在硬盘上只会有表结构 没有表数据(数据还是来自之前的表)
2、视图一般只用来查询,里面的数据不要修改,否则会影响真正的表

# 视图使用频率不高,因为创建了很多视图,会造成表的不好维护

三、触发器

在满足对表数据进行【增、删、改】操作时前后的行为(6种情况),自动触发的功能,注意:没有查询
使用触发器可以帮助我们实现监控、日志
# 删除不能使用触发器

# 语法结构
create trigger 触发器名字 /before/after insert/update/delete  on 表名 
for each row
begin
   sql语句
end
#具体使用,触发器的名字 我们要做到见名之意

CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN #增加
drop trigger tri_after_insert_cmd; #删除

#  ps:修改Mysql默认语句结束符
delimiter $$ 将默认的结束符合改为$$
# delimiter ; 就可以改回来的
=======================================================
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句

#可以说MySQL创建以下六种触发器:
BEFORE INSERT
BEFORE DELETE
BEFORE UPDATE
AFTER INSERT
AFTER DELETE
AFTER UPDATE

1、实例

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') #0代表执行失败
);

CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);

# 创建触发器
delimiter // #修改触发器
CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
BEGIN
    IF NEW.success = 'no' THEN #等值判断只有一个等号
            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
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes');
    
#查询错误日志,发现有两条    
mysql> select * from errlog;
+----+-----------------+---------------------+
| id | err_cmd         | err_time            |
+----+-----------------+---------------------+
|  1 | cat /etc/passwd | 2021-07-04 10:02:08 |
|  2 | useradd xxx     | 2021-07-04 10:02:08 |
+----+-----------------+---------------------+
2 rows in set (0.00 sec)
# 删除触发器
drop trigger tri_after_insert_cmd;

四、事务

# 什么是事务
开启一个事务可以包含多条sql语句,这样sql语句要么同时成功,或者同时失败, 成为事务的原子性
# 作用
保证了数据操作的安全性

你在操作多条数据的时候可能会出现某几条操作不成功的情况

1、事务的四大特性

ACID 四大特性

# A: 原子性
一个事务是一个不可分割的单位,事务中包含的诸多操作,要么同时失败,要么同时成功
# C:一致性
事务必须是是数据库一致性的状态变成另外一个一致性的状态,一致性根原子性密切相关的
# I:隔离性
一个事务的执行不能被其他事务干扰
# D:持久性
也可以称为永久性,一个事务一旦提交成功执行成功,那么它就是对数据库中的数据修改是永久的
接下来的其他操作或者故障不应该对其任何的影响

2、如何使用事务

# 事务相关的关键字

# 1、开启事务
start transaction
# 2、回滚(回到事务执行之前的状态)
rollback
# 3、确认(确认之后就无法回滚了)
commit
# 总结:

当你想让sql语句同时保证数据的一致性,要么同时成功,要么同时失败,那么就可以考虑使用事务

五、存储过程

1 、介绍

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似与python自定义函数
1)、使用存储过程的优点:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦

#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
2)、使用存储过程的缺点:
#1. 程序员扩展功能不方便
3)、补充:程序与数据库结合使用的三种方式
#方式一:
    MySQL:存储过程
    程序:调用存储过程

#方式二:
    MySQL:
    程序:纯SQL语句

#方式三:
    MySQL:
    程序:类和对象,即ORM(本质还是纯SQL语句)

2、基本使用

create procedure 存储过程的名字(形参1,形参2,形参3...)
begin
sql代码
end
# 调用
call 存储过程的名字()

3、存储过程具体演示

对于存储过程,可以接收参数,其参数有三类:

#in          仅用于传入参数用
#out         仅用于返回值用
#inout       既可以传入又可以当作返回值

4、删除存储过程

drop procedure proc_name;

六、函数

#!!!注意!!!
#函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
#若要想在begin...end...中写sql,请用存储过程
# 函数只能在sql语句中调用,不能单独调用

存储过程是自定义函数,而函数是内置函数

#1、 准备表和记录
CREATE TABLE blog (
    id INT PRIMARY KEY auto_increment,
    NAME CHAR (32),
    sub_time datetime
);

INSERT INTO blog (NAME, sub_time)
VALUES
    ('第1篇','2015-03-01 11:31:21'),
    ('第2篇','2015-03-11 16:31:21'),
    ('第3篇','2016-07-01 10:21:31'),
    ('第4篇','2016-07-22 09:23:21'),
    ('第5篇','2016-07-23 10:11:11'),
    ('第6篇','2016-07-25 11:21:31'),
    ('第7篇','2017-03-01 15:33:21'),
    ('第8篇','2017-03-01 17:32:21'),
    ('第9篇','2017-03-01 18:31:21');

#2. 提取sub_time字段的值,按照格式后的结果即"年月"来分组
SELECT DATE_FORMAT(sub_time,'%Y-%m'),COUNT(1) FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m');

#结果
+-------------------------------+----------+
| DATE_FORMAT(sub_time,'%Y-%m') | COUNT(1) |
+-------------------------------+----------+
| 2015-03                       |        2 |
| 2016-07                       |        4 |
| 2017-03                       |        3 |
+-------------------------------+----------+
3 rows in set (0.00 sec

七、流程控制

# if判断
delimiter //
CREATE PROCEDURE proc_if ()
BEGIN
    
    declare i int default 0;
    if i = 1 THEN
        SELECT 1;
    ELSEIF i = 2 THEN
        SELECT 2;
    ELSE
        SELECT 7;
    END IF;

END //
delimiter ;

# while循环
delimiter //
CREATE PROCEDURE proc_while ()
BEGIN

    DECLARE num INT ;
    SET num = 0 ;
    WHILE num < 10 DO
        SELECT
            num ;
        SET num = num + 1 ;
    END WHILE ;

END //
delimiter ;

以上是关于linux12 -MYSQL数据库 -->08视图触发器存储过程函数流程控制的主要内容,如果未能解决你的问题,请参考以下文章

linux 怎么安装p12证书

linux安装weblogic12报错

linux 学习 12

12.15-Linux目录结构

Linux 第20天: (09月12日) Linux启动和内核管理

在win和linux下,F12都是能调出js调试的; 在mac下F12好像不行呀,求指点!!