一、视图

视图是一个虚拟表并不是(正实存在的

创建老师表

create table teacher(
id int primary key auto_increment,
tname varchar()
); 创建课程表
create table course(
id int primary key auto_increment,
cname varchar(),
teacher_id int,
foreign key(teacher_id) references teacher(id)
on delete cascade
on update cascade
); 插入数据
insert into teacher(tname)values
('张磊老师'),
('李平老师'),
('刘海燕老师'),
('朱云海老师'),
('李杰老师'); insert into course(cname,teacher_id)values
('生物',),
('物理',),
('体育',),
('美术',);

两张有关系的表

#查询李平老师教授的课程名
#子查询出临时表,作为teacher_id等判断依据
select tid from teacher where tname='李平老师'
(1)创建视图
#语法:CREATE VIEW 视图名称 AS  SQL语句

#于是查询李平老师教授的课程名的sql可以改写为
#!!!注意注意注意:
#1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高
#2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,

那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,
你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
(2)、使用视图
#修改视图,原始表也跟着改

(3)修改视图

语法:ALTER VIEW 视图名称 AS SQL语句

(4)删除视图

语法:DROP VIEW 视图名称
DROP VIEW teacher_view
二、触发器
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
(1)创建触发器
# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END # 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
...
END # 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
...
END # 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
...
END # 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END # 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END

#准备表
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (),
priv CHAR (),
cmd CHAR (),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
); CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (),
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中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('egon','','ls -l /etc',NOW(),'yes'),
('egon','','cat /etc/passwd',NOW(),'no'),
('egon','','useradd xxx',NOW(),'no'),
('egon','','ps aux',NOW(),'yes');
#查询错误日志,发现有两条

特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

(2)、 使用触发器

触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

(3)、 删除触发器

drop trigger tri_after_insert_cmd;

三、事务

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,

即可回滚到原来的状态,从而保证数据库数据完整性。

create table user(
id int primary key auto_increment,
name char(),
balance int
); insert into user(name,balance)
values
('wsb',),
('egon',),
('ysb',); #原子操作
start transaction;
update user set balance= where name='wsb'; #买支付100元
update user set balance= where name='egon'; #中介拿走10元
update user set balance= where name='ysb'; #卖家拿到90元
commit; #出现异常,回滚到初始状态
start transaction;
update user set balance= where name='wsb'; #买支付100元
update user set balance= where name='egon'; #中介拿走10元
uppdate user set balance= where name='ysb'; #卖家拿到90元,出现异常没有拿到
rollback;
commit;

四、存储过程

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,

通过调用它的名字可以执行其内部的一堆sql

使用存储过程的优点
#1 程序与数据实现解耦
#2 减少网络传输的数据量
#===============================================
#创建无参存储过程
delimiter //
create procedure p3()
begin
select * from user;
insert into user(name,balance) values('wsb1',);
end //
delimiter ; #调用存储过程
call p3(); #在mysql中调用
cursor.callproc('p3') #在python中通过pymysql模块调用

#===============================================
#创建有参存储过程之in的使用
delimiter //
create procedure p4(
in m int,
in n int
)
begin
select * from user where id between m and n;
end //
delimiter ; #调用存储过程
call p4(,); #在mysql中调用
cursor.callproc('p4',args=(,)) #在python中通过pymysql模块调用

#===============================================
#创建有参存储过程之out的使用
delimiter //
create procedure p5(
in m int,
in n int,
out res int
)
begin
select * from user where id between m and n;
set res=;
end //
delimiter ; #调用存储过程
#在mysql中
set @x=
call p5(,,@x); #在mysql中调用, 查看结果:select @x;

