oa報(bào)表網(wǎng)站開發(fā)淘寶客推廣一天80單
視圖|存儲(chǔ)過程
- 視圖
- 視圖基本使用
- 使用視圖
- 視圖進(jìn)階
- 存儲(chǔ)過程
- 創(chuàng)建存儲(chǔ)過程
- 存儲(chǔ)過程進(jìn)階
- 存儲(chǔ)過程參數(shù)
- 循環(huán)結(jié)構(gòu)
視圖
視圖是虛擬存在的表 表頭下的數(shù)據(jù)在真表里 表頭下的數(shù)據(jù)存儲(chǔ)在創(chuàng)建視圖時(shí) 在select命令訪問的真表里
優(yōu)點(diǎn):
- 安全
- 數(shù)據(jù)獨(dú)立
- 簡(jiǎn)單 用戶無(wú)需關(guān)心數(shù)據(jù)內(nèi)部
視圖基本使用
create view v1 as select name from tarena.user
除了視圖,每個(gè)表都會(huì)存在兩個(gè)文件
查看所有表的狀態(tài)
show table status ;
查看創(chuàng)建視圖具體select命令
show create view 視圖名;
使用視圖
- insert
insert into tarena.v11 vlaues ("xxx",2002);
- delete
delete from tarena.v11 where name in ("xxx","yyy")
- update
# 物理表 會(huì)跟著變
update tarena.v11 set uid=1001 where name='root'
視圖進(jìn)階
可以通過視圖修改數(shù)據(jù)限制 限制方式如下:
- with check option
- local 首先滿足自身的限制,同時(shí)滿足基表的限制
local
- local 首先滿足自身的限制,同時(shí)滿足基表的限制
mysql> create view v31 as select name , uid from tarena.user where uid <= 100;
mysql> create view v45 as select name,uid from v31 where uid>=10 with local check option;
mysql> update v45 set uid=800 where name="ftp"
# 雖然超出基表v31限制,但是還是改成了 因?yàn)榛頉]有加限制
# 修改視圖v31 加修改限制
mysql> create or REPLACE view v31 as select name,uid from tarena.user where uid <= 100 with check option;
mysql> update v45 set uid=6 where name="sshd"; 沒有滿足自身限制
mysql> update v45 set uid=600 where name="sshd"; 沒有滿足基表v31的限制
- cascaded 滿足視圖自身限制即可(默認(rèn)值)
mysql> create view v21 as > select name,uid from tarena.user where uid>10> with check option# 此時(shí)的限制條件是uid>10 如果改小于10 會(huì)失敗
mysql> update v21 set uid=9 where name='root'; # 會(huì)失敗
存儲(chǔ)過程
存儲(chǔ)過程就是mysql服務(wù)里的腳本。mysql存儲(chǔ)過程 是登陸mysql服務(wù)之后編寫的腳本 是由一條或多條sql命令組成,存放在mysql庫(kù)下的表里。避免重復(fù)的sql操作。
寫好的存儲(chǔ)過程 會(huì)存放在mysql庫(kù)下的proc表里
創(chuàng)建存儲(chǔ)過程
命令行結(jié)束符 修改為//
delimiter //
---
create procedure 庫(kù)名.存儲(chǔ)過程名(列表參數(shù))
begin一組合法的sql命令
end
//
--
delimiter ;
查看已創(chuàng)建的存儲(chǔ)過程
select db,name,type,body from mysql.proc where type="procedure"
執(zhí)行存儲(chǔ)過程
call 庫(kù)名.存儲(chǔ)過程名 創(chuàng)建的存儲(chǔ)過程沒有參數(shù)
call 庫(kù)名.存儲(chǔ)過程名(參數(shù))
刪除存儲(chǔ)過程
drop procedure 庫(kù).存儲(chǔ)過程名; 不加括號(hào) 無(wú)論有無(wú)參數(shù)
存儲(chǔ)過程進(jìn)階
用戶自定義變量
-
用戶變量
-
局部變量:begin/end語(yǔ)句塊中
存儲(chǔ)過程參數(shù)
調(diào)用參數(shù)時(shí),名稱前也不需要@
create procedure 名稱(類型 變量名 數(shù)據(jù)類型 , 類型 變量名 數(shù)據(jù)類型,…)
delimiter //
create procedure tarena.p3()
begin
select name from tarena.user where name="ftp";
end //
delimiter ;
delimiter //
create procedure tarena.p4(in dept_no int)
begin
select dept_id,count(name) from employees where dept_id=dept_no
group by dept_id
end //
delimiter;## 調(diào)用
call tarena.p4(3)
- out參數(shù)的作用
delimiter //
create procedure tarena.p5(in emp_name varchar(10),out mail varchar)
begin
select email into mail from employees where name=emp_name;
end //
delimiter ;# 調(diào)用
call tarena.p5("bob",@x)
- inout參數(shù)
既有in參數(shù)的功能 又有out參數(shù)的功能
delimiter //
create procedure tarena.myadd(inout i int)
begin
set i=i+100;
end //
delimiter ;
set @x = 8
set @y = 101
call tarena.myadd(@x);
call tarena.myadd(@y);
select @x,@y
循環(huán)結(jié)構(gòu)
- if
格式一:
IF 條件 THEN語(yǔ)句;
END IF;
格式二:
IF 條件 THEN語(yǔ)句1;
ELSEIF 條件2 THEN語(yǔ)句2;
ELSE語(yǔ)句3;
END IF;
解決亂碼問題:
alter database tarena default character set utf8;
# 查看庫(kù)使用的字符集
show create detabase tarena \G
show create table tarena.departments \G
# 修改完重新創(chuàng)建存儲(chǔ)過程 就好使了
- case
語(yǔ)法格式
CASE 變量|表達(dá)式|字段
WHEN 判斷的值1 THEN 返回值1;
WHEN 判斷的值2 THEN 返回值2;
... ...
ELSE 返回值n;
END CASE;
案例
delimiter //
create procedure tarena.deptype_pro2(IN no int ,OUT dept_type varchar(5))
begin
declare type varchar(5);
select dept_name into type from departments where dept_id=no;
case type
when '運(yùn)維部' then set dept_type='技術(shù)部';
else set dept_type='非技術(shù)部';
end case;
end //
delimiter ;
# @使用自定義變量接受out參數(shù)的值
call tarena.deptype_pro(1,@t);
# 查看自定義變量@t的值
select @t;
- 循環(huán)語(yǔ)法
標(biāo)簽名:WHILE 循環(huán)條件 DO循環(huán)體;
END WHILE 標(biāo)簽名
# loop循環(huán) 只要不人為結(jié)束 就一直執(zhí)行下去
LOOP循環(huán)體;
END LOOP
# repeat 循環(huán):至少循環(huán)一次
repeat循環(huán)體;
UNTILE 循環(huán)結(jié)束條件
end repeat
循環(huán)結(jié)構(gòu)控制語(yǔ)句:在循環(huán)條件滿足的情況下,控制循環(huán)的執(zhí)行
- break 結(jié)束循環(huán)
- ITERATE 相當(dāng)于continue 結(jié)束當(dāng)前循環(huán)并開始下次循環(huán)
注意:要給循環(huán)加標(biāo)簽 (就是給循環(huán)起一個(gè)名字)才能使用
案例:
delimiter //
create procedure tarena.while_pro(IN i int)
begin
declare j int default 1;
while j < i doinsert into tarena.departments(dept_name) values("hr");set j=j+1;
end while;
end //
delimiter ;
# 調(diào)用
mysql > call tarena.while_pro(3);
show processlist 相當(dāng)于 ps -aux
案例
delimiter //
create procedure tarena.while_pro3(IN i int)
begindeclare j int default 0;a:while j<i doset j=j+1;if mod(j,2)=0 then iterate a;end if ;insert into tarena.departments(dept_name) value(concat('hr',i))end while a;
end //
delimiter ;
# 調(diào)用
call tarena.while_pro3(10);
select * from tarena.departments;