版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
項目8數(shù)據(jù)庫編程技術(shù)【項目目標】理解常量和變量的概念。掌握常用的系統(tǒng)內(nèi)置函數(shù)和流程控制語句。能夠編寫簡單的存儲過程、存儲函數(shù)和觸發(fā)器。了解游標的使用和事件的創(chuàng)建方法。任務(wù)8.1編程基礎(chǔ)知識
8.1.1常量和變量1.常量常量是指在程序中可以直接引用的量,其值在程序運行期間保持不變,它的表示形式?jīng)Q定了其數(shù)據(jù)類型。常量可分為數(shù)值常量、字符串常量、日期時間常量、布爾常量和NULL值常量等。(1)數(shù)值常量數(shù)值常量由數(shù)字組成,可以分成整數(shù)常量和實數(shù)常量。①
整數(shù)常量,如156、-100。②
實數(shù)常量,如3.14、-100.23(2)字符串常量字符串常量是用單引號或雙引號括起來的字符序列,如'HELLO'、″數(shù)據(jù)庫系統(tǒng)″。(3)日期和時間常量日期常量是用單引號或雙引號括起來的,包括年、月、日,并按照“年-月-日”的順序表示日期,如'2022-01-01'。時間常量包括時、分、秒,并按照“時:分:秒”的順序構(gòu)成,如'10:20:35'。(4)布爾常量布爾常量只有TURE和FALSE兩個值。TURE對應(yīng)的數(shù)值為“1”;FALSE對應(yīng)的數(shù)值為“0”。(5)NULL值NULL值適用于各種類型,表示沒有值或無數(shù)據(jù),不等價于空字符串或數(shù)據(jù)0值。變量是指在程序運行期間取值可以變化的量,用于臨時存儲數(shù)據(jù),變量中的數(shù)據(jù)隨著程序的運行而變化。一個變量有2個基本要素:變量名和變量的數(shù)據(jù)類型。每個變量都用唯一的變量名來標識,用戶可以通過變量名來訪問內(nèi)存中的數(shù)據(jù),變量的數(shù)據(jù)類型決定了變量的值和對應(yīng)的運算。MySQL變量可分為用戶變量、系統(tǒng)變量和局部變量。變量不區(qū)分大小寫,例如@name、@Name、@NAME表示同一個變量。2.變量(1)用戶變量用戶使用變量定義語句定義的變量稱為用戶變量。用戶變量與連接有關(guān),一個客戶端定義的變量不能被其他客戶端看到或使用。當客戶端退出時,該客戶端連接的所有用戶變量將自動釋放。①SET語句SET語句用于定義和初始化用戶變量,其語法格式如下。SET@用戶變量1=表達式1[,@用戶變量2=表達式2…];說明:
在用戶變量前添加“@”符號,便于區(qū)分變量名和字段名稱。
用戶變量名可以包含字母、數(shù)字和符號(“.”“_”“$”)。
定義多個用戶變量時,每個用戶變量之間用英文逗號分隔。
表達式是賦給用戶變量的值,可以是常量、變量或計算表達式?!纠?-1】使用用戶變量查詢王曉紅的讀者類型、最大借閱數(shù)量和最大借閱天數(shù)。利用用戶變量@typeid將值從一條語句傳遞到另一條語句。第一步:在讀者表reader中查詢到王曉紅的類型編號type_id字段值,并將值存儲到用戶變量@typeid中。mysql>SET@typeid=(SELECTtype_idFROMreaderWHEREname='王曉紅');mysql>SELECT@typeid;第二步:在讀者類型表readertype中查詢type_id值等于用戶變量@typeid的記錄的類型名稱type、最大借閱數(shù)量maxborrow和最大借閱天數(shù)maxdays。mysql>SELECTtype,maxborrow,maxdaysFROMreadertypeWHEREtype_id=@typeid;②SELECT…INTO語句SELECT…INTO語句將查詢到的一行結(jié)果中的字段值賦給對應(yīng)的用戶變量。語法格式如下。SELECT字段名稱1[,字段名稱2…]INTO@用戶變量1[,@用戶變量2…]FROM表名WHERE條件表達式;【例8-2】將讀者編號為2106240206的讀者的姓名name和所屬院系dept存入用戶變量@name和@dept中。mysql>SELECTname,deptINTO@name,@dept
->FROMreaderWHEREreader_id='2106240206';查詢用戶變量@name和@dept的值。mysql>SELECT@name,@dept;(2)系統(tǒng)變量系統(tǒng)變量是MySQL的一些特殊設(shè)置,當MySQL數(shù)據(jù)庫服務(wù)器啟動時,初始化這些變量為默認值。大多數(shù)系統(tǒng)變量名稱前都需要加兩個@,某些特定的系統(tǒng)變量不加這兩個@,如CURRENT_DATE(當前系統(tǒng)日期)、CURRENT_TIME(當前系統(tǒng)時間)、CURRENT_USER(當前用戶名稱)等?!纠?-3】查詢當前系統(tǒng)日期和使用的MySQL的版本信息。mysql>SELECTCURRENT_DATEAS當前日期,@@VERSIONAS當前版本;(3)局部變量局部變量的作用范圍是BEGIN
END語句塊中,用來存放存儲過程體中的臨時結(jié)果。局部變量只能定義在存儲過程、存儲函數(shù)和觸發(fā)器中。局部變量和用戶變量的主要區(qū)別:作用范圍不同,用戶變量存在于整個會話中,局部變量只存在于BEGIN
END語句塊中。用戶變量前有@符號,局部變量前沒有@符號。①
局部變量的聲明??梢允褂肈ECLARE語句聲明局部變量,并給局部變量賦初值,其語法格式如下。DECLARE局部變量名1[,局部變量名2…]數(shù)據(jù)類型[DEFAULT默認值];例如,聲明局部變量n,數(shù)據(jù)類型為INT;聲明局部變量vprice,數(shù)據(jù)類型為DECIMAL(7,2);聲明局部變量vtitle、vauthor,數(shù)據(jù)類型均為CHAR(50)。DECLAREnINT;DECLAREvpriceDECIMAL(7,2);DECLAREvtitle,vauthorCHAR(50);②
為局部變量賦值。使用SET語句或SELECT…INTO語句為局部變量賦值,語法格式類似于為用戶變量賦值。例如,使用SET語句為局部變量n和vtitle賦值。SETn=86,vtitle='程序設(shè)計基礎(chǔ)';例如,使用SELECT…INTO語句為局部變量vauthor和vprice賦值。SELECTauthor,priceINTOvauthor,vpriceFROMbookWHEREtitle=vtitle;8.1.2系統(tǒng)內(nèi)置函數(shù)
在MySQL中提供了許多內(nèi)置的標準函數(shù),每個標準函數(shù)可以實現(xiàn)某個特定的功能,方便用戶使用。函數(shù)的調(diào)用格式如下函數(shù)名([參數(shù)1[,參數(shù)2
]])說明:(1)參數(shù)可以是常量、變量或計算表達式。(2)函數(shù)可以沒有參數(shù),也可以有一個或多個參數(shù),多個參數(shù)之間用逗號進行分隔。(3)調(diào)用函數(shù)后,得到一個函數(shù)的返回值。函數(shù)名和括號之間不能有空格;沒有參數(shù)的函數(shù)也不能省略括號()。1.數(shù)學(xué)函數(shù)【例8-4】計算圖書表book中的總館藏數(shù)量和平均定價(保留一位小數(shù))。mysql>SELECTSUM(stocknum)AS總館藏數(shù)量,ROUND(AVG(price),1)AS平均定價
->FROMbook;函數(shù)函數(shù)功能示例返回結(jié)果ABS(n)返回數(shù)值表達式n的絕對值A(chǔ)BS(-2.5)2.5ROUND(n,m)返回按照指定的小數(shù)位數(shù)m對n值四舍五入的結(jié)果ROUND(12.38,1)12.4TRUNCATE(n,m)返回按照指定的小數(shù)位數(shù)m對n值截取的結(jié)果TRUNCATE(12.38,1)12.32.字符串函數(shù)函數(shù)函數(shù)功能示例返回結(jié)果ASCII(c)返回字符串c左端字符的ASCII值A(chǔ)SCII('A')65CHAR(n)將數(shù)值n轉(zhuǎn)換成字符CHAR(65)'A'CONCAT(c1,c2…)將多個字符串連接成一個字符串CONCAT('AB','XYZ')'ABXYZ'LENGTH(c)求字符串c的長度LENGTH('ABCD')4LEFT(c,n)取字符串c從左端開始的n個字符LEFT('ABCD',3)'ABC'RIGHT(c,n)取字符串c從右端開始的n個字符RIGHT('ABCD',3)'BCD'SUBSTRING(c,n1[,n2])取子字符串,從字符串c的n1位置開始取n2個字符。未設(shè)置n2時,從n1位置開始取到串尾SUBSTRING('ABCDE',2,3)'BCD'REPLACE(c1,c2,c3)用字符串c3替換字符串c1中的所有字符串c2REPLACE('ABCDABE','AB','2')'2CD2E'TRIM(c)去掉字符串c左右兩端的空格TRIM('ABCD')'ABCD'LOWER(c)將字符串c中的大寫字母轉(zhuǎn)換為小寫LOWER('AB')'ab'UPPER(c)將字符串c中的小寫字母轉(zhuǎn)換為大寫UPPER('ab')'AB'【例8-5】查詢讀者表reader中姓“李”的讀者編號reader_id、姓名name、性別gender和所屬院系dept。mysql>SELECTreader_id,name,gender,deptFROMreader
->WHERELEFT(name,1)='李';【例8-6】將館藏表stock中的存放位置location字段分成層、區(qū)域和書架3列顯示,并且只顯示存放在二層的藏書。mysql>SELECTstock_idAS館藏編號,locationAS存放位置,LEFT(location,1)AS層,SUBSTRING(location,3,1)AS區(qū)域,SUBSTRING(location,5)AS書架
->FROMstockWHERELEFT(location,1)='二';3.日期和時間函數(shù)函數(shù)函數(shù)功能示例返回結(jié)果CURDATE()返回系統(tǒng)當前日期CURDATE()2025-4-10CURTIME()返回系統(tǒng)當前時間CURTIME()11:23:58NOW()返回系統(tǒng)當前日期和時間NOW()2025-04-1011:23:58YEAR(d)返回日期表達式d的年份YEAR('2025-04-10')2025MONTH(d)返回日期表達式d的月份MONTH('2025-04-10')4DAY(d)返回日期表達式d的天數(shù)DAY('2025-04-10')10DATEDIFF(d1,d2)返回兩個日期之間的天數(shù)差值DATEDIFF('2025-04-16','2025-04-10')06【例8-7】查詢圖書表book中出版5年以上的圖書的編號、書名和出版年數(shù),按照出版年數(shù)的降序排列。分析:
“出版年數(shù)”可以通過表達式“YEAR(NOW())-YEAR(pubdate)”獲得。mysql>SELECTbook_idAS圖書編號,titleAS書名,YEAR(NOW())-YEAR(pubdate)AS出版年數(shù)
->FROMbook
->WHEREYEAR(NOW())-YEAR(pubdate)>5
->ORDERBY3DESC;結(jié)果會根據(jù)運行時間變化【例8-8】查詢尚未歸還圖書的讀者的讀者編號、讀者姓名、書名、借出時間和借閱天數(shù)。分析:
借閱天數(shù)是系統(tǒng)當前日期和時間(NOW())和借出時間borrowtime的差值,用返回兩個日期之間的天數(shù)的函數(shù)DATEDIFF實現(xiàn)。mysql>SELECTreader.reader_idAS讀者編號,nameAS讀者姓名,titleAS書名,borrowtimeAS借出時間,DATEDIFF(NOW(),borrowtime)AS借閱天數(shù)
->FROMreaderJOINborrowONreader.reader_id=borrow.reader_idJOINstockONborrow.stock_id=stock.stock_idJOINbookONstock.book_id=book.book_id->WHEREreturntimeISNULL;結(jié)果會根據(jù)運行時間變化控制流程函數(shù)函數(shù)函數(shù)功能示例返回結(jié)果IF(expr,v1,v2)判斷條件表達式expr的值,如果為真則返回v1的值,否則返回v2的值IF(5>0,'是','否')是IFNULL(v1,v2)如果v1的值不為空則返回v1的值,否則返回v2的值IFNULL(5,2)5【例8-9】查詢讀者表reader中每位女性讀者最多可以借閱圖書的數(shù)量,如果讀者類型編號type_id為1,則顯示“8本”,否則顯示“5本”。mysql>SELECTnameAS姓名,IF(type_id=1,'8本','5本')AS最多可以借閱圖書數(shù)量
->FROMreaderWHEREgender='女';【例8-10】查詢2025年借閱過圖書的讀者的讀者編號、所借閱圖書的館藏編號和還書時間(如果圖書尚未歸還,則顯示“未還”)。mysql>SELECTreader_idAS讀者編號,stock_idAS館藏編號,IFNULL(returntime,'未還')AS還書時間
->FROMborrowWHEREYEAR(borrowtime)=2025;8.1.3流程控制語句流程控制語句是用于控制程序執(zhí)行順序的語句。在MySQL中,流程控制語句和局部變量一樣,只能出現(xiàn)在存儲過程、存儲函數(shù)和觸發(fā)器中用來控制程序的執(zhí)行流程。流程控制語句包括:順序語句分支語句循環(huán)語句1.順序語句
(1)BEGIN…END語句塊BEGIN…END用于定義語句塊,語句塊中可以包含一個語句序列,語句之間可以嵌套。關(guān)鍵字BEGIN定義語句塊的起始位置,END定義同一語句塊的結(jié)束位置。其基本語法格式BEGIN
語句序列;END;BEGINSELECTreader_id,name,genderFROMreaderWHEREgender='男';END;(2)DELIMITER語句MySQL默認以英文分號作為單條語句的結(jié)束標志,因此在創(chuàng)建程序的語句中,系統(tǒng)在遇到第一個英文分號時就會認為創(chuàng)建程序的語句結(jié)束。當BEGIN…END語句塊中包含多條以英文分號作為結(jié)束標志的語句時,系統(tǒng)處理到第一條語句的英文分號就會停止,導(dǎo)致創(chuàng)建程序失敗。這就需要使用DELIMITER語句將單條語句的結(jié)束標志修改為其他符號,這樣才可以順利執(zhí)行BEGIN…END語句塊中包含的多條語句
語法格式DELIMITER結(jié)束標志DELIMITER
$$BEGINDECLAREvtypeidINT;SETvtypeid=(SELECTtype_idFROMreaderWHEREname='王曉紅');SELECTname,type,maxborrow,maxdaysFROMreadertypeWHEREtype_id=vtypeid;END$$DELIMITER
;將語句的結(jié)束標志變成“$$”恢復(fù)以英文分號作為結(jié)束標志2.分支語句
分支語句有兩種,分別為IF語句和CASE語句。(1)IF語句IF語句可以根據(jù)不同的條件執(zhí)行不同的操作,其語法格式如下。IF條件1THEN語句序列1[ELSEIF條件2THEN語句序列2]
…[ELSE語句序列n]ENDIF;IF語句的執(zhí)行流程先計算條件1的值,如果條件1的值為真(TRUE),則執(zhí)行語句序列1;否則繼續(xù)計算條件2的值,以此類推;如果沒有一個條件的值為真,則執(zhí)行ELSE中的語句序列n?!纠?-11】查詢讀者李俊的類型編號type_id,如果查詢結(jié)果為1,則顯示“最多可以借閱90天”,否則顯示“最多可以借閱60天”。DECLAREvtypeidINT;SELECTtype_idINTOvtypeidFROMreaderWHEREname='李俊'IFvtypeid=1THENSELECT'最多可以借閱90天'AS圖書借閱天數(shù);ELSESELECT'最多可以借閱60天'AS圖書借閱天數(shù);ENDIF;(2)CASE語句CASE是另一種分支語句,有以下兩種語法格式。①CASE語法格式一如下。CASE表達式WHEN
值1THEN語句序列1[WHEN值2THEN語句序列2]
…[ELSE
語句序列n]END[CASE];CASE語法格式一的執(zhí)行流程如下。先計算出表達式的值,然后與WHEN…THEN語句塊中的值進行匹配,如果與某個值的匹配結(jié)果為真,則執(zhí)行對應(yīng)的語句序列;如果與每一個語句塊中的值都不匹配,則執(zhí)行ELSE中的語句序列n。②CASE語法格式二如下。CASEWHEN條件1THEN語句序列1[WHEN條件2THEN語句序列2]
…[ELSE語句序列n]END[CASE];CASE語法格式二的執(zhí)行流程如下。CASE關(guān)鍵字后沒有參數(shù)。在WHEN…THEN語句塊中指定一個條件,如果條件的值為真,則執(zhí)行對應(yīng)的語句序列;如果每一個語句塊中的條件的值都不為真,則執(zhí)行ELSE中的語句序列n?!纠?-12】查詢館藏表stock中的圖書狀態(tài),如果為0則顯示“在館”;為1則顯示“借出”;為2則顯示“保留”。在SELECT語句中使用CASE…END形式。mysql>SELECTstock_idAS館藏編號,locationAS存放位置,
->CASEstatus
->WHEN0THEN'在館'
->WHEN1THEN'借出'
->WHEN2THEN'保留'
->ENDAS狀態(tài)
->FROMstock;mysql>SELECTstock_idAS館藏編號,locationAS存放位置,
->CASE
->WHENstatus=0THEN'在館'
->WHENstatus=1THEN'借出'
->WHENstatus=2THEN'保留'
->ENDAS狀態(tài)
->FROMstock;3.循環(huán)語句循環(huán)語句有3種:WHILE語句REPEAT語句LOOP語句WHILE語句的執(zhí)行流程:先判斷條件是否成立,如果條件成立,則執(zhí)行語句序列;再次判斷條件是否成立,如果條件成立,則繼續(xù)循環(huán),否則結(jié)束循環(huán)。(1)WHILE語句WHILE語句的語法格式:WHILE條件DO
語句序列ENDWHILE;【例8-13】計算1+2+3+…+100。DECLAREnINTDEFAULT1;DECLAREsumINTDEFAULT0;WHILEn<=100DO
SETsum=sum+n;
SETn=n+1;ENDWHILE;變量sum必須使用DEFAULT賦初值0,否則其初值默認為NULLDECLAREnINTDEFAULT1;DECLAREsum;WHILEn<=100DOSETsum=sum+n;SETn=n+1;ENDWHILE;sum=5050sum=NULL(2)REPEAT語句REPEAT語句的語法格式:REPEAT
語句序列
UNTIL條件ENDREPEAT;REPEAT語句的執(zhí)行流程:先執(zhí)行語句序列,然后判斷條件是否成立,如果條件不成立,則繼續(xù)循環(huán),否則結(jié)束循環(huán)。REPEAT語句的特點是“先執(zhí)行,后判斷”,語句序列至少執(zhí)行一次;WHILE語句的特點是“先判斷,后執(zhí)行”,語句序列可能一次也不執(zhí)行。【例8-14】計算2+4+6+…+100。DECLAREnINTDEFAULT2;DECLAREsumINTDEFAULT0;REPEAT
SETsum=sum+n;
SETn=n+2;
UNTILn>100ENDREPEAT;(3)LOOP語句LOOP語句的語法格式:[語句標號:]LOOP
語句序列ENDLOOP[語句標號];LOOP語句的執(zhí)行流程:重復(fù)執(zhí)行語句序列,語句序列中通常存在一個LEAVE語句,執(zhí)行到該語句時退出循環(huán)。其中的語句標號是用戶自定義的名稱。退出循環(huán)的LEAVE語句的語法格式:LEAVE語句標號;【例8-15】計算5的階乘。DECLAREn,fINTDEFAULT1;fact:LOOPSETf=f*n;SETn=n+1;IFn>5THENLEAVEfact;ENDIF;ENDLOOPfact;8.2存儲過程
存儲過程是在數(shù)據(jù)操作語句的集合,經(jīng)過編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名稱并給出需要的參數(shù)來調(diào)用執(zhí)行存儲過程中的語句。用戶可以將經(jīng)常需要執(zhí)行的特定操作寫成存儲過程,每次需要時調(diào)用該存儲過程,可以實現(xiàn)一個存儲過程的多次調(diào)用,實現(xiàn)了程序的模塊化設(shè)計。因為存儲過程是預(yù)編譯的,可以加快執(zhí)行速度。存儲過程由聲明式SQL語句(如SELECT、INSERT、UPDATE等語句)和過程式SQL語句(如IF-THEN-ELSE等流程控制語句)組成,完成對較為復(fù)雜問題的處理。8.2.1創(chuàng)建存儲過程使用CREATEPROCEDURE語句可以創(chuàng)建存儲過程語法格式:CREATEPROCEDURE存儲過程名([參數(shù)1[,參數(shù)2
]])[特征][COMMENT'注釋信息']存儲過程體存儲過程名:用戶自定義的存儲過程名稱。參數(shù):存儲過程中的參數(shù)是形式參數(shù),簡稱形參
調(diào)用存儲過程使用的參數(shù)是實際參數(shù),簡稱實參。
形式參數(shù)有輸入?yún)?shù)IN、輸出參數(shù)OUT、輸入輸出參數(shù)INOUT共3種參數(shù)。
形式為:[IN
OUT
INOUT]參數(shù)名類型。
①IN:將實參的值傳遞給形參,作為存儲過程的輸入值。
②OUT:是存儲過程的輸出值,結(jié)束時將形參的結(jié)果值傳遞給實參。
③INOUT:既是輸入值也是輸出值,調(diào)用存儲過程時將實參傳遞給形參,存儲過程結(jié)束后將形參傳遞給實參。存儲過程可以有0個或多個參數(shù),沒有參數(shù)時存儲過程名后的括號()必須保留;當有多個參數(shù)時,各個參數(shù)之間用逗號分隔。存儲過程體:調(diào)用存儲過程時將要執(zhí)行的SQL語句,這部分總是以BEGIN開始,END為結(jié)束。當存儲過程體中只有一條SQL語句時,可以省略BEGIN
END語句。
說明
8.2.2調(diào)用存儲過程創(chuàng)建存儲過程后,可以在程序、觸發(fā)器、其他存儲過程中使用CALL語句調(diào)用。其語法格式如下。CALL存儲過程名([參數(shù)1[,參數(shù)2
]]);說明:(1)參數(shù)是調(diào)用存儲過程使用的實在參數(shù),簡稱實參。(2)實參的個數(shù)必須與存儲過程定義的形參個數(shù)相同?!纠?-16】創(chuàng)建無參數(shù)的存儲過程p_count,統(tǒng)計讀者表reader中的讀者人數(shù)。創(chuàng)建存儲過程。CREATEPROCEDUREp_count()SELECTCOUNT(*)AS讀者人數(shù)FROMreader;調(diào)用存儲過程mysql>CALLp_count();【例8-17】創(chuàng)建帶輸入?yún)?shù)的存儲過程p_countgender,統(tǒng)計讀者表reader中指定性別的讀者人數(shù)。存儲過程包含了一個輸入?yún)?shù)。CREATEPROCEDUREp_countgender(INvgenderCHAR(1))SELECTCOUNT(*)AS讀者人數(shù)FROMreaderWHEREgender=vgender;調(diào)用存儲過程,將實參“女”傳遞給形參vgender。mysql>CALLp_countgender('女');【例8-18】創(chuàng)建帶輸入?yún)?shù)的存儲過程p_type,輸入讀者姓名,查詢該讀者的類型名稱type、最大借閱數(shù)量maxborrow和最大借閱天數(shù)maxdays。DELIMITER$$CREATEPROCEDUREp_type(INvnameVARCHAR(50))COMMENT'輸入讀者姓名,查詢該讀者的類型名稱、最大借閱數(shù)量和最大借閱天數(shù)'BEGINDECLAREvtypeidINT;SETvtypeid=(SELECTtype_idFROMreaderWHEREname=vname);SELECTtype,maxborrow,maxdaysFROMreadertypeWHEREtype_id=vtypeid;END$$DELIMITER;mysql>CALLp_type('李俊');【例8-19】創(chuàng)建帶輸入?yún)?shù)的存儲過程p_status,輸入館藏編號,查詢該館藏圖書的存放位置和狀態(tài),如果圖書狀態(tài)status字段值為0則顯示“在館”,為1則顯示“借出”,為2則顯示“保留”。DELIMITER$$CREATEPROCEDUREp_status(INvsidCHAR(8))COMMENT'輸入館藏編號,查詢該館藏圖書的存放位置和狀態(tài)'BEGINDECLAREvstatusINT;DECLAREvstCHAR(2);DECLAREvlocationVARCHAR(50);/*查詢該館藏編號對應(yīng)的圖書的存放位置和狀態(tài),并將其分別保存到vlocation和vstatus中*/SELECTlocation,statusINTOvlocation,vstatusFROMstockWHEREstock_id=vsid;CASEvstatus /*根據(jù)vstatus的不同值來設(shè)置變量vst*/WHEN0THENSETvst='在館';WHEN1THENSETvst='借出';WHEN2THENSETvst='保留';ENDCASE;SELECTvsidAS館藏編號,vlocationAS存放位置,vstAS狀態(tài);END$$DELIMITER;mysql>CALLp_status('10100601');【例8-20】創(chuàng)建帶輸入?yún)?shù)和輸出參數(shù)的存儲過程p_result,輸入讀者想要借閱的圖書的館藏編號,判斷該圖書是否可以借閱。如果圖書狀態(tài)status字段值為0(在館),則輸出“可以借閱”;否則輸出“不可以借閱”。DELIMITER$$CREATEPROCEDUREp_result(INvstockidCHAR(8),OUTvresultCHAR(10))COMMENT'圖書狀態(tài)查詢'BEGINDECLAREvstatusINT;SELECTstatusINTOvstatusFROMstockWHEREstock_id=vstockid;IFvstatus=0THENSETvresult='可以借閱';ELSESETvresult='不可以借閱';ENDIF;END$$DELIMITER;mysql>CALLp_result('10100602',@result);mysql>SELECT@resultAS結(jié)果;8.2.3刪除存儲過程當不再需要某個存儲過程時,為了釋放其占用的存儲空間,可以使用DROPPROCEDURE語句刪除該存儲過程。其語法格式如下。DROPPROCEDURE[IFEXISTS]存儲過程名;說明如下。(1)存儲過程名:需要刪除的存儲過程的名稱。(2)IFEXISTS:可選項,檢測指定的存儲過程是否存在,僅在其存在時才執(zhí)行刪除操作。這樣可以避免因存儲過程不存在而引起的錯誤。【例8-21】刪除存儲過程p_count。mysql>DROPPROCEDUREp_count;8.2.4使用游標
游標主要包括游標結(jié)果集和游標位置兩部分,游標結(jié)果集是由定義游標的SELECT語句返回行的集合,游標位置則是指向這個結(jié)果集中某一行的指針。游標不能單獨在查詢中使用,一定要在存儲過程或存儲函數(shù)中使用。使用游標的關(guān)鍵步驟:聲明游標打開游標遍歷游標關(guān)閉游標1.聲明游標使用游標之前首先要聲明游標,定義SELECT語句的結(jié)果集語法格式:DECLARE游標名CURSORFORSELECT語句;
說明
(1)使用SELECT語句查詢出來的結(jié)果構(gòu)成結(jié)果集。(2)游標聲明時,定義的SELECT語句還沒有執(zhí)行,沒有結(jié)果集。因此聲明游標之后必須打開游標。打開游標即執(zhí)行與之對應(yīng)的SELECT語句,得到結(jié)果集語法格式:OPEN游標名;2.打開游標3.遍歷游標遍歷游標可以獲取游標所指向結(jié)果集中的當前記錄,并將各個字段值傳送給一組變量,變量的個數(shù)必須與SELECT語句返回的字段個數(shù)一致,語法格式:FETCH游標名INTO變量列表;
說明
(1)FETCH每次執(zhí)行時只能從游標的結(jié)果集中提取一條記錄,并向前移動指針。(2)如果需要逐條提取結(jié)果集中的全部記錄,必須將FETCH語句放置在循環(huán)語句中。(3)錯誤處理程序。使用FETCH語句提取到結(jié)果集中的最后一條記錄后,再執(zhí)行FETCH語句則游標溢出,會發(fā)生NOTFOUND錯誤,此時立即執(zhí)行錯誤處理程序中的語句。例如,錯誤處理程序:當發(fā)生NOTFOUND錯誤時,設(shè)置錯誤標志變量done為1。DECLARECONTINUEHANDLEFORNOTFOUNDSETdone=1;4.關(guān)閉游標游標使用結(jié)束后需要及時關(guān)閉,這樣可以釋放游標所占用的內(nèi)存空間語法格式:CLOSE游標名;例如,在下列給出的使用游標的框架結(jié)構(gòu)中,聲明一個錯誤標志變量done用來保存FETCH操作是否發(fā)生錯誤,如果其值為0,則表示FETCH取得了記錄(沒有發(fā)生錯誤),循環(huán)繼續(xù);當FETCH已經(jīng)是最后一行,找不到下一行了(發(fā)生NOTFOUND錯誤),這時遍歷結(jié)束,設(shè)置變量done為1。在循環(huán)結(jié)構(gòu)中判斷如果done為1,則結(jié)束循環(huán)。BEGINDECLAREdoneINTDEFAULT0; /*聲明錯誤標志變量done*/DECLARE游標名CURSORFORSELECT語句; /*聲明游標*/DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1; /*聲明錯誤處理程序*/OPEN游標名; /*打開游標*/REPEATFETCH游標名INTO變量列表; /*提取游標中的一行數(shù)據(jù)*/IFdone=0THEN /*未發(fā)生錯誤則執(zhí)行語句系列*/
語句序列;ENDIF;UNTILdone=1
/*發(fā)生錯誤則結(jié)束循環(huán)*/ENDREPEAT; CLOSE游標名; /*關(guān)閉游標*/END【例8-22】創(chuàng)建一個包含游標的存儲過程p_readertype,查詢讀者類型表readertype表中讀者類型和最大借閱天數(shù)。DELIMITER$$CREATEPROCEDUREp_readertype()BEGINDECLAREdoneINTDEFAULT0; /*聲明錯誤標志變量done*/DECLAREvtypeVARCHAR(10); /*聲明變量存儲讀者類型*/DECLAREvmaxdaysINT; /*聲明變量存儲最大借閱天數(shù)*/DECLAREtypecursorCURSORFORSELECTtype,maxdaysFROMreadertype;DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1; /*聲明錯誤處理程序*/OPENtypecursor; /*打開游標,執(zhí)行SELECT語句獲得結(jié)果集*/REPEATFETCHtypecursorINTOvtype,vmaxdays; /*提取游標中的一行數(shù)據(jù)*/IFdone=0THEN /*未發(fā)生錯誤*/SELECTvtypeAS讀者類型,vmaxdaysAS最大借閱天數(shù);ENDIF;UNTILdone=1/*發(fā)生錯誤則結(jié)束循環(huán)*/ENDREPEAT;CLOSEtypecursor;/*關(guān)閉游標*/END$$DELIMITER;【例8-23】創(chuàng)建一個包含游標的存儲過程p_status,統(tǒng)計狀態(tài)為“在館”“借出”“保留”的圖書的百分比。DELIMITER$$CREATEPROCEDUREp_status()BEGINDECLAREdoneINTDEFAULT0; /*聲明錯誤標志變量done*/DECLAREvidVARCHAR(8); /*聲明變量存儲館藏編號*/DECLAREvstatus,n1,n2,n3INT; /*聲明圖書狀態(tài)變量和3個變量存儲3種狀態(tài)的圖書數(shù)量*/DECLAREp1,p2,p3FLOAT; /*聲明3個變量分別存儲3種狀態(tài)的圖書百分比*/DECLAREstatuscursorCURSORFORSELECTstock_id,statusFROMstock;DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1; /*聲明錯誤處理程序*/SETn1=0,n2=0,n3=0;OPENstatuscursor; /*打開游標,執(zhí)行SELECT語句獲得結(jié)果集*/REPEATFETCHstatuscursorINTOvid,vstatus; /*提取結(jié)果集中的一條記錄*/IFdone=0THEN /*未發(fā)生錯誤則執(zhí)行語句序列*/IFvstatus=0THENSETn1=n1+1; /*vstatus=0,則n1增1*/ELSEIFvstatus=1THENSETn2=n2+1; /*vstatus=1,則n2增1*/ELSESETn3=n3+1; /*vstatus既不是0也不是1,則n3增1*/ENDIF;ENDIF;UNTILdone=1 /*發(fā)生錯誤則結(jié)束循環(huán)*/ENDREPEAT; SETp1=round(n1/(n1+n2+n3)*100,2); /*計算“在館”圖書百分比*/SETp2=round(n2/(n1+n2+n3)*100,2); /*計算“借出”圖書百分比*/SETp3=100-p1-p2; /*計算“保留”圖書百分比*/CLOSEstatuscursor; /*關(guān)閉游標*/SELECTCONCAT(p1,'%')AS在館率,CONCAT(p2,'%')AS借出率,CONCAT(p3,'%')AS保留率;END$$DELIMITER;mysql>CALLp_status();【例8-24】創(chuàng)建一個包含游標的存儲過程p_avgyear,計算圖書表book中圖書的平均出版年數(shù),如果平均出版年數(shù)大于5年,則顯示“需要增加新出版的圖書”的提示信息。DELIMITER$$CREATEPROCEDUREp_avgyear()BEGINDECLAREdoneINTDEFAULT0; /*聲明錯誤標志變量done*/DECLAREvyearDATE; /*聲明變量存儲出版日期*/DECLAREvavgyearFLOATDEFAULT0; /*聲明變量存儲平均出版年數(shù)*/DECLAREnINTDEFAULT0; /*聲明變量存儲圖書總數(shù)*/DECLAREyearcursorCURSORFORSELECTpubdateFROMbook; /*聲明游標*/DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1; /*聲明錯誤處理程序*/OPENyearcursor; /*打開游標*/REPEATFETCHyearcursorINTOvyear; /*提取結(jié)果集中的一個出版日期*/IFdone=0THEN /*未發(fā)生錯誤則執(zhí)行語句序列*/SETvavgyear=vavgyear+YEAR(NOW())-YEAR(vyear); /*計算出版年數(shù)*/SETn=n+1; /*圖書總數(shù)增1*/ENDIF;UNTILdone=1 /*發(fā)生錯誤則結(jié)束循環(huán)*/ENDREPEAT; SETvavgyear=vavgyear/n; /*計算平均出版年數(shù)*/SELECTvavgyearAS平均出版年數(shù);IFvavgyear>5THENSELECT'需要增加新出版的圖書'AS提示信息;ENDIF;CLOSEyearcursor; /*關(guān)閉游標*/END$$DELIMITER;mysql>CALLp_avgyear();結(jié)果會根據(jù)運行時間變化8.3存儲函數(shù)
MySQL的存儲函數(shù)與存儲過程的作用和格式有許多類似之處,都是由聲明式SQL語句和過程式SQL語句組成的主要區(qū)別:(1)存儲函數(shù)有返回值,所以沒有輸出參數(shù)。(2)存儲函數(shù)必須包含一條RETURN語句。(3)存儲函數(shù)不能使用CALL語句來調(diào)用,存儲函數(shù)的調(diào)用類似于系統(tǒng)內(nèi)置函數(shù)的調(diào)用方法,即在表達式、賦值語句中實現(xiàn)調(diào)用。8.3.1創(chuàng)建存儲函數(shù)使用CREATEFUNCTION語句可以創(chuàng)建存儲函數(shù)語法格式:CREATEFUNCTION存儲函數(shù)名([參數(shù)1[,參數(shù)2
]])RETURNS類型DETERMINISTIC存儲函數(shù)體
說明
(1)存儲函數(shù)名:用戶自定義的存儲函數(shù)名稱。(2)參數(shù):用于指定存儲函數(shù)的參數(shù),參數(shù)只有參數(shù)名和參數(shù)類型。不使用IN、OUT或INOUT指定參數(shù)。(3)RETURNS子句:用于聲明存儲函數(shù)返回值的數(shù)據(jù)類型。(4)DETERMINISTIC:表示存儲函數(shù)的結(jié)果是確定的,不同用戶輸入相同的數(shù)據(jù)會返回相同的結(jié)果。(5)存儲函數(shù)體:存儲函數(shù)體中必須包含一條RETURNvalue語句,value用于指定存儲函數(shù)的返回值;在存儲過程中使用的SQL語句在存儲函數(shù)中也適用,包括流程控制語句、游標等,若包含多條語句需要存放在以BEGIN開始,END為結(jié)束的結(jié)構(gòu)中。8.3.2調(diào)用存儲函數(shù)調(diào)用存儲函數(shù)的類似于調(diào)用系統(tǒng)函數(shù),可以使用SELECT關(guān)鍵字。語法格式:SELECT
存儲函數(shù)名([參數(shù)1[,參數(shù)2
]]);【例8-25】創(chuàng)建計算2+4+6+…+100的存儲函數(shù)f_sum。DELIMITER$$CREATEFUNCTIONf_sum()RETURNSINTDETERMINISTICBEGINDECLAREnINTDEFAULT2;DECLAREsumINTDEFAULT0;REPEATSETsum=sum+n;SETn=n+2;UNTILn>100ENDREPEAT;RETURNsum;END$$DELIMITER;mysql>SELECTf_sum();【例8-26】創(chuàng)建無參數(shù)的存儲函數(shù)f_count,統(tǒng)計圖書表book中圖書的數(shù)量。DELIMITER$$CREATEFUNCTIONf_count()RETURNSINTDETERMINISTICBEGINRETURN(SELECTCOUNT(*)FROMbook);END$$DELIMITER;調(diào)用存儲函數(shù)f_count。mysql>SELECTf_count();例8-27】創(chuàng)建帶參數(shù)的存儲函數(shù)f_deptname,實現(xiàn)輸入姓名name,返回該讀者的所屬院系dept。DELIMITER$$CREATEFUNCTIONf_deptname(vnameCHAR(50))RETURNSCHAR(50)DETERMINISTICBEGINRETURN(SELECTdeptFROMreaderWHEREname=vname);END$$DELIMITER;調(diào)用存儲函數(shù)f_deptname,查看“劉麗華”的所屬院系。mysql>SELECTf_deptname('劉麗華');8.3.3刪除存儲函數(shù)使用DROPFUNCTION語句刪除存儲函數(shù),其語法格式:DROPFUNCTION[IFEXISTS]存儲函數(shù)名;說明如下。(1)存儲函數(shù)名:需要刪除的存儲函數(shù)的名稱。(2)IFEXISTS:可選項,檢測指定的存儲函數(shù)名是否存在,其存在時才執(zhí)行刪除操作。這樣可以避免因存儲函數(shù)不存在而引起的錯誤?!纠?-28】刪除存儲函數(shù)f_count。mysql>DROPFUNCTIONIFEXISTSf_count;8.4觸發(fā)器
觸發(fā)器是一種特殊的存儲過程,用于保護表中數(shù)據(jù)來實現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)完整性。它不需要使用CALL語句調(diào)用,也不需要直接寫出觸發(fā)器名來調(diào)用。當有操作會影響到觸發(fā)器保護的數(shù)據(jù)時,觸發(fā)器會自動激活執(zhí)行,保證了數(shù)據(jù)庫的數(shù)據(jù)完整性。例如,當修改圖書表book中某種圖書的圖書編號book_id字段時,為了保證數(shù)據(jù)的一致性,該種圖書在館藏表stock中的對應(yīng)圖書編號book_id字段也要同時修改。8.4.1創(chuàng)建觸發(fā)器使用CREATETRIGGER語句可以創(chuàng)建觸發(fā)器語法格式:CREATETRIGGER觸發(fā)器名觸發(fā)時間觸發(fā)事件ON表名FOREACHROW觸發(fā)器動作;
說明
(1)觸發(fā)器名:用戶自定義的觸發(fā)器名稱。(2)觸發(fā)時間:觸發(fā)器觸發(fā)的時刻,有AFTER和BEFORE兩個選項,分別表示觸發(fā)動作是在觸發(fā)事件之前執(zhí)行,還是在觸發(fā)事件之后執(zhí)行。如果想在觸發(fā)事件之后執(zhí)行更多的改變操作,通常使用AFTER;如果想在觸發(fā)事件之前驗證新數(shù)據(jù)是否滿足使用的限制,則使用BEFORE。(3)觸發(fā)事件:激活觸發(fā)器程序的語句包括INSERT、UPDATE和DELETE,即當在表中插入、修改或刪除記錄時都會激活觸發(fā)器。(4)表名:與觸發(fā)器相關(guān)的表名,在該表上發(fā)生觸發(fā)事件才會激活觸發(fā)器。(5)FOREACHROW:用于指定每一行都可以激活觸發(fā)器。(6)觸發(fā)器動作:觸發(fā)器的主體,包含觸發(fā)器激活時將要執(zhí)行的語句。如果要執(zhí)行多條語句,則需要放置在以BEGIN開始,END為結(jié)束的結(jié)構(gòu)中?!纠?-29】在圖書表book中創(chuàng)建一個觸發(fā)器t_bookadd,每插入一條記錄,就將用戶變量@str賦值為“添加一種新圖書”。①
創(chuàng)建觸發(fā)器t_bookadd。mysql>CREATETRIGGERt_bookadd
AFTER
INSERT
->ONbookFOREACHROWSET@str='添加一種新圖書';②
在圖書表book中插入一條新記錄。mysql>INSERTINTObookVALUES('129995','操作系統(tǒng)',NULL,NULL,NULL,NULL,NULL);③
查詢用戶變量@str,驗證觸發(fā)器的執(zhí)行結(jié)果。mysql>SELECT@str;8.4.2使用觸發(fā)器在使用觸發(fā)器的SQL語句中可以引用表中的任何字段,為了避免系統(tǒng)混淆,不可以直接使用字段名稱,而要使用“OLD.字段名稱”或“NEW.字段名稱”。OLD.字段名稱:表示引用被修改或刪除前的值NEW.字段名稱:表示引用新插入或修改后的值對于INSERT語句,只有NEW是合法的對于DELETE語句,只有OLD是合法的而對于UPDATE語句,NEW和OLD都是合法的1.INSERT觸發(fā)器【例8-30】在讀者表reader中創(chuàng)建一個觸發(fā)器t_readeradd,每插入一條記錄,就顯示所插入記錄中的姓名name值。①創(chuàng)建觸發(fā)器t_readeradd,將新插入的記錄的name值賦給用戶變量@str。mysql>CREATETRIGGERt_readeraddAFTERINSERT
->ONreaderFOREACHROWSET@str=NEW.name;②在reader表中插入一條新記錄。mysql>INSERTINTOreaderVALUES('1106240199',2,'趙紅',NULL,NULL);③查詢用戶變量@str,驗證觸發(fā)器的執(zhí)行結(jié)果。mysql>SELECT@str;2.UPDATE觸發(fā)器【例8-31】在讀者表reader中創(chuàng)建一個觸發(fā)器t_name,在修改一條讀者記錄前,要保證外籍讀者的姓名name字段內(nèi)容是大寫字母。①創(chuàng)建觸發(fā)器t_name,修改reader表中的一條記錄前,將name字段內(nèi)容轉(zhuǎn)換為大寫字母。mysql>CREATETRIGGERt_nameBEFOREUPDATE
->ONreaderFOREACHROWSETNEW.name=UPPER(NEW.name);②將reader表中讀者編號readre_id為1106240199的記錄的姓名修改為mary。mysql>UPDATEreaderSETname='mary'WHEREreader_id='1106240199';③查詢reader表中該記錄的修改情況,驗證觸發(fā)器的執(zhí)行結(jié)果。mysql>SELECTreader_id,type_id,nameFROMreaderWHEREreader_id='1106240199';3.DELETE觸發(fā)器【例8-32】在讀者表reader中創(chuàng)建一個觸發(fā)器t_readerdel,在刪除一條讀者記錄前,將所刪除的記錄保存到數(shù)據(jù)表reader_archive中。reader_archive表的結(jié)構(gòu)與reader表基本相同,但增加了具有自增屬性的字段id,且該字段是主鍵。①創(chuàng)建reader_archive表。mysql>CREATETABLEreader_archive
->(idINTPRIMARYKEYAUTO_INCREMENT,
->reader_idCHAR(10),
->type_idTINYINT,
->nameVARCHAR(50),
->genderCHAR(1),
->deptVARCHAR(50)
);
->②創(chuàng)建觸發(fā)器t_readerdel,在刪除一條讀者記錄前,將該記錄插入reader_archive表中。mysql>CREATETRIGGERt_readerdelBEFOREDELETE
->ONreaderFOREACHROW
->INSERTINTOreader_archive(reader_id,type_id,name,gender,dept)
->VALUES(OLD.reader_id,OLD.type_id,OLD.name,OLD.gender,OLD.dept);③刪除reader表中讀者編號reader_id為1106240199的讀者。mysql>DELETEFROMreaderWHEREreader_id='1106240199';④查詢reader_archive表的記錄,以驗證觸發(fā)器的執(zhí)行結(jié)果。mysql>SELECT*FROMreader_archive;8.4.3查看觸發(fā)器查看觸發(fā)器是指查看數(shù)據(jù)庫中已經(jīng)存在的觸發(fā)器,可以通過以下兩種方法實現(xiàn)。(1)使用SHOWTRIGGERS語句查看觸發(fā)器SHOWTRIGGERS語句用于查看當前數(shù)據(jù)庫中的所有觸發(fā)器,其語法格式如下。SHOWTRIGGERS;(2)在數(shù)據(jù)表triggers中查看觸發(fā)器在MySQL中,所有觸發(fā)器的定義都保存在數(shù)據(jù)庫information_schema的triggers表中,可以使用SELECT語句查看觸發(fā)器的詳細信息。查看所有觸發(fā)器的詳細信息,語法格式如下。SELECT*FROMinformation_schema.triggers;查看指定觸發(fā)器的詳細信息,語法格式如下。SELECT*FROMinformation_schema.triggersWHEREtrigger_name='觸發(fā)器名稱';例如,使用SELECT語句查看觸發(fā)器t_bookadd的詳細信息的語句如下。SELECT*FROMinformation_schema.triggersWHEREtrigger_name='t_bookadd';8.4.4刪除觸發(fā)器可以使用DROP語句刪除觸發(fā)器,其語法格式如下。DROPTRIGGER[IFEXISTS][數(shù)據(jù)庫名.]觸發(fā)器名;如果沒有指定數(shù)據(jù)庫的名稱,則默認操作的是當前數(shù)據(jù)庫。當刪除一張表時,該表中的觸發(fā)器同時被自動刪除?!纠?-33】刪除觸發(fā)器t_readerdel。mysql>DROPTRIGGERt_readerdel;任務(wù)8.5事件事件是在指定時刻才被執(zhí)行的過程式數(shù)據(jù)庫對象,也稱為臨時性觸發(fā)器。一個事件可以在事件調(diào)度器的管理下周期性地啟動。事件和觸發(fā)器的區(qū)別在于觸發(fā)器是被某個操作(如插入、修改、刪除等)觸發(fā)的,而事件是在特定的時間被觸發(fā)的。事件調(diào)度器必須在開啟狀態(tài)下才可以使用。創(chuàng)建事件前可以用“SELECT@@EVENT_SCHEDULER;”命令語句查看事件調(diào)度器的狀態(tài),ON表示開啟,OFF表示關(guān)閉。如果事件調(diào)度器處于關(guān)閉狀態(tài),可以使用“SETGLOBALEVENT_SCHEDULER=1;”命令語句將其開啟。8.5.1創(chuàng)建事件CREATEEVENT語句創(chuàng)建事件的語法格式:CREATEEVENT事件名
ONSCHEDULE時間調(diào)度
DO觸發(fā)事件;說明如下。(1)事件名:用戶自定義的事件名稱。(2)時間調(diào)度:指定事件在何時發(fā)生或每隔多久發(fā)生一次,有以下兩種取值方式。①AT時間點[+INTERVAL時間間隔]:表示事件在指定的時間點發(fā)生,如果有時間間隔,則表示事件在指定間隔的時間后發(fā)生。②EVERY時間間隔[STARTS時間點[+INTERVAL時間間隔]][END時間點[+INTERVAL時間間隔]]:表示事件在指定的時間區(qū)間內(nèi),每間隔多長時間發(fā)生一次。其中,STARTS指定開始時間,END指定結(jié)束時間。(3)觸發(fā)事件:包含事件被激活時要執(zhí)行的語句??梢允且粭lSQL語句,也可以是一個BEGIN…END語句塊或者一個存儲過程。【例8-34】創(chuàng)建立即執(zhí)行的事件e_createtb,完成創(chuàng)建數(shù)據(jù)表timetb的操作。字段名稱數(shù)據(jù)類型是否允許空值鍵說明noBIGINT否主鍵(自增)序號timefdTIME是
時間mysql>CREATEEVENTe_createtb
->ONSCHEDULEATNOW()
->DO
->CREATETABLEtimetb
->(
->noBIGINTPRIMARYKEYAUTO_INCREMENT,
->timefdTIME
->);【例8-35】創(chuàng)建事件e_instb,每隔10s向數(shù)據(jù)表timetb中插入一條當前時間數(shù)據(jù)。mysql>CREATEEVENTe_instb
->ONSCHEDULEEVERY10SECOND
->DOINSERTINTOtimetb(timefd)VALUES(CURTIME());8.5.2管理事件1.修改事件使用ALTEREVENT語句可以修改事件的時間調(diào)度、事件名和觸發(fā)事件,其語法格式如下。ALTEREVENT事件名[ONSCHEDULE時間調(diào)度][RENAMETO新事件名][DO觸發(fā)事件];【例8-36】將事件e_instb的名稱改為e_instimetb。mysql>ALTEREVENTe_instb
->RENAMETOe_instimetb;2.關(guān)閉事件可以使用ALTEREVENT語句臨時關(guān)閉某個事件,其語法格式如下。ALTEREVENT事件名DISABLE;【例8-37】關(guān)閉事件e_instimetb。mysql>ALTEREVENTe_instimetbDISABLE;3.啟動事件可以使用ALTEREVENT語句再次啟動某個事件,其語法格式如下。ALTEREVENT事件名ENABLE;【例8-38】再次啟動事件e_instimetb。mysql>ALTEREVENTe_instimetbENABLE;8.5.3刪除事件DROPEVENT語句刪除已經(jīng)創(chuàng)建的事件,其語法格式如下。DROPEVENT[IFEXISTS]事件名;【例8-39】刪除事件e_instimetb。mysql>DROPEVENTe_instimetb;【項目案例】圖書館借還書管理數(shù)據(jù)庫的編程1.系統(tǒng)內(nèi)置函數(shù)的應(yīng)用(1)查詢2020年出版的圖書的圖書編號、書名和圖書出版信息。mysql>SELECTbook_idAS圖書編號,titleAS書名,CONCAT(publisher,',',YEAR(pubdate),'年',MONTH(pubdate),'月出版')AS圖書出版信息
->FROMbookWHEREYEAR(pubdate)=2020;(2)查詢圖書表book中2020年及之后出版的圖書的圖書編號、書名、第一作者和出版單位(用“媒體集團”替換“出版社”)。mysql>SELECTbook_idAS圖書編號,titleAS書名,authorAS第一作者,REPLACE(publisher,'出版社','媒體集團')AS出版單位
->FROMbookWHEREYEAR(pubdate)>=2
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年陜西郵政校園招聘(含榆林崗)備考題庫及答案詳解一套
- 2025年深圳證券交易所人才引進備考題庫帶答案詳解
- 南昌大學(xué)附屬眼科醫(yī)院2026年高層次人才招聘9人備考題庫完整參考答案詳解
- 統(tǒng)計師初級統(tǒng)計基礎(chǔ)題目及答案
- 福建華南女子職業(yè)學(xué)院2025年秋季人才招聘備考題庫含答案詳解
- 2025年重慶氣體壓縮機廠有限責任公司招聘備考題庫帶答案詳解
- 2025年上海外國語大學(xué)國際教育學(xué)院招聘備考題庫完整參考答案詳解
- 2025年共青團中央所屬單位招聘66人備考題庫完整答案詳解
- 2025年云南省紅河州和信公證處招聘備考題庫附答案詳解
- 班級線上頒獎?wù)n件
- 2025發(fā)電企業(yè)投資管理信息系統(tǒng)
- 水土保持與灌溉水質(zhì)監(jiān)測方案
- 2025年建筑設(shè)計師《建筑設(shè)計原理》備考題庫及答案解析
- 《醫(yī)療機構(gòu)工作人員廉潔從業(yè)九項準則實施細則(試行)》解讀學(xué)習(xí)
- 護理質(zhì)量敏感指標計算及數(shù)據(jù)采集
- 勞動仲裁培訓(xùn)授課
- 技術(shù)研發(fā)團隊介紹
- 非營利組織財務(wù)管理制度及規(guī)范
- 全國新高考:生物重點基礎(chǔ)知識點歸納
- 青海某公司二期15萬噸電解鋁工程施工組織設(shè)計
- 2025年6月重慶普通高中學(xué)業(yè)水平選擇性考試英語試題(原卷)含答案
評論
0/150
提交評論