日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程

發(fā)布時(shí)間:2025/3/12 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 視圖

視圖是一個(gè)虛擬表,它的本質(zhì)是根據(jù)SQL語句獲取動態(tài)的數(shù)據(jù)集,并為其命名,用戶使用時(shí)只需使用【名稱】即可獲取結(jié)果集,可以將該結(jié)果集當(dāng)做表來使用。

使用視圖我們可以把查詢過程中的臨時(shí)表摘出來,用視圖去實(shí)現(xiàn),這樣以后再想操作該臨時(shí)表的數(shù)據(jù)時(shí)就無需重寫復(fù)雜的sql了,直接去視圖中查找即可,

但視圖有明顯地效率問題,并且視圖是存放在數(shù)據(jù)庫中的,如果我們程序中使用的sql過分依賴數(shù)據(jù)庫中的視圖,即強(qiáng)耦合,那就意味著擴(kuò)展sql極為不便,

因此不推薦使用. 而且工作中一般不方便,因?yàn)槭翘摂M表 不方便共用,如果需要修改,可能設(shè)計(jì)到與DBA的溝通,很麻煩

1 --使用視圖

2 select .. fromv13 select asd fromv14 --某個(gè)查詢語句設(shè)置別名,日后方便使用

5

6 -創(chuàng)建7 create view 視圖名稱 asSQL8

9 PS: 虛擬的,臨時(shí)表 無法插入操作10

11 -修改12 alter view 視圖名稱 asSQL13

14 -刪除15 drop view 視圖名稱;

2. 觸發(fā)器

定制用戶對表進(jìn)行【增、刪、改】操作時(shí)前后的行為,注意:沒有查詢

工作中一般也很少用到,因?yàn)樽约涸诖a中就能設(shè)計(jì)操作前后的行為

insert intotb (....)

delimiter// --修改結(jié)束標(biāo)記

create trigger t1 BEFORE INSERT on student for EACH ROW --創(chuàng)建insert操作前的觸發(fā)器

BEGIN --觸發(fā)器具體內(nèi)容

INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);INSERT into teacher(tname) values(NEW.sname);END //delimiter ;--恢復(fù)默認(rèn)的語句結(jié)束標(biāo)記

------------------------------------------------

insert into student(gender,class_id,sname) values('女',1,'濤'),('女',1,'根');--NEW,代指新數(shù)據(jù) 可以在觸發(fā)器中點(diǎn)語法使用--OLD,代指老數(shù)據(jù) 刪除的那一行記錄被OLD引用

3.函數(shù)

因?yàn)樵趕ql語句執(zhí)行中調(diào)用函數(shù)會比較耗時(shí),而且對索引的那一列使用了函數(shù),則無法命中索引了。

所以工作中對響應(yīng)速度要求高,一般不會不使用函數(shù)處理結(jié)果集。而是在架構(gòu)級別或者程序級別處理結(jié)果集。

內(nèi)置的函數(shù)很多,詳情參看官方文檔

--內(nèi)置函數(shù):

執(zhí)行函數(shù) selectCURDATE();

blog

id title ctime1 asdf 2019-11

2 asdf 2019-11

3 asdf 2019-10

4 asdf 2019-10

select ctime,count(1) from blog groupctimeselect DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")2019-11 2

2019-10 2DATE_FORMAT 時(shí)間格式化函數(shù),較常用--自定義函數(shù)(必須有返回值):

delimiter \\create functionf1(

i1int,

i2int)returns int

BEGIN

declare num int default 0;set num = i1 +i2;return(num);END\\

delimiter ;SELECT f1(1,100);

4. 存儲過程

包含了一系列可執(zhí)行的sql語句,存儲過程存放于MySQL中,通過調(diào)用它的名字可以執(zhí)行其內(nèi)部的一堆sql,可以讓程序與sql解耦合,且執(zhí)行通過一個(gè)名字減少數(shù)據(jù)傳輸。mysql 5.5版本以后才有的功能

開發(fā)崗位一般也比較少使用。主要會是DBA使用。

用MySQL的三種方式:

方式一:

MySQL: 存儲過程

程序:調(diào)用存儲過程

方式二:

MySQL:。。

程序:SQL語句

方式三:

MySQL:。。

程序:類和對象(SQL語句)

MySQL中代碼屬于強(qiáng)類型語言, 變量需要先 聲明 變量名 和 變量類型.

1.簡單示例

delimiter //

create procedurep2(in n1 int,in n2 int)BEGIN

----- 獲取大于傳參數(shù)字的id行

select * from student where sid >n1;END //delimiter ;---------------- 命令行

call p2(12,2)--------------- pymsql

cursor.callproc('p2',(12,2))

2.傳參數(shù)(in)

delimiter //

create procedurep3(in n1 int,

inout n2int)BEGIN

set n2 = 123123;select * from student where sid >n1;END //delimiter ;-------------------

set @v1 = 10;

call p2(12,@v1)select @v1;set @_p3_0 = 12ser@_p3_1 = 2call p3(@_p3_0,@_p3_1)select @_p3_0,@_p3_1

------------------------ pymysql

cursor.callproc('p3',(12,2))

r1= cursor.fetchall()print(r1)cursor.execute('select @_p3_0,@_p3_1') # @_p3_0是底層創(chuàng)建好的名字

r2= cursor.fetchall() # 去除out值print(r2)

3.參數(shù) out

為什么有結(jié)果集又有out偽造的返回值?

delimiter //

create procedurep3(in n1 int,

out n2int --用于標(biāo)識存儲過程的執(zhí)行結(jié)果 一般用 tinyint 1,2等來表示相應(yīng)的執(zhí)行結(jié)果,方便程序獲取后知道執(zhí)行結(jié)果

)BEGIN

insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)insert intovv(..)END //delimiter ;

View Code

delimiter //

create procedurep4(

out statusint)BEGIN

--偽代碼描述

1. 聲明如果出現(xiàn)異常則執(zhí)行{set status = 1;rollback;

}

開始事務(wù)--由秦兵賬戶減去100

--方少偉賬戶加90

--張根賬戶加10

commit;

結(jié)束set status = 2;END //delimiter ;===============================delimiter \\create PROCEDUREp5(

OUT p_return_codetinyint)BEGIN

DECLARE exit handler forsqlexceptionBEGIN

--ERROR

set p_return_code = 1;rollback;END;

STARTTRANSACTION;DELETE fromtb1;insert into tb2(name)values('seven');COMMIT;--SUCCESS

set p_return_code = 2;END\\

delimiter ;

4.事務(wù)

delimiter //

create procedurep6()begin

declare row_id int; --自定義變量1

declare row_num int; --自定義變量2

declare done INT DEFAULT FALSE; --默認(rèn)為false 表述循環(huán)未執(zhí)行完

declare temp int;--聲明游標(biāo)

declare my_cursor CURSOR FOR select id,num fromA;declare CONTINUE HANDLER FOR NOT FOUND SET done =TRUE;--開始循環(huán)

openmy_cursor;

xxoo: LOOPfetch my_cursor intorow_id,row_num;if done then --需要自己判斷是否循環(huán)結(jié)束

leave xxoo; --結(jié)束循環(huán)

END IF;set temp = row_id +row_num;insert into B(number) values(temp);endloop xxoo;closemy_cursor;end //delimter ;

5.游標(biāo)-實(shí)現(xiàn)循環(huán)語句

游標(biāo)性能比較差,一般很少用,使用場景是:針對每一行都需要專門的處理計(jì)算的時(shí)候可能會用到,但是一般update+ 循環(huán)也能解決 如:UPDATE B set num=id+num;

delimiter //

create procedurep7(in tpl varchar(255),in arg int)begin

set @xo =arg;PREPARE prod FROM 'select * from student where sid > ?'; --1. 預(yù)檢測某個(gè)東西 SQL語句合法性

EXECUTE prod USING @xo; --2. SQL =格式化 tpl + arg

DEALLOCATE prepare prod; --3. 執(zhí)行SQL語句

end //delimter ;---------------------------

call p7("select * from tb where id > ?",9)

6. 動態(tài)執(zhí)行SQL(防SQL注入)

總結(jié)

以上是生活随笔為你收集整理的mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。