這是我大三第一學期《數據庫基礎》這門課的實驗報告,總共15個實驗,我挑了幾個比較重要的放在博客上,方便查看和復習,尤其是最近SSM后端開發,希望對大家,以及將來的我有所幫助!
本文是存儲過程,通過書本和網上的參考代碼和講解,大致把存儲過程理解為一個自定義函數,在多次重復使用某一個功能的時候,可以把這個功能寫成一個自定義函數(存儲過程),這樣使代碼可讀性增加,逼格也更高......
實驗要求
在實驗5數據庫設計的基礎上補充設計存儲過程,並基於實驗5建立的表和實驗6插入的數據完成實驗;
1. 按要求設計完成如下功能的存儲過程;
①查詢平均分數在x到y范圍內的學生信息。說明:該存儲過程有兩個參數;要求查詢的學生信息包括學號、姓名、院系名稱和平均分數。
②更新操作,以學號、課程編號和考試成績作參數更新指定學生和課程的考試成績,並返回該學生的平均成績。
2. 自行再分別設計一個完成查詢和完成操作功能的存儲過程(在實驗報告中要准確描述功能需求);
3. 在客戶端以存儲過程和輸入SQL語句的方式分別執行相同的查詢或操作,比較使用和不使用存儲過程的區別;
全部總結鏈接
SQL基礎 (數據庫、表、數據的增刪改查、視圖相關,以及所有實驗報告源代碼)
游標 (類似C++ 的 指針)
存儲過程(類似 C++ 的自定義函數)
觸發器 (類似 自定義的陷阱,或者說是監聽器,滿足某個條件了執行某個方法)
用戶權限及權限管理 (類似Windows的多用戶管理)
並發控制 (了解多個用戶同時對數據造成錯誤的情況 和 解決方法)
數據恢復(當數據庫數據丟失,相應的解決方法)
實驗過程
第一大題
1.1查詢平均分數在x到y范圍內的學生信息
令x = 80 , y = 88
代碼:
create procedure aaa //創建存儲過程 名字為aaa
@s smallint, @e smallint //傳入兩個參數@s(最低),@e(最高)
As
select 學生.學號,學生.姓名,院系.名稱 as 院系名稱,avg(選課.成績) as 平均成績 from 學生,選課,院系
where 學生.學號 = 選課.學號 and 學生.院系 = 院系.編號 //以上查詢每個學生的學號、姓名、院系名稱、平均成績
group by 學生.學號,學生.姓名,院系.名稱 //對學號進行分組
having avg(選課.成績) between @s and @e; //篩選平均分條件
go //暫停作用
exec aaa 80,88; //執行
drop procedure aaa // 刪除
注:存儲過程可以理解為C++中的自定義函數,先定義,然后通過主函數調用
圖 1 查詢平均分數在80到88范圍內的學生信息
1.2更新操作,以學號、課程編號和考試成績作參數更新指定學生和課程的考試成績,並返回該學生的平均成績。
代碼:
Create procedure new_data //創建存儲過程 名字為new_data
@sno char(8), @cno char(8), @grade smallint //傳入三個參數 學號、課程號、成績
as
if(@sno is not null and @cno is not null) //如果學號和課程號不為空
begin
update 選課 set 成績 = @grade //更新這個學生這門課的成績
where 選課.學號 = @sno and 選課.課程編號 = @cno;
select 選課.學號,avg(選課.成績) as 平均成績
from 選課 //然后在查詢這個學生的平均分
where 選課.學號 = @sno
group by 選課.學號;
end
go
exec new_data '2000278','1156',99; //執行
drop procedure new_data //刪除
注:為了不給后續實驗造成干擾,所以我手動插入了這一個數據
圖 2 第1.2題更新前 成績為80分
然后執行代碼,因為這個學生只有這一門課,所以平均分就是99分
圖 3 更新成績 輸出平均分
圖 4 第1.2題更新后 成績為99分
第二大題
自行再分別設計一個完成查詢和完成操作功能的存儲過程
2.1完成查詢功能
功能:輸入一個學生的學號,輸出其學號、姓名、性別、生源、院系名稱和狀態
代碼:
create procedure new_find //創建存儲過程 名字為new_find
@sno char(8) //參數
as
if(@sno is not null) //如果主鍵不為空
begin
select 學生.學號,學生.姓名,學生.性別,學生.生源,院系.名稱,學生.狀態
from 學生,院系
where 學生.院系 = 院系.編號 and 學生.學號 = @sno
end
go
exec new_find '2000012' //執行
drop procedure new_find //刪除
圖 5 查詢學號為2000012的學生信息
2.2完成操作功能
功能:新增一門課程,插入到課程表
代碼:
create procedure new_class //創建名為new_class的存儲過程
@cno char(8), @cname char(20), @ctea char(8), @time smallint, @xz char(10) //參數
as
if(@cno is not null) //如果主鍵不為空
begin
insert 課程 values('1000','不知名的高級課程','100001',2,'專業基礎'); //插入
end
go
exec new_class '1000','不知名的高級課程','100001',2,'專業基礎' //執行
drop procedure new_class //刪除
圖 6 更新前的課程
圖 7 運行截圖
圖 8 更新后 多了一門插入的課
第三大題
注:把2.2題的代碼拿來用,發現存儲過程的代碼就像是C++中的自定義函數,可以接受若干個參數,來實現需要的功能。那種多次執行某一個功能的時候,收益最大。
圖 9 存儲過程 代碼
圖 10 普通查詢代碼