#在python中
res=cursor.callproc('p5',args=(,,)) #@_p3_0=,@_p3_1=,@_p3_2=
print(cursor.fetchall()) #只是拿到存储过程中select的查询结果
cursor.execute('select @_p5_0,@_p5_1,@_p5_2')
print(cursor.fetchall()) #可以拿到的是返回值 #===============================================
#创建有参存储过程之inout的使用 delimiter //
create procedure p6(
inout m int
)
begin
select * from user where id > m;
set m=;
end //
delimiter ; #在mysql中
set @x=;
call p6(@x);
select @x;
delimiter //
create procedure p8(
inout m int
)
begin
select * from user111 where id > m;
set m=;
end //
delimiter ; set @x=;
call p8(@x);
select @x; #====================捕捉异常+事务===========================
delimiter //
create PROCEDURE p9(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = ;
rollback;
END; DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = ;
rollback;
END; START TRANSACTION;
insert into user(name,balance) values('egon',);
DELETE from tb1111111; #执行失败
COMMIT; -- SUCCESS
set p_return_code = ; #0代表执行成功 END //
delimiter ; #用python模拟
try:
START TRANSACTION;
DELETE from tb3; #执行失败
insert into blog(name,sub_time) values('yyy',now());
COMMIT;
set p_return_code = ; #0代表执行成功
except sqlexception:
set p_return_code = ;
rollback;
except sqlwaring:
set p_return_code = ;
rollback; mysql> show procedure status like 'p3%'; #查看某一类存储过程

 五、流程控制

#函数中不要写sql语句,它仅仅只是一个功能,是一个在sql中被应用的功能
#若要想在begin...end...中写sql,请用存储过程
#while循环
delimiter //
CREATE PROCEDURE proc_while ()
BEGIN DECLARE num INT ;
SET num = ;
WHILE num < DO
SELECT
num ;
SET num = num + ;
END WHILE ; END //
delimiter ;

 
 


 
 
 

 
 
 


mysql:视图,触发器,事务,存储过程,函数的更多相关文章

  1. MySQL 视图触发器事务存储过程函数

    事务  致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...

  2. MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  3. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  4. MySQL视图,触发器,事务,存储过程,函数

    create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...

  5. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  6. MySQL_视图/触发器/事务/存储过程/函数

    视图.触发器.事务.存储过程.函数 视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,可以将该结果集当作表来使用 #创建视 ...

  7. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  8. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  9. Python11/26--mysql之视图/触发器/事务/存储过程

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...

  10. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

随机推荐

  1. 分页(将数据库中的多条数据一页一页的显示在jsp页面中)

    一.显示数据库中的多条数据为什么要用分页 在真正的开发中,数据库中所存储的数据绝对不像我们平时所写的那样,仅仅有几条数据,而是有几十条甚至上百条,像淘宝京东的用户把都是上几十万甚至百万的.如果这时候在 ...

  2. js 本月,下一月,上一月

    <script type="text/javascript"> var curMonth = new Date(); function initDate() { ) + ...

  3. mysql 数据库选定 创建 删除 变更

    use db_name select * from db_name.tbl_name 显示所有数据库 mysql> select schema_name from information_sch ...

  4. C语言指针详解

    前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...

  5. TensorFlow框架(4)之CNN卷积神经网络

    1. 卷积神经网络 1.1 多层前馈神经网络 多层前馈神经网络是指在多层的神经网络中,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接的情况,如图 11所示. 图 11 对 ...

  6. asp .net 模板引擎 使用 Razor 生成html静态页面

    刚开始不是理解 写完之后 觉得还蛮简单的 分为这几个步骤 1.获取页面模板Html 2.获取数据 3.解析模板和数据,生成静态页Html代码 4.生成静态文件 模板形式是mvc的模式,会mvc 看一下 ...

  7. Java的HashMap实现原理整理总结

    通过Debug 探寻Java-HashMap 实现原理: 一个简单的例子,代码如下, 测试方法 main: public static void main(String[] args) { KeyOb ...

  8. Idea下载后初始配置(windows环境下)

    专业版的intellij可以免费试用30天.为了以后开发方便,咱们需要下载专业版进行破解. 一.破解 安装过程中有个界面如下,咱们选择License server填上http://idea.itebl ...

  9. windows下命令行模式中cd命令无效的原因

    当我们执行cmd 想切换当前工作目录时,会发现windows下命令行模式中cd命令没有生效,到底是什么原因呢? 例如: 当我们想切换到 D:\MySql\mysql-5.7.19-winx64\bin ...

  10. [2017-07-18]ELK安装笔记

    ELK ElasticSearch LogStash Kibana Server:CentOS 7 采用RPM导入官方源方式进行安装 rpm --import https://artifacts.el ...