【正文】
成對比,可以提高執(zhí)行效率存儲過程是SQL語言在應(yīng)用程序和數(shù)據(jù)庫之間的主要編程接口,其存在形式有兩種,一是在客戶端存儲代碼,另一種是將SQL語言存儲在數(shù)據(jù)庫服務(wù)器端,由應(yīng)用程序調(diào)用這些語言。存儲過程可以:接受輸入?yún)?shù)并以輸出參數(shù)的形式將多個數(shù)值返回、包含執(zhí)行數(shù)據(jù)庫的語句、將查詢語句執(zhí)行結(jié)果返回到客戶端,其好處有,允許模塊化程序設(shè)計、改善性能、減少網(wǎng)絡(luò)流量、可作為安全機制使用??梢詳U展數(shù)據(jù)操作的功能,期中包括,變量函數(shù)和表值函數(shù),標量函數(shù)返回單個數(shù)據(jù)值,表值函數(shù)返回一個表,表值函數(shù)又分為內(nèi)聯(lián)表值函數(shù)和語句表值函數(shù)。二. 索引本章上機練習(xí)均利用MySimpleDB數(shù)據(jù)庫實現(xiàn)。1. 請為下列查詢設(shè)計一個最合適的索引,并查看建立索引前后該語句的執(zhí)行計劃,比較執(zhí)行效率。30039。35039。建立索引之前: 建立索引后:2. 表包含的列有:ProductID(int)、ReviewerName(nvarchar(50) )和 Comments(nvarchar (3850))。SELECT Comments,ReviewerNameFROM WHERE ProductID = 937 and ReviewerName like 39。create index pidx on (ProductID) include(Comments,ReviewerName) WHERE ProductID = 937建立索引前: 建立索引后:3.(PostalCode)和四個非鍵列(AddressLineAddressLineCity、StateProvinceID)的包含列索引。SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCodeFROM WHERE PostalCode BETWEEN N39。 and N39。CREATE NONCLUSTERED INDEX IX_Address_PostalCode ON (PostalCode) INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID)。 SELECT ProductID, SUM() AS QtySold FROM soh JOIN sod ON = WHERE = 39。 AND 39。GROUP BY 為盡可能提高該類查詢的執(zhí)行效率,并簡單說明理由。索引使該查詢速度變快了三.存儲過程和觸發(fā)器如無特別說明,以下各題均利用第6章建立的Students數(shù)據(jù)庫以及Student、Course和SC表實現(xiàn)。(1) 查詢每個學(xué)生的修課總學(xué)分,要求列出學(xué)生學(xué)號及總學(xué)分。執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值,查看執(zhí)行結(jié)果。計算機系39。信息管理系39。通信工程系39。CREATE PROCEDURE SELECT_STUDENT2t_Dept nvarchar(20),total_man int OUTPUTASSELECT total_man = COUNT(*) FROM studentWHERE Dept=t_Dept AND Sex=39。PRINT total_man DECLARE RE_man int 聲明變量EXEC SELECT_STUDENT2 39。,RE_man OUTPUTPRINT RE_man(4) 查詢指定學(xué)生(姓名)在指定學(xué)期的選課門數(shù)和考試平均成績,要求姓名和學(xué)期為輸入?yún)?shù),選課門數(shù)和平均成績用輸出參數(shù)返回,平均成績保留到小時點后2位。如果指定學(xué)生不存在,則返回代碼1;如果指定的學(xué)生沒有選課,則返回代碼2;如果指定學(xué)生有選課,則返回代碼0,并用輸出參數(shù)返回該學(xué)生的選課門數(shù)。學(xué)號為輸入?yún)?shù)。該學(xué)生沒有選課39。沒有指定學(xué)生39。輸入?yún)?shù)為:課程號和修改后的開課學(xué)期。課程號為C100、課程名為操作系統(tǒng)、學(xué)分為開課學(xué)期為4,開課學(xué)期的默認值為3。 create procedure ti_8o char(6),ame varchar(20),credit tinyint,sem tinyintas if credit between 1 and 10 insert into Course values(o,ame,credit,sem) else print 39。2. 創(chuàng)建滿足下述要求的DML觸發(fā)器(前觸發(fā)器、后觸發(fā)器均可),并驗證觸發(fā)器執(zhí)行情況。計算機系39。信息管理系39。數(shù)學(xué)系39。通信工程系39。create TRIGGER eve_total_creditON course AFTER INSERTASdeclare t int SELECT t=SUM()FROM Course c JOIN INSERTED I ON = IF (t20 or t30)BEGIN PRINT 39。ROLLBACKEND插入正常的數(shù)據(jù):插入超限的數(shù)據(jù)提醒:(3) 限制每個學(xué)生每學(xué)期選課門數(shù)不能超過6門(設(shè)只針對單行插入操作)。本學(xué)期選課門數(shù)不能超過6門!39。create trigger tri_delCnoon course after deleteas if exists (select * from deleted d where in(select Cno from sc) )rollbackgo(5) ,編寫實現(xiàn)如下要求的觸發(fā)器:每當在Teachers表中修改了某個教師的職稱時,自動維護Depts表中職稱人數(shù)統(tǒng)計的一致性。然后編寫實現(xiàn)如下要求的觸發(fā)器:每當在Teachers表中插入一行數(shù)據(jù)或者是刪除一行數(shù)據(jù)時,自動維護Depts表中的相關(guān)信息。3. 創(chuàng)建滿足下述要求的用戶自定義標量函數(shù)。并寫出利用此函數(shù)查詢0811101學(xué)生的姓名、所修的課程名、課程學(xué)分、考試成績以及拿到的總學(xué)分的SQL語句。 CREATE FUNC