视图是一种虚拟的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,通俗讲,视图就是一条select语句执行后返回的结果集。
视图相对普通表的优势
简单:使用视图的用户完全不需要关心后面对应的表的结构,关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集
数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问着的影响
安全:使用视图的用户只能访问他们被允许直接查询的结果集,对表的权限管理并不能限制到某个列,但是通过视图就可以简单的实现
建议先删除再创建
DROP VIEW VIEW_name;
create view view_name
as
select ...
from view_name
alter修改
alter view 视图名
as
select ...
show tables; 查看所有的表,包括视图
show table status from mysql like ‘视图名称’
show create view view_name\G
describe 查看视图结构
drop view view_name[..,..,..]
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
函数和存储过程的区别在于函数必须有返回值,而存储过程没有
函数:是一个有返回值的函数
过程:是一个没有返回值的函数
create procedure 名称(参数,..)
begin
select ...;
end$
// delimiter $ 把默认的分sql分隔符替换成指定的分割符
call 存储过程名称 分隔符
select name from mysql.proc where db = 'db_name'; 查询指定数据库中多有的存储过程
show procedure status; 查询存储过程的状态信息
show create procedure 存储过程名称\G; 查看某个存储过程的定义
Drop procedure 【IF EXISTS】存储过程名称
变量
declare num int default 10;声明一个名为num,类型为int,默认值为10的变量
赋值
set num = num + 10; 为变量赋值
select count(*) into num from temp;把查询出来的结果赋值给变量num
if条件判断
create procedure pro_test4()
begin
declare height int default 175;
declare description varchar(50) default '';
if height > 180 then
set description = 'A';
elseif height >= 170 then
set description = 'B';
else
set description = 'C';
end if;
select concat('身材类型是:',description);
end;
传递参数
参数类型:in 输入参数、out输出参数、inout输入输出参数
1
create procedure pro_test5(in height int)
begin
declare description varchar(50) default '';
if height > 180 then
set description = 'A';
elseif height >= 170 then
set description = 'B';
else
set description = 'C';
end if;
select concat('身高 ',height,'的身材类型是:',description);
end;
--调用
call pro_test5(181);
2
create procedure pro_test6(in height int,out description varchar(50))
begin
if height >= 180 then
set description = 'A';
elseif height >= 170 and height < 180 then
set description = 'B';
else
set description = 'C';
end if;
end;
--调用
call pro_test6(175,@description);--@description用户会话变量
select @description;
case结构
create procedure pro_test7(mon int)
begin
declare result varchar(10);
case
when mon >=1 and mon <=3 then
set result = '第一季度';
when mon >= 4 and mon <= 6 then
set result = '第二季度';
when mon >= 7 and mon <= 9 then
set result = '第三季度';
when mon >= 10 and mon <= 12 then
set result = '第四季度';
else
set result = '不在季度范围';
end case;
select concat('传递的月份为:',mon,',计算出的结果为:',result) as content;
end;
call pro_test7(12);
while循环
特点:满足条件继续循环
create procedure pro_test8(n int)
begin
declare total int default 0;
declare num int default 1;
while num <= n do
set total = total + num;
set num = num + 1;
end while;
select total;
end;
call pro_test8(100);
repeat结构
特点:满足条件退出循环
create procedure pro_test9(n int)
begin
declare total int default 0;
repeat
set total = total + n;
set n = n - 1;
until n=0 --这里不能加分号
end repeat;
select total;
end;
call pro_test9(100);
loop语句
create procedure pro_test10(n int)
begin
declare total int default 0;
c:loop
set total = total + n;
set n = n - 1;
if n <= 0 then
leave c;
end if;
end loop c;
select total;
end;
call pro_test10(100);
leave语句
loop实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用LEAVE语句实现
用来结束loop循环
游标/光标
游标是用来存储查询结果集的数据类型,在存储的过程和函数中可以使用光标对结果集进行循环处理。
光标的使用包括光标的声明、open、fetch和close
create procedure pro_test12()
begin
declare e_id varchar(50);
declare e_name varchar(50);
declare e_gbm varchar(50);
declare e_dm varchar(50);
declare has_data int default 1;
--声明游标
declare corp_result cursor for select c_id,c_name,c_gbm,c_dm from t_corp where c_gbm like '_00' order by c_gbm;
--必须放在声明游标之后
DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;
open corp_result;
repeat
fetch corp_result into e_id,e_name,e_gbm,e_dm;
select concat('e_id=',e_id,',e_name=',e_name,',e_gbm=',e_gbm,',e_dm=',e_dm);
until has_data = 0
end repeat;
close corp_result;
end;
和存储过程类似
create function fun1(gbm varchar(10))
RETURNS int
begin
declare num int ;
select count(1) into num from t_aty_corp where c_gbm like CONCAT('%',gbm,'%');
return num;
end;
调用 select fun1('A');
删除 drop funciton fun1();
触发器是与表有关的数据库对象,指在insert、update、delete之前或之后触发并执行触发器中定义的sql语句集合
触发器可以协助数据库端确保数据的完整性,日志记录,数据校验等
触发器类型
insert型触发器--》new 表示将要或者已经新增的数据
update型触发器--》old表示修改之前的数据,new表示将要或者已经修改后的数据
delete型触发器--》old表示将要或者已经删除的数据
mysql现在只支持行级触发器,不支持语句级触发
create trigger emp_insert_trigger
after insert
on emp
for each row
begin
INSERT INTO emp_logs(id, operation, operate_time, operate_id, operate_params)
VALUES (null, 'insert', now(), new.id,concat('id=',new.id,',name=',new.name,',age=',new.age,'salary=',new.salary));
end;
drop trigger triggername;
show triggers\G;