數據庫SQL語言學習--上機練習4(視圖)


 

上機練習4 一.實驗目的 1. 熟悉和掌握對數據表中視圖的查詢操作和 SQL 命令的使用; 2. 熟悉和掌握對數據表中視圖的更新操作和 SQL 命令的使用,並注意視圖更新與基本表更新的區別與聯系; 3. 學習靈活熟練的進行視圖的操作,認識視圖的作用。 二.實驗內容 (一) 定義視圖 以 Student, Course 和SC表為基礎完成以下視圖定義: 1. 定義信息系學生基本情況視圖 V_IS; CREATE VIEW V_IS AS SELECT * FROM Student WHERE Sdept='信息系'; 2. 將 Student,Course 和 SC表中學生的學號,姓名,課程號,課程名,成績定義為視圖 V_S_C_G; CREATE VIEW V_S_C_G AS SELECT Student.Sno,Student.Sname,Course.Cno,Course.Cname ,Cscore FROM Student,Course,Score WHERE Student.Sno=Score.Sno AND Course.Cno = Score.Cno; 3. 將各系學生人數,平均年齡定義為視圖 V_NUM_AVG; CREATE VIEW V_NUM_AVG(A_num,A_age) AS SELECT COUNT(*),AVG(YEAR(GETDATE())-DATENAME(yyyy,Sbirth)) FROM Student GROUP BY Sdept; 4. 定義一個反映學生出生年份的視圖 V_YEAR; CREATE VIEW V_YEAR(Birth_year) AS SELECT DATENAME(yyyy,Sbirth) FROM Student; 5. 將各位學生選修課程的門數及平均成績定義為視圖 V_AVG_S_G; CREATE VIEW V_AVG_S_G(Num_of_course,A_grade) AS SELECT COUNT(*),AVG(Cscore) FROM Score GROUP BY Sno; 6. 將各門課程的選修人數及平均成績定義為視圖 V_AVG_C_G; CREATE VIEW V_AVG_C_G(Num_of_student,A_grade) AS SELECT COUNT(*),AVG(Cscore) FROM Score GROUP BY Cno; 7. 將各位學生學號、姓名,已選修課程的學分及其已取得的績點定義為視圖V_S_GPA CREATE VIEW V_S_GPA(Sno,Sname,Credit,gpa) AS SELECT Student.Sno,Sname,Ccredit, (CASE WHEN Cscore BETWEEN 90 AND 100 THEN 4.0 WHEN Cscore BETWEEN 85 AND 89 THEN 3.7 WHEN Cscore BETWEEN 82 AND 84 THEN 3.3 WHEN Cscore BETWEEN 78 AND 81 THEN 3.0 WHEN Cscore BETWEEN 75 AND 77 THEN 2.7 WHEN Cscore BETWEEN 71 AND 74 THEN 2.3 WHEN Cscore BETWEEN 66 AND 70 THEN 2.0 WHEN Cscore BETWEEN 62 AND 75 THEN 1.7 WHEN Cscore BETWEEN 60 AND 61 THEN 1.3 WHEN Cscore = 60 THEN 1.0 WHEN Cscore < 60 THEN 0 END) FROM Student,Course,Score WHERE Student.Sno=Score.Sno AND Course.Cno=Score.Cno; 現已知成績績點的計算方式如下: 成績 等級 績點 90-100 A 4.0 85-89 A- 3.7 82-84 B+ 3.3 78-81 B 3.0 75-77 B- 2.7 71-74 C+ 2.3 66-70 C 2.0 62-65 C- 1.7 60-61 D 1.3 補考60 D- 1.0 60以下 F 0 (二)使用視圖 1. 查詢以上所建的視圖結果; SELECT * FROM V_AVG_C_G; SELECT * FROM V_AVG_S_G; SELECT * FROM V_IS; SELECT * FROM V_NUM_AVG; SELECT * FROM V_S_C_G; SELECT * FROM V_S_GPA; SELECT * FROM V_YEAR; 2.查詢平均成績為 90 分以上的學生學號、姓名和成績; SELECT Sno,Sname,Cscore FROM V_S_C_G WHERE Sno IN (SELECT Sno FROM V_S_C_G GROUP BY Sno HAVING AVG(Cscore)>=90); 3. 查詢各課成績均大於平均成績的學生學號、姓名、課程和成績; SELECT * FROM V_S_C_G WHERE Sno IN (SELECT A.Sno FROM V_S_C_G A WHERE NOT EXISTS (SELECT B.Cscore FROM V_S_C_G B WHERE Cscore <= (SELECT AVG(C.Cscore)FROM V_S_C_G C WHERE B.Cno=C.cno) AND A.Sno=B.Sno ) ); 4.按系統計各系平均成績在 80 分以上的人數,結果按降序排列;
SELECT COUNT(*),Sdept FROM Student WHERE Sno IN (SELECT V_S_C_G.Sno FROM V_S_C_G GROUP BY V_S_C_G.Sno HAVING AVG(Cscore)>=80) GROUP BY Sdept
SELECT Sdept,COUNT(A_grade) Num FROM Student,V_AVG_S_G WHERE Student.Sno=V_AVG_S_G.Sno AND A_grade>=80 GROUP BY Sdept ORDER BY Num desc;
5.查詢平均績點在 3.5 分以上的學生信息,結果按系排列顯示。 (平均績點(GPA)是國際通用的學生學習質量評定標准,其計算公式如下:課程學分1*績點+課程學分2*績點+......+課程學分n*績點)/(課程學分1+課程學分2+......+課程學分n。) SELECT * FROM Student WHERE Sno IN ( SELECT Sno FROM V_S_GPA GROUP BY Sno HAVING SUM(Credit*gpa)/SUM(Credit)>3.5 ) ORDER BY Sdept; (三)修改視圖 1. 通過視圖V_IS,分別將學號為“0001”和“0004”的學生姓名更改為“劉二平”和“馬西”,並查詢結果; UPDATE V_IS SET Sname='劉二平' WHERE Sno='0001'; UPDATE V_IS SET Sname='馬西' WHERE Sno='0004'; SELECT * FROM V_IS; SELECT * FROM Student; 2. 通過視圖 V_IS,新增加一個學生記錄 ('1001','韓磊',“男”,19, '信息系'),並查詢結果; INSERT INTO V_IS(Sno,Sname,Sgender,Sage,Sdept) VALUES('1001','韓磊','',19, '信息系'); SELECT * FROM V_IS WHERE Sno='1001'; SELECT * FROM Student WHERE Sno='1001'; 3. 通過視圖 V_IS,新增加一個學生記錄 ('1002','王超',“女”,19, 'FE'),並查詢結果; INSERT INTO V_IS(Sno,Sname,Sgender,Sage,Sdept) VALUES('1002','王超','',19, 'FE'); SELECT * FROM Student WHERE Sno='1002'; 4. 通過視圖 V_IS,刪除學號為“0016”和“0003”的學生信息,並查詢結果; DELETE FROM V_IS WHERE Sno='0016' OR Sno='0003'; SELECT * FROM V_IS; SELECT * FROM Student; 5. 要通過視圖V_S_C_G,將學號為“S12”的姓名改為“S12_MMM”,是否可以實現?並說明原因; UPDATE V_S_C_G SET Sname='S12_MMM' WHERE Sno='S12'; 可以實現。按理,由於V_S_C_G視圖是由兩個以上基本表導出的,則此視圖不允許更新,但有時候也不一定。 6. 要通過視圖V_AVG_S_G,將學號為“S1”的平均成績改為90分,是否可以實現?並說明原因。 UPDATE V_AVG_S_G SET A_grade='90' WHERE Sno='S1'; 不能實現。因為V_AVG_S_G視圖的字段來自聚集函數,含有GROUP BY字句,此視圖不允許更新。 消息4406,級別16,狀態1,第1 行 對視圖或函數'V_AVG_S_G' 的更新或插入失敗,因其包含派生域或常量域。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM