版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目五“天意書屋”數(shù)據(jù)庫中程序的設(shè)計走進(jìn)程序設(shè)計1探索觸發(fā)器2Contents目錄處理事務(wù)3任務(wù)一走進(jìn)程序設(shè)計看情景,明目標(biāo)溫舊知,做準(zhǔn)備
劉老師,如何實現(xiàn)在“天意書屋”數(shù)據(jù)庫中編寫SQL程序代碼呢?在MySQL數(shù)據(jù)庫中編寫程序代碼就是存儲過程,一個存儲過程里邊可以包含多條SQL語句,SQL語句之間可以使用流程控制語句進(jìn)行控制,用來實現(xiàn)較為復(fù)雜的業(yè)務(wù)邏輯。遇見視圖品味索引
要求:在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建一個名稱為proc_mybook的存儲過程,查詢圖書信息表tb_book中的所有圖書信息。
任務(wù)描述任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施操作步驟如下:
步驟1:在Navicat主窗口中依次單擊“查詢”—>“新建查詢”按鈕,創(chuàng)建一個查詢窗口。任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施步驟2:在該查詢窗口中輸入:createprocedureproc_mybook()beginselect*fromtb_book;end;任務(wù)一走進(jìn)程序設(shè)計步驟3:單擊“運行”按鈕,運行結(jié)果如圖所示。
任務(wù)實施步驟4:繼續(xù)在該查詢窗口中輸入命令,調(diào)用存儲過程proc_mybook:callproc_mybook();任務(wù)一走進(jìn)程序設(shè)計步驟5:單擊“運行”按鈕,運行結(jié)果如圖所示。任務(wù)一走進(jìn)程序設(shè)計一、存儲過程概述任務(wù)一走進(jìn)程序設(shè)計
存儲過程是一組經(jīng)過編譯并保存在數(shù)據(jù)庫中的SQL語句集,可以隨時被調(diào)用。
存儲過程具有如下5個優(yōu)點:
01執(zhí)行速度快02系統(tǒng)性能高03允許標(biāo)準(zhǔn)組件式編程04靈活性強(qiáng)05安全任務(wù)一走進(jìn)程序設(shè)計二、存儲過程的創(chuàng)建及調(diào)用1.創(chuàng)建存儲過程任務(wù)一走進(jìn)程序設(shè)計語法格式:
CREATEPROCEDURE存儲過程名稱([參數(shù)列表[,...]])
SQL語句集;
語句說明:CREATEPROCEDURE:表示創(chuàng)建存儲過程。存儲過程名稱:必須符合標(biāo)識符命名規(guī)則,且對于數(shù)據(jù)庫及其所有者必須唯一的。參數(shù)列表:是可選項,不省略為有參數(shù)存儲過程,省略為無參數(shù)存儲過程。SQL語句集:使用BEGIN表示開始,使用END表示結(jié)束。提示:在創(chuàng)建存儲過程時,設(shè)置的存儲過程參數(shù)名不要與數(shù)據(jù)表中的字段名重復(fù),否則系統(tǒng)會報錯。【例5-1】在“天意書屋”數(shù)據(jù)庫中,要求創(chuàng)建存儲過程proc_book,查詢圖書信息表tb_book中圖書名稱含有“mysql”的圖書信息。
代碼如下:
任務(wù)實施createprocedureproc_book()beginselect*fromtb_bookwherebooknamelike'%mysql%';end;任務(wù)一走進(jìn)程序設(shè)計2.調(diào)用存儲過程任務(wù)一走進(jìn)程序設(shè)計語法格式:
CALL存儲過程名稱([參數(shù)列表[,...]]);語句說明:CALL:關(guān)鍵字,表示調(diào)用存儲過程,后面加要調(diào)用的存儲過程名稱。參數(shù)列表:可選項,調(diào)用帶有參數(shù)的存儲過程,給出參數(shù)的具體的值。【例5-2】要求調(diào)用存儲過程proc_book,查看圖書信息表tb_book中含有mysql的圖書信息。
代碼如下:
任務(wù)實施callproc_book();任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計語法格式:
CREATEPROCEDURE存儲過程名稱([IN|OUT|INOUT]
參數(shù)名稱
參數(shù)類型)
SQL語句集;語句說明:IN:表示輸入?yún)?shù),可把外界的數(shù)據(jù)傳遞到存儲過程當(dāng)中。OUT:表示輸出參數(shù),可把存儲過程的運算結(jié)果傳遞到外界。INOUT:表示輸入輸出參數(shù),既可以把外界的數(shù)據(jù)傳遞給存儲過程當(dāng)中,又可以把存儲過程的運算結(jié)果傳遞到外界。在沒有指定參數(shù)方向的情況下,系統(tǒng)默認(rèn)是輸入?yún)?shù)IN。3.有參數(shù)存儲過程任務(wù)一走進(jìn)程序設(shè)計(1)創(chuàng)建和調(diào)用帶輸入?yún)?shù)的存儲過程3.有參數(shù)存儲過程
任務(wù)實施【例5-3】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_getbookbyId,要求在圖書信息表tb_book中根據(jù)圖書編號bookid查詢指定的圖書信息,顯示圖書編號、圖書名稱、圖書作者和圖書價格。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施【例5-3】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_getbookbyId,要求在圖書信息表tb_book中根據(jù)圖書編號bookid查詢指定的圖書信息,顯示圖書編號、圖書名稱、圖書作者和圖書價格。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_getbookbyId(inidint)beginselectbookid,bookname,author,bookpricefromtb_bookwherebookid=id;end;
任務(wù)實施【例5-4】要求調(diào)用存儲過程proc_getbookbyId,查詢bookid的值為3的圖書信息。
代碼如下:callproc_getbookbyId(3);任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計(2)創(chuàng)建和調(diào)用帶輸出參數(shù)的存儲過程3.有參數(shù)存儲過程
任務(wù)實施【例5-5】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_total,要求查詢圖書信息表tb_book中圖書的數(shù)量。
任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施【例5-5】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_total,要求查詢圖書信息表tb_book中圖書的數(shù)量。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_total(outnumint)beginselectcount(*)intonumfromtb_book;end;
任務(wù)實施【例5-6】要求調(diào)用存儲過程proc_total,查看圖書信息表tb_book中的圖書數(shù)量。
代碼如下:callproc_total(@num);select@num;任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計(3)創(chuàng)建和調(diào)用帶輸入輸出參數(shù)的存儲過程3.有參數(shù)存儲過程
任務(wù)實施【例5-7】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_getuserbyname,要求在客戶信息表tb_user中根據(jù)客戶姓名username查詢該客戶的客戶編號。
任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施【例5-7】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc_getuserbyname,要求在客戶信息表tb_user中根據(jù)客戶姓名username查詢該客戶的客戶編號。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_getuserbyname(innamevarchar(30),outidint)beginselectuseridintoidfromtb_userwhereusername=name;end;
任務(wù)實施【例5-8】要求調(diào)用存儲過程proc_getuserbyname,查詢用戶名為“王偉”的客戶編號。
代碼如下:callproc_getuserbyname("王偉",@id);select@id;任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計三、查看存儲過程1.查看存儲過程的狀態(tài)任務(wù)一走進(jìn)程序設(shè)計語法格式:
SHOWPROCEDURESTATUS[LIKE'存儲過程名稱'];
語句說明:SHOWPROCEDURESTATUS:表示查看存儲過程的狀態(tài)。LIKE'存儲過程名稱':可選項,用來匹配存儲過程的名稱,LIKE不能省略。
任務(wù)實施【例5-9】在“天意書屋”數(shù)據(jù)庫中,要求查看存儲過程名稱中以proc開頭的所有存儲過程的狀態(tài)信息。
代碼如下:showprocedurestatuslike'proc%';任務(wù)一走進(jìn)程序設(shè)計2.查看存儲過程的定義任務(wù)一走進(jìn)程序設(shè)計語法格式:
SHOWCREATE
PROCEDURE
存儲過程名稱;
語句說明:SHOWCREATEPROCEDURE:顯示創(chuàng)建的存儲過程。存儲過程名稱:要查看的存儲過程名稱。
任務(wù)實施【例5-10】在“天意書屋”數(shù)據(jù)庫中,要求查看存儲過程proc_book的定義語句。
代碼如下:showcreateprocedureproc_book;任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計四、修改存儲過程任務(wù)一走進(jìn)程序設(shè)計語法格式:
ALTERPROCEDURE存儲過程名稱
[
MODIFIESSQLDATA
|SQLSECURITY{DEFINER|INVOKER}];
語句說明:ALTERPROCEDURE:關(guān)鍵字,表示修改存儲過程。MODIFIESSQLDATA:表示子程序中包含寫數(shù)據(jù)的語句。DEFINER:表示只有定義者自己才能執(zhí)行。INVOKER:表示調(diào)用者可以執(zhí)行。
任務(wù)實施【例5-11】在“天意書屋”數(shù)據(jù)庫中,要求修改存儲過程proc_book的讀寫權(quán)限為modifiessqldata,安全類型為sqlsecurityinvoker。
代碼如下:alterprocedureproc_bookmodifiessqldatasqlsecurityinvoker;任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計五、刪除存儲過程任務(wù)一走進(jìn)程序設(shè)計語法格式:
DROPPROCEDURE[IFEXISTS]存儲過程名稱;
語句說明:DROPPROCEDURE:表示刪除存儲過程。IFEXISTS:可選項,用于防止因刪除不存在的存儲過程而引發(fā)的錯誤。使用IFEXISTS在執(zhí)行刪除操作時,首先判斷存儲過程是否存在,如果存在,則直接刪除;如果不存在,則刪除不會報錯;避免了系統(tǒng)錯誤。存儲過程名稱:表示要刪除的存儲過程。
任務(wù)實施【例5-12】在“天意書屋”數(shù)據(jù)庫中,要求刪除存儲過程proc_book。
代碼如下:dropprocedureproc_book;任務(wù)一走進(jìn)程序設(shè)計任務(wù)一走進(jìn)程序設(shè)計六、變量1.變量的分類任務(wù)一走進(jìn)程序設(shè)計(1)用戶變量(User-DefinedVariables):帶有前綴@,只能被定義它的用戶使用。(2)局部變量(LocalVariables):沒有前綴,一般用于SQL語句塊的BEGIN...END中。(3)系統(tǒng)變量(ServerSystemVariables):帶有前綴@@,MySQL有許多已經(jīng)設(shè)置默認(rèn)值的系統(tǒng)變量。2.局部變量的定義任務(wù)一走進(jìn)程序設(shè)計語法格式:
DECLARE變量名數(shù)據(jù)類型
[DEFAULT默認(rèn)值];
語句說明:DECLARE:關(guān)鍵字,表示定義局部變量,后面加變量名和數(shù)據(jù)類型。DEFAULT:關(guān)鍵字,表示默認(rèn),后面加默認(rèn)值。
任務(wù)實施【例如】定義一個int類型的局部變量,名稱為var1。
代碼如下:declarevar1int;任務(wù)一走進(jìn)程序設(shè)計提示:變量的定義必須在復(fù)合語句開頭,并且在任何其他語句前面。也就是說,declare語句在存儲過程中使用時,必須出現(xiàn)在begin...end語句塊的最前面。變量名不區(qū)分大小寫,可以一次聲明多個相同類型的變量。3.使用SET關(guān)鍵字為變量賦值任務(wù)一走進(jìn)程序設(shè)計語法格式:
SET變量名=變量值;
語句說明:SET:關(guān)鍵字,表示設(shè)置。變量值:可以是常量或者表達(dá)式。
任務(wù)實施【例如】給已經(jīng)定義的局部變量var1賦值。
代碼如下:setvar1=3;任務(wù)一走進(jìn)程序設(shè)計【例如】給用戶變量var2賦值。代碼如下:set@var2=3;#給用戶變量var2賦值3select@var2;#查看用戶變量var2的值3.使用SELECT...INTO語句為變量賦值任務(wù)一走進(jìn)程序設(shè)計語法格式:
SELECT列名INTO變量名FROM表名;
語句說明:SELECT…FROM:查詢語句,變量的數(shù)量必須與列或表達(dá)式的數(shù)量相同。INTO:連接列名和變量名之間的關(guān)鍵字。
任務(wù)實施【例5-13】在“天意書屋”數(shù)據(jù)庫中,創(chuàng)建存儲過程proc1,定義4個整型局部變量var1、var2、var3和var4,要求實現(xiàn)var3等于var1和var2相加,var4等于在訂單信息表tb_book中查詢圖書編號為1的客戶編號,最后將var3和var4的結(jié)果賦值給用戶變量uvar1和uvar2。任務(wù)一走進(jìn)程序設(shè)計
任務(wù)實施createprocedureproc1()begindeclarevar1,var2,var3,var4int;#聲明4個局部變量setvar1=1;#局部變量var1賦值為1setvar2=2;#局部變量var2賦值為2setvar3=var1+var2;#局部變量var3賦值為var1與var2相加#局部變量var4賦值為從訂單信息表中查詢bookid=1的userid的值selectuseridintovar4fromtb_orderwherebookid=1;set@uvar1=var3;#用戶變量uvar1賦值為var3set@uvar2=var4;#用戶變量uvar2賦值為var4end;任務(wù)一走進(jìn)程序設(shè)計代碼如下:
任務(wù)實施任務(wù)一走進(jìn)程序設(shè)計運行結(jié)果:
任務(wù)實施【例5-14】要求調(diào)用存儲過程proc1,查詢uvar1和uvar2的結(jié)果。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計callproc1();select@uvar1;select@uvar2;任務(wù)一走進(jìn)程序設(shè)計提示:單行注釋可以使用#注釋符,#注釋符后直接加注釋內(nèi)容。單行注釋也可以使用--注釋符,--注釋符后需要加一個空格,注釋才能生效。多行注釋使用/**/注釋符,/*用于注釋內(nèi)容的開頭,*/用于注釋內(nèi)容的結(jié)尾。任務(wù)一走進(jìn)程序設(shè)計七、流程控制語句1.條件分支語句任務(wù)一走進(jìn)程序設(shè)計
條件分支語句是通過對特定條件的判斷,選擇一個分支的語句執(zhí)行。在MySQL中可以實現(xiàn)條件分支的語句有IF語句、IFNULL語句、IF...ELSE語句和CASE語句共4種。(1)IF語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
IF(條件表達(dá)式,結(jié)果1,結(jié)果2);
語句說明:當(dāng)“條件表達(dá)式”的值為TRUE時,返回“結(jié)果1”,否則返回“結(jié)果2”。
任務(wù)實施【例5-15】在“天意書屋”數(shù)據(jù)庫中,要求查詢客戶信息表tb_user中的前5條記錄,輸出username字段和telephone字段的值。當(dāng)telephone字段的值為null時,輸出字符串“nothing”,否則顯示當(dāng)前字段的值。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計selectusername,if(telephoneisnull,'nothing',telephone)astelephonefromtb_userlimit5;(2)IFNULL語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
IFNULL(結(jié)果1,結(jié)果2);
語句說明:若結(jié)果1的值不為空,則返回結(jié)果1,否則返回結(jié)果2。
任務(wù)實施【例5-16】在“天意書屋”數(shù)據(jù)庫中,要求查詢圖書信息表tb_book中從第7條數(shù)據(jù)開始,總條數(shù)為6的數(shù)據(jù)記錄,輸出bookname字段和author字段的值。當(dāng)author字段不為空時,輸出author字段的值,否則輸出“noauthor”。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計selectbookname,ifnull(author,'noauthor')asauthorfromtb_booklimit6,6;(3)IF...ELSE語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
IF條件表達(dá)式THEN
語句塊1;
ELSE
語句塊2;
ENDIF;
語句說明:當(dāng)“條件表達(dá)式”的值為TRUE時,“語句塊1”將被執(zhí)行。如果“條件表達(dá)式”的值為FALSE,則執(zhí)行“語句塊2”。每個語句塊都可以包含一個或多個語句。
任務(wù)實施【例5-17】在“天意書屋”數(shù)據(jù)庫中,要求創(chuàng)建存儲過程proc_myorder,查詢訂單信息表tb_order中客戶編號為142258847的用戶是否有訂單。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_myorder()begindeclarenumint;selectcount(*)intonumfromtb_orderwhereuserid=142258847;ifnum>0thenselect'有訂單';elseselect'無訂單';endif;end;
任務(wù)實施任務(wù)一走進(jìn)程序設(shè)計運行結(jié)果:
任務(wù)實施【例5-18】要求調(diào)用存儲過程proc_myorder,查詢訂單信息表tb_order中客戶編號為142258847的用戶是否有訂單。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計callproc_myorder();(4)CASE語句任務(wù)一走進(jìn)程序設(shè)計
CASE語句在MySQL中用于實現(xiàn)分支處理,能夠根據(jù)表達(dá)式的不同取值,轉(zhuǎn)向不同的計算或處理,類似高級程序語言中的SWITCH...CASE語句。當(dāng)判斷條件的范圍較大時,使用CASE會使得程序的結(jié)構(gòu)更為簡潔。適用于需要根據(jù)同一個表達(dá)式的不同取值來決定將執(zhí)行哪一個分支的場合。
CASE語句具有簡單結(jié)構(gòu)和搜索結(jié)構(gòu)兩種語法。
簡單CASE結(jié)構(gòu)任務(wù)一走進(jìn)程序設(shè)計語法格式:
CASE表達(dá)式
WHEN數(shù)值1THEN
語句1;
[WHEN數(shù)值2THEN
語句2;]
......
[ELSE
語句n+1;]
ENDCASE;
語句說明:“表達(dá)式”的值與WHEN子句后的“數(shù)值”比較,找到完全相同的項時,則執(zhí)行對應(yīng)的“語句”,若未找到匹配項,則執(zhí)行ELSE后的“語句”。
任務(wù)實施【例5-19】在“天意書屋”數(shù)據(jù)庫中,要求查詢圖書信息表tb_book中的圖書名稱bookname、圖書作者author、圖書價格bookprice和pricevalue。其中pricevalue的取值為:若bookprice=30為1,否則為0。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計selectbookname,author,bookprice,casebookpricewhen30then1else0endaspricevaluefromtb_book;
CASE搜索結(jié)構(gòu)任務(wù)一走進(jìn)程序設(shè)計語法格式:
CASE
WHEN條件表達(dá)式1THEN
語句1;
[WHEN條件表達(dá)式2THEN
語句2;]
......
[ELSE
語句n+1;]
ENDCASE;
語句說明:該結(jié)構(gòu)判斷WHEN子句后的“條件表達(dá)式”的值是否為TRUE,若為TRUE,則執(zhí)行對應(yīng)的“語句”。若所有的“條件表達(dá)式”的值均為FALSE,則執(zhí)行ELSE后的“語句”。若無ELSE子句,則返回NULL。
任務(wù)實施【例5-20】在“天意書屋”數(shù)據(jù)庫中,要求查詢訂單信息表tb_order中的訂單編號orderid、圖書編號bookid、數(shù)量total和remark。其中remark的取值為若total大于等于4,則為“暢銷書”,若大于等于2,則為“潛質(zhì)暢銷書”,其余為“一般暢銷書”。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計selectorderid,bookid,total, case whentotal>=4then'暢銷書' whentotal>=2then'潛質(zhì)暢銷書' else'一般暢銷書' endasremarkfromtb_order;2.循環(huán)語句任務(wù)一走進(jìn)程序設(shè)計
除了條件語句之外,在MySQL中還經(jīng)常會用到循環(huán)語句,循環(huán)語句可以在存儲過程或者觸發(fā)器等內(nèi)容中使用。每一種循環(huán)都是重復(fù)執(zhí)行的一個語句塊,該語句塊可包括一條或多條語句。循環(huán)語句在其他程序設(shè)計語言中有多種形式,MySQL中只有WHILE語句、LOOP語句和REPEAT語句三種。(1)WHILE語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
[開始標(biāo)簽:]WHILE條件表達(dá)式DO
語句塊;
ENDWHILE[結(jié)束標(biāo)簽];
語句說明:WHILE語句是先判斷“條件表達(dá)式”的值是否為TRUE,當(dāng)“條件表達(dá)式”的值為TRUE時,語句塊被重復(fù)執(zhí)行,直至“條件表達(dá)式”的值為FALSE,才會結(jié)束循環(huán)。只要“開始標(biāo)簽”語句存在,則“結(jié)束標(biāo)簽”語句才能被使用;若兩者都存在,它們的名稱必須相同。
任務(wù)實施【例5-21】創(chuàng)建存儲過程proc_doWhile,要求使用while語句循環(huán)輸出1到100的累加和。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_doWhile()begin set@count=1; set@sum=0; while@count<=100do set@sum=@sum+@count; set@count=@count+1;endwhile;select@sum;end;
任務(wù)實施【例5-22】要求調(diào)用存儲過程proc_doWhile,查看1-100的和。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計callproc_doWhile();(2)LOOP語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
[開始標(biāo)簽:]LOOP
語句塊;
ENDLOOP[結(jié)束標(biāo)簽];
語句說明:“開始標(biāo)簽”和“結(jié)束標(biāo)簽”分別表示循環(huán)開始和結(jié)束的標(biāo)識,這兩個標(biāo)識必須相同,可以省略。“語句塊”表示需要循環(huán)執(zhí)行的語句。(3)LEAVE語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
LEAVE標(biāo)簽名;語句說明:LEAVE語句主要用于跳出循環(huán)控制,與高級語言中的BREAK語句相似?!皹?biāo)簽名”用于標(biāo)識跳出循環(huán)的標(biāo)識符。(4)ITERATE語句任務(wù)一走進(jìn)程序設(shè)計語法格式:
ITERATE
標(biāo)簽名;語句說明:ITERATE語句只跳出當(dāng)次循環(huán),然后直接進(jìn)入下一次循環(huán),與高級語言中的CONTINUE語句相似?!皹?biāo)簽名”表示用來跳出的本次循環(huán)的標(biāo)識符。
任務(wù)實施【例5-23】創(chuàng)建存儲過程proc_loop,要求使用loop語句循環(huán)輸出1到100的奇數(shù)和。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計createprocedureproc_loop()beginset@count=0;set@sum=0;add_num:loopset@count=@count+1;if@count=100then leaveadd_num;elseifmod(@count,2)=0theniterateadd_num;endif;endif; set@sum=@sum+@count;endloopadd_num;select@sum;end;
任務(wù)實施任務(wù)一走進(jìn)程序設(shè)計運行結(jié)果:
任務(wù)實施【例5-24】要求調(diào)用存儲過程proc_loop,查看1-100的奇數(shù)和。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計callproc_loop();任務(wù)一走進(jìn)程序設(shè)計提示:leave語句和iterate語句都是用來跳出循環(huán)語句,但兩者的功能是不一樣的。leave語句是跳出整個循環(huán),然后執(zhí)行循環(huán)外的程序語句。iterate語句是跳出本次循環(huán),進(jìn)入下一次循環(huán)。任務(wù)一走進(jìn)程序設(shè)計八、游標(biāo)1.聲明游標(biāo)任務(wù)一走進(jìn)程序設(shè)計語法格式:
DECLARE游標(biāo)名稱CURSORFORSELECT語句;語句說明:DECLARE:關(guān)鍵字,表示聲明游標(biāo),后面加游標(biāo)名稱。CURSOR:關(guān)鍵字,表示游標(biāo)。FOR:關(guān)鍵字,后接查詢語句。
任務(wù)實施【例5-25】在“天意書屋”數(shù)據(jù)庫中,要求聲明一個游標(biāo)cur_user,在客戶信息表tb_user中查詢客戶姓名。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計declarecur_usercursorforselectusernamefromtb_user;2.打開游標(biāo)任務(wù)一走進(jìn)程序設(shè)計語法格式:
OPEN游標(biāo)名稱;語句說明:OPEN:關(guān)鍵字,表示打開游標(biāo)。游標(biāo)名稱:已經(jīng)聲明的游標(biāo)名。
任務(wù)實施【例5-26】要求打開聲明的游標(biāo)cur_user。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計opencur_user;提示:在打開一個游標(biāo)時,游標(biāo)并不指向第一條記錄,而是指向第一條記錄的前邊。3.使用游標(biāo)任務(wù)一走進(jìn)程序設(shè)計語法格式:
FETCH游標(biāo)名稱
INTO變量1[,變量2,.....];語句說明:FETCH:關(guān)鍵字,表示提取數(shù)據(jù),后面加游標(biāo)名稱。INTO:關(guān)鍵字,后面加變量。提示:變量的個數(shù)必須和游標(biāo)返回字段的數(shù)量相同,否則游標(biāo)提取數(shù)據(jù)失敗。
任務(wù)實施【例5-27】要求將cur_user游標(biāo)查詢出來的數(shù)據(jù)存入uname變量中。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計fetchcur_userintouname;提示:MySQL中游標(biāo)是僅向前的且只讀的,也就是說,游標(biāo)只能順序的從前往后一條條讀取結(jié)果集。4.關(guān)閉游標(biāo)任務(wù)一走進(jìn)程序設(shè)計語法格式:
CLOSE游標(biāo)名稱;語句說明:CLOSE:關(guān)鍵字,表示關(guān)閉游標(biāo)。
任務(wù)實施【例5-28】要求將打開的游標(biāo)cur_user關(guān)閉。
代碼如下:任務(wù)一走進(jìn)程序設(shè)計closecur_user;提示:游標(biāo)關(guān)閉之后,若要繼續(xù)使用游標(biāo),則需要重新打開游標(biāo)。
任務(wù)實施【例5-29】要求將上述游標(biāo)使用的4個步驟放到一個存儲過程pro_cursor中,然后通過調(diào)用存儲過程,查看游標(biāo)的使用方法。
步驟1:創(chuàng)建存儲過程。任務(wù)一走進(jìn)程序設(shè)計createprocedurepro_cursor()begindeclareunamevarchar(30);declarecur_user cursorforselectusernamefromtb_user;opencur_user;fetchcur_userintouname;selectuname;closecur_user;end;
任務(wù)實施步驟2:調(diào)用存儲過程。任務(wù)一走進(jìn)程序設(shè)計callpro_cursor();1、在“天意書屋”數(shù)據(jù)庫中,要求創(chuàng)建存儲過程spUser,在客戶信息表tb_user中查詢客戶總數(shù)。請根據(jù)題意將代碼補充完整。
動手實踐任務(wù)一走進(jìn)程序設(shè)計
#創(chuàng)建存儲過程spUserbegin
#查詢客戶信息表tb_user中的客戶總數(shù)end;2、要求調(diào)用存儲過程spUser。請根據(jù)運行結(jié)果將代碼補充完整。
動手實踐任務(wù)一走進(jìn)程序設(shè)計
#調(diào)用存儲過程spUser3、要求刪除存儲過程spUser。請根據(jù)題意將代碼補充完整。
#刪除存儲過程spUser4、要求創(chuàng)建存儲過程spGetInteger,輸出100以內(nèi)能夠同時被3和5整除的整數(shù)和。請根據(jù)題意將代碼補充完整。
動手實踐任務(wù)一走進(jìn)程序設(shè)計createprocedurespGetInteger()begin
;#設(shè)置用戶變量count,初始值為0
;#設(shè)置用戶變量sum,初始值為0add_num:loop
;#設(shè)置用戶變量count加1if@count=101then
;#跳出循環(huán)elseif
then#用戶變量count對3和5整除#用戶變量sum等于用戶變量sum加上用戶變量count
;
動手實踐任務(wù)一走進(jìn)程序設(shè)計endif;endif;
;#結(jié)束loop循環(huán)select@sum;end;5、要求調(diào)用存儲過程spGetInteger,輸出100以內(nèi)同時被3和5整除的整數(shù)和。請根據(jù)運行結(jié)果將代碼補充完整。
#調(diào)用存儲過程spGetInteger
1+X知識鞏固
1、關(guān)于MySQL存儲過程,說法錯誤的是()。A、調(diào)用存儲過程使用關(guān)鍵字CALLB、存儲過程的參數(shù)在定義時,有兩種參數(shù)約束,即IN、OUTC、創(chuàng)建存儲過程的語法是CREATEPROCEDURED、存儲過程是一種在數(shù)據(jù)庫中存儲復(fù)雜程序,以便由外部程序調(diào)用的數(shù)據(jù)庫對象2、創(chuàng)建存儲過程的命令是()。A、createprocedureB、createruleC、createdureD、createfile任務(wù)一走進(jìn)程序設(shè)計
1+X知識鞏固
3、MySQL中使用()來調(diào)用存儲過程。A、execB、callC、executeD、create4、下面的哪個語句用來聲明游標(biāo)?()A、createcursorB、altercursorC、setcursorD、declarecursor5、流程控制語句中的選擇語句有()。A、ifB、whileC、selectD、switch任務(wù)一走進(jìn)程序設(shè)計任務(wù)二探索觸發(fā)器看情景,明目標(biāo)溫舊知,做準(zhǔn)備
劉老師,如何實現(xiàn)當(dāng)插入一條新數(shù)據(jù)時,這個新數(shù)據(jù)的某些字段內(nèi)容可以同步到其他表中呢?在MySQL數(shù)據(jù)庫中觸發(fā)器能實現(xiàn)這個功能,觸發(fā)器與存儲過程類似,它也是一段程序代碼。不同的是,觸發(fā)器是由事件激發(fā)某個操作,當(dāng)表中出現(xiàn)特定事件時,就會激發(fā)該對象。使用觸發(fā)器可以對表實施復(fù)雜的完整性約束,保持?jǐn)?shù)據(jù)的一致性。走進(jìn)程序設(shè)計
要求:在“天意書屋”數(shù)據(jù)庫中,購買了2本圖書后,訂單表中將生成一條記錄,這時要求圖書信息表(tb_book)表中的數(shù)量做相應(yīng)變化。
任務(wù)描述任務(wù)二探索觸發(fā)器
任務(wù)實施
提前在tb_book表中添加quantity字段,插入該字段的值為100。
操作步驟如下:
步驟1:在Navicat主窗口中依次單擊“查詢”—>“新建查詢”按鈕,創(chuàng)建一個查詢窗口。任務(wù)二探索觸發(fā)器
任務(wù)實施步驟2:在該查詢窗口中輸入:createtriggerup_inafterinsertontb_orderforeachrowbeginupdatetb_booksetquantity=quantity-new.totalwherebookid=new.bookid;end;任務(wù)二探索觸發(fā)器步驟3:單擊“運行”按鈕,運行結(jié)果如圖所示。
任務(wù)實施步驟4:繼續(xù)在該查詢窗口中輸入insert語句,觸發(fā)up_in觸發(fā)器:insertintotb_ordervalues(198564666,673833825,3,"2022-08-25",2);select*fromtb_book;任務(wù)二探索觸發(fā)器步驟5:單擊“運行”按鈕,運行結(jié)果如圖所示。任務(wù)二探索觸發(fā)器一、觸發(fā)器概述任務(wù)二探索觸發(fā)器觸發(fā)器是一種特殊的存儲過程,可以用來對表實施復(fù)雜的完整性約束,保持?jǐn)?shù)據(jù)的一致性。當(dāng)觸發(fā)器所保護(hù)的數(shù)據(jù)發(fā)生改變時,觸發(fā)器會自動被激活,并執(zhí)行觸發(fā)器中所定義的相關(guān)操作,以保證關(guān)聯(lián)數(shù)據(jù)的完整性。一般激活觸發(fā)器的事件包括INSERT、UPDATE和DELTE事件。在MySQL中,定義在觸發(fā)器中的SQL語句可以關(guān)聯(lián)表中的任意列,但不能直接使用列的名稱標(biāo)識,那會使系統(tǒng)混淆,所以MySQL提供了兩個邏輯表NEW和OLD。NEW和OLD的表結(jié)構(gòu)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)完全一致,當(dāng)觸發(fā)器的執(zhí)行完成之后,這兩個表也會被自動刪除。NEW表用來存放更新后的記錄。對于INSERT語句,NEW表中存放的是要插入的記錄;對于UPDATE語句,該表中存放的是要更新的記錄。任務(wù)二探索觸發(fā)器OLD表用來存放更新前的記錄。對于UPDATE語句,OLD表中存放的是更新前的記錄(更新完后即被刪除);對于DELETE語句,該表中存放的是被刪除的記錄。任務(wù)二探索觸發(fā)器二、創(chuàng)建觸發(fā)器任務(wù)二探索觸發(fā)器語法格式:
CREATETRIGGER觸發(fā)器名稱觸發(fā)時機(jī)
觸發(fā)事件
ON表名FOREACHROW觸發(fā)器激活后執(zhí)行的SQL語句;語句說明:CREATETRIGGER:表示創(chuàng)建觸發(fā)器。觸發(fā)時機(jī):可以取值BEFORE或AFTER。觸發(fā)事件:可以是INSERT、UPDATE和DELETE。FOREACHROW:表示數(shù)據(jù)表中任意一條記錄滿足觸發(fā)事件都會激活觸發(fā)器。提示:BEFORE是指觸發(fā)器在激活它的語句之前觸發(fā)。AFTER是指觸發(fā)器在激活它的語句之后觸發(fā)。任務(wù)二探索觸發(fā)器1.創(chuàng)建AFTER觸發(fā)器
AFTER觸發(fā)器是指觸發(fā)器監(jiān)視的觸發(fā)事件執(zhí)行之后,再激活觸發(fā)器,激活后所執(zhí)行的操作無法影響觸發(fā)器所監(jiān)視的事件。
AFTER觸發(fā)器也可以根據(jù)所監(jiān)視的事件分為三種,分別是INSERT型觸發(fā)器、UPDATE型觸發(fā)器和DELETE型觸發(fā)器。【例5-30】在“天意書屋”數(shù)據(jù)庫中,要求為圖書信息表tb_book創(chuàng)建insert型觸發(fā)器trig_insertbook,同時向圖書信息表tb_book中插入數(shù)據(jù),將typeid插入到類型信息表tb_type中的typeid中,最后顯示類型信息表tb_type的信息。操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
代碼如下:
任務(wù)實施createtriggertrig_insertbookafterinsertontb_bookforeachrowbegininsertintotb_typevalues(new.typeid,'開發(fā)類');end;任務(wù)二探索觸發(fā)器(1)INSERT型觸發(fā)器步驟2:插入一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
任務(wù)實施insertintotb_bookvalues(100,10,'Java程序設(shè)計','譚浩強(qiáng)',69,100);任務(wù)二探索觸發(fā)器步驟3:查看插入記錄后tb_type表信息。代碼如下:select*fromtb_type;【例5-31】在“天意書屋”數(shù)據(jù)庫中,要求為圖書信息表tb_book創(chuàng)建update型觸發(fā)器trig_updatebook,當(dāng)向圖書信息表tb_book中更新數(shù)據(jù)時,同時更新類型信息表tb_type中的typeid數(shù)據(jù),最后顯示類型信息表tb_type的信息。
任務(wù)實施任務(wù)二探索觸發(fā)器(2)UPDATE型觸發(fā)器【例5-31】在“天意書屋”數(shù)據(jù)庫中,要求為圖書信息表tb_book創(chuàng)建update型觸發(fā)器trig_updatebook,當(dāng)向圖書信息表tb_book中更新數(shù)據(jù)時,同時更新類型信息表tb_type中的typeid數(shù)據(jù),最后顯示類型信息表tb_type的信息。
操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
代碼如下:
任務(wù)實施createtriggertrig_updatebookafterupdateontb_bookforeachrowbeginupdatetb_typesettypeid=new.typeidwheretypename='開發(fā)類';end;任務(wù)二探索觸發(fā)器(2)UPDATE型觸發(fā)器步驟2:更新一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
任務(wù)實施updatetb_booksettypeid=11wherebookid=100;任務(wù)二探索觸發(fā)器步驟3:查看更新記錄后的tb_type表信息。代碼如下:select*fromtb_type;【例5-32】在“天意書屋”數(shù)據(jù)庫中,要求為圖書信息表tb_book創(chuàng)建delete型觸發(fā)器trig_deletebook,當(dāng)向圖書信息表tb_book中刪除數(shù)據(jù)時,同時刪除類型信息表tb_type中對應(yīng)數(shù)據(jù),最后顯示類型信息表tb_type的信息。
任務(wù)實施任務(wù)二探索觸發(fā)器(3)DELETE型觸發(fā)器【例5-32】在“天意書屋”數(shù)據(jù)庫中,要求為圖書信息表tb_book創(chuàng)建delete型觸發(fā)器trig_deletebook,當(dāng)向圖書信息表tb_book中刪除數(shù)據(jù)時,同時刪除類型信息表tb_type中對應(yīng)數(shù)據(jù),最后顯示類型信息表tb_type的信息。
操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
代碼如下:
任務(wù)實施createtriggertrig_deletebookafterdeleteontb_bookforeachrowbegindeletefromtb_typewheretypeid=old.typeid;end;任務(wù)二探索觸發(fā)器(3)DELETE型觸發(fā)器步驟2:刪除一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
任務(wù)實施deletefromtb_bookwherebookid=100;任務(wù)二探索觸發(fā)器步驟3:查看刪除記錄后tb_type表信息。代碼如下:select*fromtb_type;任務(wù)二探索觸發(fā)器2.創(chuàng)建BEFORE觸發(fā)器
BEFORE觸發(fā)器是指觸發(fā)器在所監(jiān)視的觸發(fā)事件執(zhí)行之前激活,激活后執(zhí)行的操作先于監(jiān)視的事件,這樣就有機(jī)會進(jìn)行一些判斷或修改即將發(fā)生的操作。BEFORE觸發(fā)器可以根據(jù)所監(jiān)視的事件分為三種,分別是INSERT型觸發(fā)器、UPDATE型觸發(fā)器和DELETE型觸發(fā)器?!纠?-33】在“天意書屋”數(shù)據(jù)庫中,要求為訂單信息表tb_order創(chuàng)建insert型觸發(fā)器tg1,當(dāng)tb_order表中圖書數(shù)量大于tb_book表中所對應(yīng)圖書的總量,tb_book表中的圖書庫會出現(xiàn)負(fù)數(shù),為避免這類問題,可以創(chuàng)建before觸發(fā)器,系統(tǒng)會先判斷訂單中圖書的購買數(shù)量,如果大于庫存,則拋出異常,終止操作。
操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
運行結(jié)果如下:
代碼如下:
任務(wù)實施任務(wù)二探索觸發(fā)器任務(wù)二探索觸發(fā)器提示:row_count():用于記錄更新操作影響的行數(shù),如果其值不等于1,就說明訂單中圖書數(shù)量大于庫存的數(shù)量,tb_book表不能進(jìn)行更新,此時就會把“商品名稱+庫存不足”賦值給變量msg。signal:用于在存儲過程中向調(diào)用者返回錯誤或警告條件。此外,它還提供對錯誤特征(錯誤編號、sqlstate值、消息)的控制。
任務(wù)實施createtriggertg1beforeinsertontb_orderforeachrowbegindeclaremsgvarchar(200);updatetb_booksetquantity=quantity-new.totalwherebookid=new.bookidandquantity>=new.total;ifrow_count()<>1thenselectconcat(bookname,'庫存不足')intomsgfromtb_bookwherebookid=new.bookid; signalsqlstate'TX000'setmessage_text=msg;endif;end;任務(wù)二探索觸發(fā)器步驟2:插入一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
任務(wù)實施insertintotb_ordervalues(184514955,100101255,13,'2022-8-20',200);任務(wù)二探索觸發(fā)器步驟3:查看tb_book表信息。代碼如下:
select*fromtb_book;任務(wù)二探索觸發(fā)器三、查看觸發(fā)器任務(wù)二探索觸發(fā)器語法格式:
SHOWTRIGGERS;語句說明:SHOWTRIGGERS:查看觸發(fā)器的基本信息?!纠?-34】要求在“天意書屋”數(shù)據(jù)庫中,查看所有觸發(fā)器。
代碼如下:
任務(wù)實施showtriggers;任務(wù)二探索觸發(fā)器任務(wù)二探索觸發(fā)器四、刪除觸發(fā)器任務(wù)二探索觸發(fā)器語法格式:
DROPTRIGGER[數(shù)據(jù)庫名].觸發(fā)器名稱;語句說明:DROPTRIGGER:刪除已經(jīng)存在的觸發(fā)器。數(shù)據(jù)庫名:可選項,如果刪除不是當(dāng)前數(shù)據(jù)庫中的觸發(fā)器,則不可以省略。觸發(fā)器名稱:表示要刪除的觸發(fā)器名稱?!纠?-35】在“天意書屋”數(shù)據(jù)庫中,要求刪除trig_insertbook觸發(fā)器。
代碼如下:
任務(wù)實施droptriggertrig_insertbook;任務(wù)二探索觸發(fā)器1、在“天意書屋”數(shù)據(jù)庫中,要求創(chuàng)建insert型觸發(fā)器trigInsertOrder,觸發(fā)時機(jī)是before,當(dāng)向訂單信息表tb_order中插入數(shù)據(jù)時,同時也在圖書信息表tb_book中插入對應(yīng)的數(shù)據(jù),最后顯示圖書信息表tb_book的信息。請根據(jù)運行結(jié)果將代碼補充完整。
操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
代碼如下:
動手實踐
#創(chuàng)建觸發(fā)器trigInsertOrder
#設(shè)置觸發(fā)器時機(jī)、觸發(fā)器事件和觸發(fā)器作用的表foreachrowbegininsertintotb_book(bookid,typeid,bookprice)values(
.bookid,1,120);end;任務(wù)二探索觸發(fā)器步驟2:插入一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
insertintotb_ordervalues(111111112,100000001,99,'2021-08-19',10);任務(wù)二探索觸發(fā)器步驟3:查看插入記錄后tb_book表信息。代碼如下:select*fromtb_bookwherebookid=99;動手實踐2、在“天意書屋”數(shù)據(jù)庫中,要求創(chuàng)建update型觸發(fā)器trigUpdatebook,觸發(fā)時機(jī)是after,當(dāng)向圖書信息表tb_book中更新數(shù)據(jù)時,同時也在訂單信息表tb_order中更新對應(yīng)的數(shù)據(jù),最后顯示訂單信息表tb_order的信息。請根據(jù)運行結(jié)果將代碼補充完整。
操作步驟如下:
步驟1:創(chuàng)建觸發(fā)器。
代碼如下:
動手實踐
#創(chuàng)建觸發(fā)器trigUpdatebook
#設(shè)置觸發(fā)器時機(jī)、觸發(fā)器事件和觸發(fā)器作用的表
#對表中每一行都生效beginupdatetb_ordersetbookid=new.bookidwhereorderid=111111112;end;任務(wù)二探索觸發(fā)器步驟2:更新一條記錄實現(xiàn)觸發(fā)觸發(fā)器。
代碼如下:
updatetb_booksetbookid=9999wherebookprice=120;任務(wù)二探索觸發(fā)器步驟3:查看更新記錄后tb_order表信息。代碼如下:select*fromtb_orderwhereorderid=111111112;動手實踐3、在“天意書屋”數(shù)據(jù)庫中,要求查看觸發(fā)器信息。請根據(jù)題意將代碼補充完整。
動手實踐
#查看觸發(fā)器信息任務(wù)二探索觸發(fā)器4、在“天意書屋”數(shù)據(jù)庫中,要求刪除觸發(fā)器trigUpdatebook。請根據(jù)題意將代碼補充完整。
#刪除觸發(fā)器trigUpdatebook
1+X知識鞏固
1、創(chuàng)建觸發(fā)器的關(guān)鍵語句是()。A、createfunctionB、createprocedureC、createtriggerD、createevent2、一般激活觸發(fā)器的事件包括insert、update和()事件。A、createB、alterC、dropD、delete3、下列說法中錯誤的是()。A、常用的觸發(fā)器有insert、update、delete三種B、對于同一張數(shù)據(jù)表,可以同時有兩個beforeupdate觸發(fā)器C、new表在insert觸發(fā)器中用來訪問被插入的行D、old表中值只讀不能被更新任務(wù)二探索觸發(fā)器任務(wù)三處理事務(wù)看情景,明目標(biāo)溫舊知,做準(zhǔn)備
劉老師,我想試驗一種極端情況,比如買家購買圖書信息后結(jié)賬的瞬間,斷電了或者其他意外情況,買家的錢已經(jīng)扣除,顯示余額變少,但是賣家的錢沒有增加,怎么辦?為了預(yù)防這種情況發(fā)生,數(shù)據(jù)庫設(shè)計了事務(wù)機(jī)制。事務(wù)是一組有著內(nèi)在邏輯聯(lián)系的SQL語句,這些SQL語句執(zhí)行的數(shù)據(jù)結(jié)果存在一定的關(guān)聯(lián),要么都執(zhí)行成功,要么都不執(zhí)行,且事務(wù)必須同時滿足ACID特征。通過使用事務(wù)可以大大提高數(shù)據(jù)安全性和執(zhí)行效率。走進(jìn)程序設(shè)計探索觸發(fā)器
要求:在“天意書屋”數(shù)據(jù)庫中,采用事務(wù)提交的方法,設(shè)置訂單信息表tb_order中的下單日期orderdate為當(dāng)前系統(tǒng)時間。
任務(wù)描述任務(wù)三處理事務(wù)
任務(wù)實施操作步驟如下:
步驟1:在Navicat主窗口中依次單擊“查詢”—>“新建查詢”按鈕,創(chuàng)建一個查詢窗口。任務(wù)三處理事務(wù)
任務(wù)實施步驟2:在該查詢窗口中輸入:starttransaction;updatetb_ordersetorderdate=date_format(now(),'%Y-%m-%d');commit;任務(wù)三處理事務(wù)步驟3:單擊“運行”按鈕,運行結(jié)果如圖所示。
任務(wù)實施步驟4:繼續(xù)在該查詢窗口中輸入查詢語句,查看orderdate的時間。select*fromtb_order;任務(wù)三處理事務(wù)步驟5:單擊“運行”按鈕,運行結(jié)果如圖所示。任務(wù)三處理事務(wù)一、事務(wù)概述任務(wù)三處理事務(wù)事務(wù)是一組有著內(nèi)在邏輯聯(lián)系的SQL語句,可以是一條非常簡單的SQL語句組成,也可以由一組復(fù)雜的SQL語句組成。支持事務(wù)的數(shù)據(jù)庫系統(tǒng)要么正確執(zhí)行事務(wù)里的所有SQL語句,要么把它們當(dāng)做整體全部放棄,也就是說事務(wù)永遠(yuǎn)不會只完成一部分。在事務(wù)中的操作,要么都執(zhí)行,要么都不執(zhí)行,這就是事務(wù)的目的,也是事務(wù)的重要特征之一。使用事務(wù)可以大大提高數(shù)據(jù)安全性和執(zhí)行效率。1.事務(wù)的定義任務(wù)三處理事務(wù)1324原子性是指數(shù)據(jù)庫事務(wù)是不可分割的操作單位。只有使事務(wù)中所有的數(shù)據(jù)庫操作都執(zhí)行成功,整個事務(wù)的執(zhí)行才算成功。原子性(Atomicity)
一致性是指事務(wù)將數(shù)據(jù)庫從一種狀態(tài)變成另一種狀態(tài)。在事務(wù)開始之前和事務(wù)結(jié)束之后,數(shù)據(jù)的完整性約束沒有被破壞。一致性(Consistency)隔離性要求每個讀寫事務(wù)的對象與其他事務(wù)的操作對象能相互分離,即該事務(wù)提交前對其他事務(wù)都不可見。隔離性(Isolation)事務(wù)一旦提交,其結(jié)果就是永久性的,即使發(fā)生死機(jī)等故障,數(shù)據(jù)庫也能將數(shù)據(jù)恢復(fù)。持久性(Durability)2.事務(wù)的特征任務(wù)三處理事務(wù)二、事務(wù)的基本操作任務(wù)三處理事務(wù)語法格式:
第1步:START
TRANSACTION;
第2步:SQL語句集;
第3步:COMMIT/
ROLLBACK;語句說明:STARTTRANSACTION:表示開始事務(wù)。COMMIT:關(guān)鍵字,表示提交事務(wù)。ROLLBACK:關(guān)鍵字,表示回滾事務(wù)。提示:ROLLBACK只能針對未提交的事務(wù)回滾,已提交的事務(wù)無法回滾?!纠?-36】在“天意書屋”數(shù)據(jù)庫中,要求采用事務(wù)提交的方法,設(shè)置圖書信息表tb_book中“mysql數(shù)據(jù)庫程序設(shè)計”的圖書作者為空,同時價格在原來價格的基礎(chǔ)上增加20元。
操作步驟如下:
步驟1:查看“mysql數(shù)據(jù)庫程序設(shè)計”圖書信息。
代碼如下:
任務(wù)實施select*fromtb_bookwherebookname='mysql數(shù)據(jù)庫程序設(shè)計';任務(wù)三處理事務(wù)步驟2:事務(wù)提交設(shè)置圖書作者為空,同時圖書價格在原來基礎(chǔ)上增加20元。
代碼如下:
任務(wù)實施starttransaction;updatetb_booksetauthor=''wherebookname='mysql數(shù)據(jù)庫程序設(shè)計';updatetb_booksetbookprice=bookprice+20wherebooknam
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版旅游服務(wù)貨款擔(dān)保合同范本3篇
- 2025年食堂食品安全監(jiān)督服務(wù)合同3篇
- 2025版二零二五苗木種植與城市綠化工程合作合同3篇
- 2025年高科技產(chǎn)品外貿(mào)經(jīng)銷代理合同范本3篇
- 2025年食堂蔬菜定制化種植合作合同3篇
- 云母制品在醫(yī)療器械中的應(yīng)用探索考核試卷
- 二零二五年度木門安裝與室內(nèi)智能家居系統(tǒng)集成合同4篇
- 2025版學(xué)校宿管員招聘、培訓(xùn)與薪酬合同3篇
- 2025版國務(wù)院辦公廳事業(yè)單位教師聘用合同細(xì)則3篇
- 2025年倉庫貨物存儲及保管合同
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗
- 春節(jié)文化常識單選題100道及答案
- 12123交管學(xué)法減分考試題及答案
- 2025年寒假實踐特色作業(yè)設(shè)計模板
- 24年追覓在線測評28題及答案
- 初中物理八年級下冊《動能和勢能》教學(xué)課件
- 高考滿分作文常見結(jié)構(gòu)
- 心肌梗死診療指南
- 食堂項目組織架構(gòu)圖
- 原油脫硫技術(shù)
- GB/T 2518-2019連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
評論
0/150
提交評論