mysql 视图,触发器,存储
一、视图
概念:其实就是一个临时表。
视图是一个虚拟表(非真实存在的),其本质是【根据SQL语句获取动态的数据库,并为其命名】,用户使用时只需使用【名称】即可获取结果集。就可以当做表来使用。
# 1.创建视图
# --格式:create view 视图名称 as sql语句 create view 视图名称 as sql查询语句; # 2.使用视图
使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行 创建、更新和删除操作,仅能做查询用。 select * from 视图名称 where 条件 # 3.改变视图
-- 格式:alter view 视图名称 as sql语句 alter view ren_wei as sql查询语句; # 4.删除视图
--格式:drop view 视图名称 drop view ren_view; 基本
基本语法
# 1.创建视图
create view 视图名称 as sql查询语句
# 2.使用视图
select * from 视图名称 where 条件
# 3.改变视图
alter view 视图名称 as sql查询语句
# 4.删除视图
drop view 视图名称
二、触发器
1、什么是触发器
触发器是一种与表操作有关的数据库对象,当触发器所在表上发生指定事件时,将调用该对象,
即表的操作事件触发表上的触发器的执行。
可以这样来理解:当某个表上的数据发生变化的时候,就会执行一个函数,这个函数可能会去
执行一些对其他表的操作。这个函数就是触发器,它就相当于编程里的监听器一样,一旦监听到这个表
发生了某些变化,就会执行已经写好的一套逻辑。按照面向对象的思想,这个触发器是该表的一个属性。
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
create trigger trigger_name trigger_time trigger_event on tbl_name for each row # trigger_name: 触发器名称,自己设定(tri_before/after_xxx)
# trigger_time: 触发时机,取值before(之前)、after(之后)
# trigger_event : 触发事件,insert、update、delete。(插入、更新、删除)
# tbl_name : 需要建立触发器的表名
基础
INSERT型触发器 :插入某一行时激活触发器,可能INSERT、LOAD DATA、REPLACE语句触发。
UPDATE型触发器 : 更改某一行时激活触发器,可能通过UPDATE语句触发。
DELETE型触发器 : 删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。
trigger_event详解
# 插入前
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 shopgoods(
id int primary key auto_increment,
name varchar(20),
num int
); # 订单表
create table order_table(
oid int primary key auto_increment,
gid int,
much INT
) # 触发器
create trigger tg1 after insert on order_table for each ROW
begin
update shopgoods set num = num - new.much where id = new.gid;
end # 插入数据
insert into order_table(gid,much) values (2,3)
insert into shopgoods(name,num) values('商品1',10),('商品2',10),('商品3',10); # 输出表oid = 1 的数据
DELETE from order_table where oid = '' insert into order_table(gid,much) values (1,5)
insert into order_table(gid,much) values (3,2)
# 再建一个触发器 须先删除
drop trigger tg1 # 例一:当用户撤销一个订单的时候
create trigger tg2 after delete on order_table for each row
begin update shopgoods set num=num + old.much where id = old.gid; end # 删除订单
delete from order_table where oid= 5 # 当用户修改一个订单的数量 create trigger tg3 after update on order_table
for each row
BEGIN
UPDATE shopgoods set num = num + old.much - new.much where id = new.gid;
END update order_table set much = 4 where oid = ''
3种触发器的用法(例子)
python的话,尽量在python程序中实现这个触发器的功能
#Python:before insert on cmd
cmd_record={
'id':10,
'user':'tom',
'priv':'rwx',
'cmd':'tasklist -xxxx',
'sub_time':'2017-03-01 11:11:11',
'success':'no'
}
if cmd_record['success'] == 'no':
insert into errlog(err_cmd,err_time) values(cmd_record['cmd'],cmd_record['sub_time']) insert into cmd values(...) # mysql
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
);
python与mysql
begin。。。end 中间写的是sql语句 # 每句sql语句都必须用分号(;)来结尾(默认值)。 # 所以我们可以使用 delimiter 来指定sql语句结束标志 $$ (注意:我们修改了定界符使用完了,记得修改回来delimiter ;)
#Mysql:
delimiter $$
create trigger tri_before_insert_cmd before 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 ; #测试
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');
例子
# 1.创建触发器
create trigger 触发器名称 after insert on 表名 for each row(固定写法)
begin
sql语句
end
# 2.删除触发器
drop trigger 名称 # 3、查看触发器
# 查看触发器就和查看数据库show databases;或查看表格show tables;一样。
# 查看触发器SHOW TRIGGERS [FROM schema_name],这里的schema_name表示的是表名称。 4、触发器的执行顺序
# 触发器建立的一般是InnoDB数据库,上面要使用的表也是要事务支持的。
1.如果BEFORE触发器执行失败,SQL无法正确执行。
2.SQL执行失败时,AFTER型触发器不会触发。
3.AFTER类型的触发器执行失败,SQL会回滚。
(视图 触发器 在应用程序级别python去解决)
三、存储过程
一般用于保险,金融,关乎钱的
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql。
使用存储过程的优点:
(1)用于替代程序写的SQL语句,实现程序与sql解耦;
(2)基于网络传输,传别名的数据量小,而直接传sql数据量大。缺点是程序员扩展功能不方便。
存储过程
1.创建存储过程(体会封装)
create PROCEDURE p1()
BEGIN select * from ren;
select * from goods; end
2.创建存储过程(体会参数)
create PROCEDURE p2(in num int)
BEGIN select * from ren where p_sal > num;
end
3.创建存储过程(体会控制)
create PROCEDURE p3(in num int,in flag char(1))
BEGIN
if flag = '' THEN
select * from ren where p_sal >num;
elseif flag ='' THEN
select * from ren where p_sal =num;
else
select * from ren where p_sal < num;
end if;
END
4.创建存储过程(体会循环) create PROCEDURE p4(inout num int)
BEGIN
DECLARE i int DEFAULT 1; -- 声明变量
DECLARE he int DEFAULT 0; while i<= num DO -- 表示开始循环
set he = he +i;
set i = i+1;
end while;
-- select he; -- 显示结果
set num = he;
end 5.删除存储过程
drop PROCEDURE 名称; 6.调用存储过程
call 名称(参数值) 7.显示当前库下的所用存储过程
show PROCEDURE status;
基本语法
1、数据库与程序使用方式
#方式一:
MySQL:存储过程
程序:调用存储过程 #方式二:
MySQL:
程序:纯SQL语句 #方式三:
MySQL:
程序:类和对象,即ORM(本质还是纯SQL语句)
2、创建无参存储过程
# 建存储
create procedure p1()
begin
select * from people;
end # 调用存储功能
call p1(); # 存储不能修改,只能删除,再建
drop procedure p1;
# 存储不能修改,只能删除,再建
drop procedure p1; create procedure p2()
begin
select * from people;
select * from shopgoods;
end
call p2(); # 2个结果
drop procedure p2;
3、创建传参存储
有参数的情况时,在定义存储过程中必须定义参数的类型,包含三种,解释如下:
#in 仅用于传入参数用
#out 仅用于返回值用
#inout 既可以传入又可以当作返回值
# 存储加参数
# in 代表入参 inout 即进又出
create procedure p3(in num int)
begin
select * from people where p_sal > num;
end call p3(10000); drop procedure p3;
4、创建传参加控制
# 存储 加 控制
create procedure p4 (in num int,in flag char(1))
begin
if flag = '' then
select * from people where p_sal >= num;
else
select * from people where p_sal < num;
end if;
end drop procedure p4;
call p4(8000,''); create procedure p5 (in num int,in flag char(1))
begin
if flag = '' then
select * from people where p_sal >= num;
elseif flag = '' then
select * from people where p_sal = num;
else
select * from people where p_sal < num;
end if;
end drop procedure p5;
call p5(10000,'');
5、创建循环
# 存储 + 循环
-- 体会循环:计算1-100累加的和,并且返回计算结果.
create procedure p6 (inout num int )
begin
declare i int default 1; # 声明变量
declare sum int default 0;
while i<num do
set sum = sum + i;
set i = i + 1;
end while;
select sum; # 显示结果
set num = sum;
end set @n = 100;
CALL p6(@n); drop procedure p6; -- ********************
create procedure p6 (inout num int )
begin
declare i int default 1; # 声明变量
declare he int default 0;
while i <= num do
set he = he + i;
set i = i + 1;
end while;
select he; # 显示结果
set num = he;
end set @n = 100;
CALL p6(@n); drop procedure p6;
循环例子
存储过程优点:
1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
mysql 视图,触发器,存储的更多相关文章
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...
- mysql视图 触发器 事物 函数 存储过程
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL 视图触发器事务存储过程函数
事务 致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- mysql 视图/触发器/函数
一.视图 作用:简写代码,与临时表的作用差不多 .创建 create view 视图名 as SQL语句 .修改 alter view 视图名 as 新SQL语句 .删除 drop view 视图名 ...
随机推荐
- ReportView 添加自动增长序号
在显示序号的列中输入相关的值: 在此表达式的后面是Nothing,不是null,不要搞错.
- HDU 3966 Aragorn's Story (树链剖分入门题)
树上路径区间更新,单点查询. 线段树和树状数组都可以用于本题的维护. 线段树: #include<cstdio> #include<iostream> #include< ...
- HDU 6351 (Beautiful Now) 2018 Multi-University Training Contest 5
题意:给定数N(1<=N<=1e9),k(1<=k<=1e9),求对N的任意两位数交换至多k次能得到的最小与最大的数,每一次交换之后不能出现前导零. 因为N最多只有10位,且给 ...
- 用HAProxy和KeepAlived构建高可用的反向代理系统
对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求,这时候需要多台服务器对大量的请求进行分流处理,即负载均衡.而如果实现负载均衡,必须在网站的入口部署服务器(不只是一台)对这些请 ...
- Windows netstat 查看端口、进程占用(转)
本文转自:http://ywsm.iteye.com/blog/510670 目标:在Windows环境下,用netstat命令查看某个端口号是否占用,为哪个进程所占用. 操作:操作分为两步: 1)查 ...
- Git使用的常用命令
一.git工作流程 Workspace工作区:是当前工作目录,可以在此目录编辑文件 Index缓存区:add指令,保存文件的改动 Repository仓库:commit指令,将多次的文件改动最后提交 ...
- java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
1.问题描述: 对于创建的springboot项目,通过启动类启动,访问没问题,但打成war部署到tomcat上启动报错,如下: 严重: ContainerBase.addChild: start: ...
- Graph_Master(连通分量_B_Trajan+完全图)
hdu_4635 题目大意:给出一张DAG(n个点,m条边),求出能加的最大边数,使得该图无重边,无自环,非强连通. 题解:这题题面很好理解,也没有什么很难的点,主要是如何求出最大边数需要动点脑筋.首 ...
- quartz(5)--作业管理和存储
作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数.如果你的作业是30分钟后或每30秒调用,这不是很有用.事实上,作业执行需要非常准确和即时调用在被调度作业上的execute()方法.Quar ...
- openlayers2地图控件扩展:要素删除DeleteFeature
实现要素删除控件,扩展OpenLayers.Control类,实现效果:选择DeleteFeature工具后,选择要素,按delete键删除要素(这里的删除只是将feature设置成delete状态, ...