




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章編程基礎(chǔ)和自定義函數(shù)《MySQL數(shù)據(jù)庫應(yīng)用教程》劉瑞新主編配套資源目錄第8章編程基礎(chǔ)和自定義函數(shù)8.1編程基礎(chǔ)8.2運算符和表達式8.3系統(tǒng)函數(shù)8.4自定義函數(shù)8.5控制流程語句8.1.1SQL語言概述1)數(shù)據(jù)定義語言(DataDefinitionlanguage,DDL)2)數(shù)據(jù)操縱語言(DataManipulationLanguage,DML)3)數(shù)據(jù)控制語言(DataControlLanguage,DCL)8.1編程基礎(chǔ)8.1.2標識符標識符用來命名一些對象,如數(shù)據(jù)庫、表、列、變量等,以便在程序中的其他地方引用。8.1編程基礎(chǔ)8.1.3常量字符串常量【例8-1】SELECT語句輸出3個字符串。SELECT'MySQL','I\'mastudent.'ASStudent,"I'mastudent."st;8.1編程基礎(chǔ)2.數(shù)值常量(1)整型常量(2)實數(shù)常量【例8-2】SELECT輸出數(shù)據(jù)常量。SELECT20,+123,-21368,1.356,-0.3,+12.356,0.12E-3,+326E+5,-358E-21;8.1編程基礎(chǔ)3.日期時間常量'2022-09-23'、'2022/09/23'、'23.09.2022'、'09/23/2022''September23,2022'、'Sept23,2022'。'20220923'、"20220923"。'18:46:08'、'03:56PM'。'2022-09-2318:46:08'、'2022-09-2308:01:03.420'。'2022-09-32'是錯誤的日期常量。8.1編程基礎(chǔ)4.布爾值布爾值只包含兩個值:True和False,在代碼中,也可以用0表示False,非0表示True。【例8-3】SELECT語句輸出True和False。SELECTTrue,False,10>5,10<5,TrueORFalse,10>5ANDFalse,0AND13;
8.1編程基礎(chǔ)5.NULL值NULL值可適用于各種列的類型,它通常表示“未知”、“值不確定”、“沒有值”等含義。8.1編程基礎(chǔ)8.1.4變量1.系統(tǒng)變量(1)查看系統(tǒng)變量語法格式為:SHOW[GLOBAL|SESSION]VARIABLES[LIKE'匹配模式'|WHERE表達式];8.1編程基礎(chǔ)【例8-4】查看MySQL中所有的全局系統(tǒng)變量。SHOWGLOBALVARIABLES;8.1編程基礎(chǔ)【例8-5】查看當前會話相關(guān)的所有會話變量以及全局變量。SHOWSESSIONVARIABLES;【例8-6】查看指定的變量character_set_client,該變量既是全局變量,又是會話變量。SHOWSESSIONVARIABLESLIKE'character_set_client';SHOWGLOBALVARIABLESLIKE'character_set_client';8.1編程基礎(chǔ)【例8-7】查看變量名以character開頭的會話變量,即MySQL采用的字符集。SHOWSESSIONVARIABLESLIKE'character%';8.1編程基礎(chǔ)(2)查詢系統(tǒng)變量SELECT系統(tǒng)變量名1[,系統(tǒng)變量名2,…];【例8-8】顯示系統(tǒng)變量的值。SELECT@@VERSION,@@HOSTNAME,CURRENT_USER,@@BASEDIR,@@DATADIR;8.1編程基礎(chǔ)【例8-9】顯示系統(tǒng)變量當前日期、時間、時間戳。SELECTCURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP;8.1編程基礎(chǔ)(3)設(shè)置系統(tǒng)變量SETGLOBAL系統(tǒng)變量名=值;SETSESSION會話變量名=值;SET@@會話變量名=值;【例8-10】顯示和修改會話變量sort_buffer_size的值。SELECT@@sort_buffer_size;SET@@sort_buffer_size=50000;SELECT@@sort_buffer_size;8.1編程基礎(chǔ)2.用戶會話變量(1)定義用戶會話變量1)方法一:SET@user_variable1[:]=expression1[,@user_variable2[:]=expression2,…];輸出用戶對話變量:SELECT@user_variable1[,@user_variable2,...];8.1編程基礎(chǔ)【例8-11】在studentinfo數(shù)據(jù)庫中,創(chuàng)建用戶會話變量@user_name和@age,并為其賦值,然后使用SELECT語句輸出變量的值。SET@user_name='Jack',@age=18;SELECT@user_name,@age;
SET@age=@age+1;SELECT@user_name,@age;
8.1編程基礎(chǔ)2)方法二:SELECT@user_variable1:=expression1[,@user_variable2:=expression2,…];8.1編程基礎(chǔ)【例8-12】創(chuàng)建用戶會話變量@aa和@bb,分別用“:=”與“=”運算符,解釋其區(qū)別。SELECT@aa:=100;
SELECT@aa;
SELECT@bb;
SELECT@bb=100,@aa=100; 8.1編程基礎(chǔ)3)方法三:SELECTexpression1[,expression2,…]INTO@user_variable1[,@user_variable2,…];8.1編程基礎(chǔ)【例8-13】創(chuàng)建用戶會話變量@xx、@name并賦值,然后使用SELECT語句輸出該變量的值。SELECT100,'Jack'INTO@xx,@name;SELECT@xx,@name;
8.1編程基礎(chǔ)(2)用戶會話變量在SQL語句中的使用【例8-14】在studentinfo數(shù)據(jù)庫中,使用聚合函數(shù)計算學生人數(shù),并賦值給@StCount變量。1)方法一:USEstudentinfo;SET@StCount=(SELECTCOUNT(*)FROMstudent);SELECT@StCount;
8.1編程基礎(chǔ)2)方法二:SELECT@StCount:=(SELECTCOUNT(*)FROMstudent);
更改顯示的列名。SELECT@StCount:=(SELECTCOUNT(*)FROMstudent)AS人數(shù);8.1編程基礎(chǔ)3)方法三:SELECT@StCount:=COUNT(*)FROMstudent;
4)方法四:SELECTCOUNT(*)INTO@StCountFROMstudent;SELECT@StCountAS人數(shù);
8.1編程基礎(chǔ)5)方法五:SELECTCOUNT(*)FROMstudentINTO@StCount;SELECT@StCount;8.1編程基礎(chǔ)【例8-15】在studentinfo數(shù)據(jù)庫中,先把要查找的學號賦值給用戶會話變量,然后用該用戶會話變量與列作比較。
USEstudentinfo;SET@StudentID='202210010123';SELECT*FROMstudentWHEREStudentID=@StudentID;
8.1編程基礎(chǔ)【例8-16】把學號為“202210010123”的學生的所在班級保存到一個用戶會話變量中,然后查詢這個班級的所有學生名單。SET@StudentID='202210010123';SET@ClassID=(SELECTClassIDFROMstudentWHEREStudentID=@StudentID);SELECT*FROMstudentWHEREClassID=@ClassID;8.1編程基礎(chǔ)【例8-17】利用SELECT語句把表中的一個數(shù)據(jù)賦值給用戶會話變量。SELECT@StName:=StudentNameFROMstudentLIMIT2,3;
SELECT@StName;8.1編程基礎(chǔ)(3)用戶會話變量的特點3.局部變量8.1編程基礎(chǔ)8.1.5注釋1.單行注釋#注釋內(nèi)容--注釋內(nèi)容2.多行注釋/*注釋內(nèi)容注釋內(nèi)容*/8.1編程基礎(chǔ)8.1.6BEGIN…END語句塊[label]BEGIN[statement1;][statement2;][…]END[label];8.1編程基礎(chǔ)8.1.7更改語句結(jié)束符DELIMITER語句DELIMITER[結(jié)束符][;]【例8-18】在NavicatforMySQL命令列界面或MySQL8.0CommandLineClient,將MySQL語句的結(jié)束符修改為“$$”,最后再恢復(fù)為默認的“;”。將MySQL語句的結(jié)束符修改為“$$”的SQL語句如下:USEstudentinfo;DELIMITER$$SELECT*FROMclassWHEREClassNum>20$$恢復(fù)為默認“;”的SQL語句如下:DELIMITER;SELECT*FROMclassWHEREClassNum>30;8.1編程基礎(chǔ)8.2.1表達式的概念1.按照表達式值的類型分類2.按照值的形式分類(1)標量表達式(2)行表達式(3)表表達式8.2運算符和表達式3.按照表達式的形式分類4.按照運算符的類型分類8.2運算符和表達式8.2.2算術(shù)運算符和算術(shù)表達式8.2運算符和表達式8.2.3比較運算符和比較表達式8.2運算符和表達式1.等于運算(=)【例8-19】使用相等(=)判斷。SELECT2=2,'2'=2,3.0=3,'Ab'='aB',(2+3)=(2*3),NULL=null,0=NULL;8.2運算符和表達式2.安全等于運算符(<=>)【例8-20】使用<=>進行相等的判斷。SELECT2<=>2,'2'<=>2,3.0<=>3,'Ab'<=>'aB',(2+3)<=>(2*3),NULL<=>null,0<=>NULL;8.2運算符和表達式3.BETWEEN…AND…【例8-21】使用BETWEEN…AND…查詢班級人數(shù)在20到30之間的班級。SELECT*FROMclassWHEREClassNumBETWEEN20AND30;8.2運算符和表達式8.2.4邏輯運算符和邏輯表達式8.2運算符和表達式1.NOT或者!【例8-22】使用NOT和!進行邏輯判斷。SELECTNOT1+2,!1+2,NOT-2+1,!-2+1,NOTNULL,!NULL,NOT(1+2),!(1+2);8.2運算符和表達式2.AND或者&&【例8-23】使用與運算符AND和&&進行邏輯判斷。SELECT1AND-1,1&&-1,1AND0,1&&0,0ANDNULL,1ANDNULL;8.2運算符和表達式3.OR或者||【例8-24】使用或運算符OR和||進行邏輯判斷。SELECT1OR-1OR0,1OR2,1ORNULL,0ORNULL,NULLORNULL;
SELECT1||-1||0,1||2,1||NULL,0||NULL,NULL||NULL;8.2運算符和表達式4.ХOR【例8-25】使用異或運算符XOR進行邏輯判斷。SELECT1XOR1,0XOR0,1XOR0,1XORNULL,1XOR1XOR1;8.2運算符和表達式8.3.1數(shù)學函數(shù)8.3系統(tǒng)函數(shù)【例8-26】數(shù)學函數(shù)的使用示例。SELECTPI(),TRUNCATE(3.28,1),ROUND(32.127,2),RAND(),SQRT(16),FLOOR(-5.97);
8.3系統(tǒng)函數(shù)【例8-27】使用隨機函數(shù)RAND()對查詢結(jié)果集隨機排序。SELECT*FROMschool.studentORDERBYRAND();8.3系統(tǒng)函數(shù)【例8-28】二進制、十六進制函數(shù)的調(diào)用。SELECTBIN(128),OCT(128),HEX(128);8.3系統(tǒng)函數(shù)8.3.2字符串函數(shù)8.3系統(tǒng)函數(shù)1.獲取字符串的長度和字節(jié)數(shù)【例8-29】字符串函數(shù)使用示例。SELECTCHAR_LENGTH('MySQL數(shù)據(jù)庫系統(tǒng)'),LENGTH('MySQL數(shù)據(jù)庫系統(tǒng)');8.3系統(tǒng)函數(shù)2.比較兩個字符串的大小【例8-30】比較兩個字符串。SELECTSTRCMP('ABC','ABB'),STRCMP('ABC','abc'),STRCMP('ABC','ABD');8.3系統(tǒng)函數(shù)3.連接字符串【例8-31】把3個字符串連接成為一個字符串。SELECTCONCAT('ABC','abc123','2022-05-01');8.3系統(tǒng)函數(shù)8.3.3日期和時間函數(shù)8.3系統(tǒng)函數(shù)1.時間轉(zhuǎn)字符串【例8-32】時間轉(zhuǎn)字符串示例。SELECTDATE_FORMAT(NOW(),'%Y-%m-%d%H:%i:%s');8.3系統(tǒng)函數(shù)2.字符串轉(zhuǎn)日期時間【例8-33】字符串轉(zhuǎn)日期時間示例。SELECTSTR_TO_DATE('2022-09-2918:57:32','%Y-%m-%d%H:%i:%s');8.3系統(tǒng)函數(shù)3.字符串轉(zhuǎn)時間戳【例8-34】把當前日期時間轉(zhuǎn)時間戳示例,把字符串轉(zhuǎn)時間戳示例。SELECTUNIX_TIMESTAMP(NOW()),UNIX_TIMESTAMP('2022-09-29');8.3系統(tǒng)函數(shù)4.時間戳轉(zhuǎn)字符串【例8-35】把時間戳轉(zhuǎn)字符串示例。SELECTFROM_UNIXTIME(1664380800,'%Y-%m-%d');8.3系統(tǒng)函數(shù)5.獲取當前服務(wù)器的時間【例8-36】獲取服務(wù)器的當前日期、時間。SELECTNOW(),LOCALTIME(),CURRENT_TIMESTAMP(),CURDATE(),CURTIME(),YEAR(NOW());8.3系統(tǒng)函數(shù)6.SLEEP()延時函數(shù)例如,執(zhí)行SELECT時間為3秒:SELECTSLEEP(3);【例8-37】SLEEP()函數(shù)能夠放在SELECT子句中,讓每行記錄都休眠指定的時間。SELECTSLEEP(2),StudentID,StudentNameFROMstudent;假設(shè)表中有8行記錄,整個語句執(zhí)行的時間為2*8=16秒。如果過程中不允許有輸出,可以采用如下SQL語句:DECLAREdelayINTDEFAULT0;SELECTSLEEP(3)INTOdelay;8.3系統(tǒng)函數(shù)8.3.4數(shù)據(jù)類型轉(zhuǎn)換函數(shù)1.CAST()函數(shù)CAST(valueASdatatype)【例8-38】把數(shù)值120、23.58轉(zhuǎn)換為字符串,'25'、'12.893'轉(zhuǎn)換為數(shù)值,把'2022-09-13'轉(zhuǎn)換為日期。SELECTCAST(120ASCHAR),CAST(23.58ASCHAR(10)),CAST('25'ASFLOAT),CAST('12.893'ASDECIMAL(10,4)),CAST('2022-09-13'ASDATE);8.3系統(tǒng)函數(shù)2.CONVERT()函數(shù)CONVERT(value,type)【例8-39】把數(shù)值120、23.58轉(zhuǎn)換為字符串,'25'、'12.893'轉(zhuǎn)換為數(shù)值,把'2022-09-13'轉(zhuǎn)換為日期。SELECTCONVERT(21,CHAR),CONVERT(23.58,CHAR(10)),CONVERT('12.83',DECIMAL(10,3)),CONVERT('2022-09-13',DATE),CONVERT("13:32:56",TIME);8.3系統(tǒng)函數(shù)8.3.5系統(tǒng)信息函數(shù)8.3系統(tǒng)函數(shù)【例8-40】系統(tǒng)信息函數(shù)應(yīng)用示例。SELECTVERSION(),@@VERSION,CURRENT_USER(),USER(),SYSTEM_USER(),DATABASE();8.3系統(tǒng)函數(shù)8.3.6加密函數(shù)8.3系統(tǒng)函數(shù)【例8-41】加密解密函數(shù)應(yīng)用示例。SELECTAES_ENCRYPT('123456','OK12'),AES_DECRYPT(AES_ENCRYPT('123456','OK12'),'OK12');8.3系統(tǒng)函數(shù)8.3.7條件判斷函數(shù)8.3系統(tǒng)函數(shù)1.IF()函數(shù)【例8-42】IF()函數(shù)示例。SET@score1=90;SET@score2=55;SELECTIF(@score1>=60,'及格','不及格'),IF(@score2>=60,'及格','不及格');8.3系統(tǒng)函數(shù)【例8-43】從selectcourse表中查詢CourseID前3位是630的課程成績,當Score>=60時顯示Pass,否則顯示Notpassed。SELECTStudentID,CourseID,Score,IF(Score>=60,'Pass','Notpassed')FROMselectcourseWHERESUBSTR(CourseID,1,3)='630';8.3系統(tǒng)函數(shù)2.IFNULL()函數(shù)【例8-44】IFNULL()函數(shù)示例。SET@score3=60;SELECTIFNULL(@score3,'沒有成績'),IFNULL(@score4,'沒有成績');8.3系統(tǒng)函數(shù)3.CASE函數(shù)CASEWHENsearch_condition1THENstatement_list1;[WHENsearch_condition2THENstatement_list2;]…[ELSEstatement_list3;]END[CASE];8.3系統(tǒng)函數(shù)【例8-45】查詢成績表selectcourse,輸出學號、課程編號、成績和成績等級。SELECTStudentIDAS學號,CourseIDAS課程號,CASEWHENScore>=90THEN'優(yōu)秀'WHENScore>=80THEN'良好'WHENScore>=70THEN'中等'WHENScore>=60THEN'及格'ELSE'不及格'ENDAS成績等級,ScoreAS成績
FROMselectcourse;8.3系統(tǒng)函數(shù)8.4.1自定義函數(shù)的概念8.4.2創(chuàng)建自定義函數(shù)自定義函數(shù)必須創(chuàng)建到某個數(shù)據(jù)庫中,所以在先打開相應(yīng)的數(shù)據(jù)庫。創(chuàng)建自定義函數(shù)的基本語法格式為:CREATEFUNCTIONfunc_name([parameter1type1[,parameter2type2,…]])RETURNStype[characteristic…]BEGINfunction_body_statements;RETURNvalues;END;8.4自定義函數(shù)characteristic是指定函數(shù)的特性參數(shù):LANGUAGESQL|[NOT]DETERMINISTIC|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENT'string'8.4自定義函數(shù)【例8-46】在studentinfo數(shù)據(jù)庫中,創(chuàng)建計算長方形面積的函數(shù),給定長、寬,返回面積。CREATEFUNCTIONfu_rectangle_area(lengthFLOAT,widthFLOAT)RETURNSFLOATDETERMINISTICBEGINRETURNlength*width;END;8.4自定義函數(shù)【例8-47】在studentinfo數(shù)據(jù)庫中,創(chuàng)建函數(shù)fu_getStudentName(),給定學號,返回該學生的姓名。CREATEFUNCTIONfu_getStudentName(stuIDCHAR(12))RETURNSVARCHAR(20)DETERMINISTICBEGINRETURN(SELECTStudentNameFROMstudentWHEREStudentID=stuID);END;8.4自定義函數(shù)8.4.3調(diào)用自定義函數(shù)func_name([parameter1[,parameter2,…]])【例8-48】在studentinfo數(shù)據(jù)庫中,分別調(diào)用fu_rectangle_area()函數(shù)和fu_getStudentName()函數(shù)。1)計算長和寬分別為20和30的矩形面積,SQL語句和運行結(jié)果如下:SELECTfu_rectangle_area(20,30);8.4自定義函數(shù)2)調(diào)用fu_getStudentName()函數(shù),查詢學號為202260010306的學生姓名。SELECTfu_getStudentName('202260010306');SET@ID='202260010306';SELECTfu_getStudentName(@ID);8.4自定義函數(shù)8.4.4管理自定義函數(shù)1.查看函數(shù)1)查看所有的函數(shù):SHOWFUNCTIONSTATUS;SHOWFUNCTIONSTATUSLIKE'模式';例如,在studentinfo數(shù)據(jù)庫中,顯示函數(shù)名開頭是fu的函數(shù)名,SQL語句如下:SHOWFUNCTIONSTATUSLIKE'fu%';8.4自定義函數(shù)2)查看指定的函數(shù)名:SHOWCREATEFUNCTIONfunc_name;例如,在studentinfo數(shù)據(jù)庫中,查看fu_rectangle_area()函數(shù)的詳細信息:SHOWCREATEFUNCTIONfu_rectangle_area;8.4自定義函數(shù)3)使用information_schema:SELECT*FROMinformation_schema.ROUTINESWHEREroutine_name='函數(shù)名';例如,查看fu_rectangle_area()函數(shù)的信息,SQL語句如下:SELECT*FROMinformation_schema.ROUTINESWHEREroutine_name='fu_rectangle_area';8.4自定義函數(shù)2.修改自定義函數(shù)ALTERFUNCTIONfunc_name[characteristic…]【例8-49】修改存儲函數(shù)fu_getStudentName()的定義,將讀/寫權(quán)限改為MODIFIESSQLDATA,并指明調(diào)用者可以執(zhí)行。ALTERFUNCTIONfu_getStudentNameMODIFIESSQLDATASQLSECURITYINVOKER;8.4自定義函數(shù)3.刪除自定義函數(shù)DROPFUNCTION[IFEXISTS]func_name;【例8-50】查看studentinfo數(shù)據(jù)庫中的函數(shù),查看fu_getStudentName()函數(shù)的具體信息,然后刪除該函數(shù))。SHOWFUNCTIONSTATUS;SHOWCREATEFUNCTIONfu_getStudentName;DROPFUNCTIONIFEXISTSfu_getStudentName;8.4自定義函數(shù)4.使用NavicatforMySQL管理自定義函數(shù)8.4自定義函數(shù)8.5.1局部變量1.局部變量的定義DECLAREvar_name1[,var_name2,…]type[DEFAULTvalue];8.5控制流程語句【例8-51】在studentinfo數(shù)據(jù)庫中,在函數(shù)中定義局部變量。1)定義局部變量的語句要寫在過程的BEGIN...END塊內(nèi):DROPFUNCTIONIFEXISTSfu_temp1;CREATEFUNCTIONfu_temp1() RETURNSCHAR(12)DETERMINISTIC BEGINDECLAREaFLOAT;DECLAREi,jINTDEFAULT0;DECLAREidCHAR(12); RETURNid; END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù),SQL語句如下:SELECTfu_temp1();8.5控制流程語句2.局部變量的賦值(1)使用SET語句SETvar_name1=expr1[,var_name2=expr2,…]【例8-52】為上例定義的局部變量賦值。在存儲過程中使用如下SQL語句:SETz=(x+y)*2,vStuNo='2022110131';8.5控制流程語句(2)使用SELECT…INTO語句SELECTcol_name1[,col_name2,...]INTOvar_name1[,var_name2,...][FROMtb_name[WHEREcondition]];8.5控制流程語句【例8-53】在成績表selectcourse中,查詢指定學號和課程號的成績。1)創(chuàng)建自定義函數(shù)的SQL語句如下:DROPFUNCTIONIFEXISTSfu_temp2;CREATEFUNCTIONfu_temp2(vStuIDCHAR(12),vCouIDCHAR(6))RETURNSINTDETERMINISTICBEGINDECLAREvStudentIDCHAR(12);DECLAREvCourseIDCHAR(6);DECLAREvScoreFLOAT;SELECTStudentID,CourseID,ScoreINTOvStudentID,vCourseID,vScoreFROMselectcourseWHEREStudentID=vStuIDANDCourseID=vCouID;
RETURN(SELECTvScore);END;8.5控制流程語句2)調(diào)用函數(shù)SET@vStuID='202260010306',@vCouID='600131';SELECTfu_temp2(@vStuID,@vCouID);
8.5控制流程語句3.局部變量的應(yīng)用場合1)場合一。2)場合二。3)場合三。4.局部變量與用戶會話變量的區(qū)別8.5控制流程語句8.5.2條件控制語句1.IF語句IFsearch_condition1THENstatement_list1;[ELSEIFsearch_condition2THENstatement_list2;]…[ELSEstatement_list3;]ENDIF;8.5控制流程語句【例8-54】在studentinfo數(shù)據(jù)庫中,創(chuàng)建函數(shù)fu_getmin,給定兩個整數(shù),輸出較小的數(shù)。1)創(chuàng)建fu_getmin()函數(shù)的SQL語句如下:DROPFUNCTIONIFEXISTSfu_getmin;CREATEFUNCTIONfu_getmin(aINT,bINT)RETURNSINTDETERMINISTICBEGINDECLAREminINT;IFa<bTHENSETmin=a;ELSESETmin=b;ENDIF;RETURNmin;END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù)fu_getmin(),SQL語句和運行結(jié)果如下。SELECTfu_getmin(3,8),fu_getmin(30,10),fu_getmin(7,7);8.5控制流程語句【例8-55】在studentinfo數(shù)據(jù)庫中,創(chuàng)建函數(shù)fu_search(),要求該函數(shù)能根據(jù)給定的學號返回學生的性別,如果沒有找到給定學號的學生,則返回“沒有該學生”。1)創(chuàng)建自定義函數(shù)的SQL語句如下:DROPFUNCTIONIFEXISTSfu_search;CREATEFUNCTIONfu_search(sidCHAR(12))RETURNSCHAR(5) DETERMINISTICBEGINDECLAREvSexCHAR(1);SELECTSexINTOvSexFROMstudentWHEREStudentID=sid;IFvSexISNULLTHEN RETURN(SELECT'沒有該學生');ELSEIFvSex='女'THENRETURN(SELECT'女');ELSERETURN(SELECT'男');ENDIF;ENDIF;END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù),SQL語句和運行結(jié)果如下。SET@id1='202210010123',@id2='202260010309',@id3='1234567890';SELECTfu_search(@id1),fu_search(@id2),fu_search(@id3);8.5控制流程語句【例8-56】創(chuàng)建函數(shù)fu_getscore,給定學號和課程號,查詢該學生指定課程號的成績,如果成績合格,則返回1;否則返回0。1)創(chuàng)建自定義函數(shù)的SQL語句如下:DROPFUNCTIONIFEXISTSfu_getscore;CREATEFUNCTIONfu_getscore(vStIDCHAR(12),vCoIDCHAR(6))RETURNSINTDETERMINISTICBEGINDECLAREvScore,flagINT;SELECTScoreINTOvScoreFROMselectcourseWHEREStudentID=vStIDANDCourseID=vCoID;IFvScore>=60THENSETflag=1;ELSESETflag=0;ENDIF;RETURNflag;END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù),SQL語句和運行結(jié)果如下。SET@StudentID='202240010215',@CourseID='400121',@Score=Null;SELECTfu_getscore(@StudentID,@CourseID)INTO@state;SELECT@StudentIDAS學號,@CourseIDAS課程號,@state;8.5控制流程語句2.CASE語句CASE語句的語法格式為:CASEcase_valueWHENwhen_value1THENstatement_list1;[WHENwhen_value2THENstatement_list2;]…[ELSEstatement_list3;]END[CASE];8.5控制流程語句【例8-57】創(chuàng)建函數(shù)fu_getgrade(),輸入分數(shù)成績,返回成績的等級。1)創(chuàng)建自定義函數(shù)的SQL語句如下:CREATEFUNCTIONfu_getgrade(scoreINT)RETURNSCHAR(3)NOSQLBEGINDECLAREscoreGradeCHAR(3);SETscore=FLOOR(score/10); CASEscoreWHEN10THENSETscoreGrade='優(yōu)秀';WHEN9THENSETscoreGrade='優(yōu)秀';WHEN8THENSETscoreGrade='良好';WHEN7THENSETscoreGrade='中等';WHEN6THENSETscoreGrade='及格';ELSESETscoreGrade='不及格';ENDCASE;RETURNscoreGrade;END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù),SQL語句和運行結(jié)果如下。SELECTfu_getgrade(50),fu_getgrade(60),fu_getgrade(70),fu_getgrade(80),fu_getgrade(90),fu_getgrade(100);8.5控制流程語句【例8-58】創(chuàng)建依據(jù)給定日期,獲得中文星期的函數(shù)。1)創(chuàng)建自定義函數(shù)的SQL語句如下:CREATEFUNCTIONfu_getweek(weeknoINT)RETURNSCHAR(20)NOSQLBEGINDECLAREweekCHAR(4); CASEweeknoWHEN2THENSETweek='星期一';WHEN3THENSETweek='星期二';WHEN4THENSETweek='星期三';WHEN5THENSETweek='星期四';WHEN6THENSETweek='星期五';ELSESETweek='今天休息'; ENDCASE;RETURNweek;END;8.5控制流程語句2)SELECTfu_getweek(DAYOFWEEK(NOW())),fu_getweek(DAYOFWEEK(STR_TO_DATE('2022-09-23','%Y-%m-%d')));8.5控制流程語句8.5.3循環(huán)控制語句1.WHILE語句[label:]WHILEconditionDOstatement_list;ENDWHILE[label];8.5控制流程語句【例8-59】創(chuàng)建函數(shù)fu_sum(),使用while語句求1+2+3+...+n的和。1)創(chuàng)建自定義函數(shù)的SQL語句如下:CREATEFUNCTIONfu_sum(nINT)RETURNSINTNOSQLBEGINDECLAREi,sumINTDEFAULT0;SETi=1;WHILEi<=nDOSETsum=sum+i;SETi=i+1;ENDWHILE;RETURNsum;END;8.5控制流程語句2)執(zhí)行調(diào)用函數(shù),計算前100項的和,SQL語句和運行結(jié)果如下。SELECTfu_sum(100);8.5控制流程語句【例8-60】創(chuàng)建fu_sum2()函數(shù),使該函數(shù)實現(xiàn)從1~n的偶數(shù)累加,其中add_label為循環(huán)標簽。1)CREATEFUNCTIONfu_sum2(nINT)RETURNSINT
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新版試用期勞動合同模板合同
- 土地承包合同法律文本示例
- 廠家設(shè)備租賃合同樣本集錦
- 項目合作人才服務(wù)合同
- 茶葉購銷合同模板
- 新產(chǎn)品開發(fā)項目合同協(xié)議書范本
- 保密合同-工作手機保管細則
- 度設(shè)備采購借款合同模板
- 倉儲用房租賃合同參考樣本
- 度醫(yī)療服務(wù)采購合同
- 汽車電子技術(shù)專業(yè)人才培養(yǎng)方案樣本
- 血栓風險評估及個體化干預(yù)(遺傳性易栓癥風險基因檢測)
- 血透患者的健康宣教課件
- 醫(yī)院輿情應(yīng)對處置預(yù)案
- 普通高中歷史課程標準(2022年版2023年修訂)解讀
- 第9課《呵護我們的鼻子》課件
- 《統(tǒng)計學原理賈俊平》課件
- 2024電力儲能電站鈉離子電池技術(shù)條件
- 方法驗證報告方案
- 關(guān)于企業(yè)高層管理人員職責的通知
- 消防員班長培訓(xùn)課件
評論
0/150
提交評論