山东大学 2020级数据库系统 实验四
What’s more
山東大學 2020級數據庫系統 實驗一
山東大學 2020級數據庫系統 實驗二
山東大學 2020級數據庫系統 實驗三
山東大學 2020級數據庫系統 實驗四
山東大學 2020級數據庫系統 實驗五
山東大學 2020級數據庫系統 實驗六
山東大學 2020級數據庫系統 實驗七
山東大學 2020級數據庫系統 實驗八、九
寫在前面
做數據庫實驗一定要靜得下心來,才能發現其中的錯誤然后進行改正。同時,如果發現 SQL 語句總是報錯,“一定是你錯了,只是不知道錯在哪里!”
其次,SQL 語句中較為復雜的點博主都進行了注釋,希望大家一定要看懂思路后自己寫一遍,而不是盲目的 Ctrl+C,Ctrl+V,切記切記!!
實驗四
實驗四主要考察的內容如下:
對于 alter 語句的掌握程度以及是否能夠使用它來對表中的屬性進行操作;
對于 update … set … where 子句的使用;
對字符串的處理以及刪除字符串中相應的字符;
- 4-1 將 pub 用戶下表 student_41 及數據復制到主用戶的表 test4_01 中,使用 alter table 語句為表增加列: “總成績:sum_score”。
使用 update 語句,利用 pub.student_course,統計 “總成績”;
思路: - 先指用 alter table test4_01 add sum_score int 來添加對應的屬性列。需要注意的是 add 子句后面的屬性列還有跟上該列的類型說明;
- 使用 update … set … 結構計算每個學生的總成績然后填入 sum_score 列中即可;
-
4-2 將 pub 用戶下表 student_41 及數據復制到主用戶的表 test4_02 中,使用 alter table 語句為表增加列 “平均成績:avg_score” (小數點后保留 1 位)。
利用 pub.student_course,統計“平均成績”,四舍五入到小數點后 1 位
思路: - 思路其實和 4-1 相似,添加對應列,然后分別進行平均成績的計算即可;
- 保留小數點后 1 位使用 round() 函數即可;
需要注意的是:在對 avg_score 屬性列進行定義的時候,由于保留一位小數,因此需要使用 numeric(3, 1) 來設置哦~~
- 4-3 將 pub 用戶下表 student_41 及數據復制到主用戶的表 test4_03 中,使用 alter table 語句為表增加列: “總學分:sum_credit”。
使用 update 語句,利用 pub.student_course、pub.course,統計 “總學分”;
這時需要注意:成績及格才能夠計算所得學分,一門課多個成績都及格只計一次學分。
思路: - 使用 alter … add … 來添加對應的屬性列,同時注意列屬性的定義為 int 即可;
- 注意題目中的提示“一門課多個成績都及格只計一次學分”,因此我們不能簡單地使用 score > 60 然后 sum(credit) ;正確的方法應該是得到每個學生每門課的最高成績,用這個最高成績來判斷是否 > 60,若大于 60 ,則計一次學分;由于每個學生的最高分是唯一的,因此我們在 sum(credit) 時相當于只計算了一次,而不是像前者一樣計算多次。
- 4-4 將 pub 用戶下表 student_41 及數據復制到主用戶的表 test4_04 中。 根據列院系名稱 dname 到 pub.department 找到對應院系編號 did,將對應的院系編號回填到院系名稱列 dname 中,如果表中沒有對應的院系名稱,則列 dname 中內容不變仍然是原來的內容。
思路: - 首先使用 create table … as select * … 來將 pub.student_41 中的所有數據 copy 到 test4_04 中;
- 然后使用 dname 去判斷這個 dname 是否在 pub.department 中;
- 若是,則將 dname 更新為相應的 did;反之則不更新;
- 4-5 將 pub 用戶下表 student_41 及數據復制到主用戶的表 test4_05 中,使用 alter table 語句為表增加 4 個列:“總成績:sum_score”、 “平均成績:avg_score”、“總學分:sum_credit”、“院系編號:did varchar(2) ”。
(1) 利用 pub.student_course、pub.course,統計 “總成績”;
(2) 利用 pub.student_course、pub.course,統計“平均成績”,四舍五入到小數點后 1 位;
(3) 利用 pub.student_course、pub.course,統計 “總學分”;
(4) 根據院系名稱到 pub.department 和 pub.department_41 中,找到對應編號,填寫到院系編號中, 如果都沒有對應的院系,則填寫為 00。
說明:執行 update 后,在查詢表中數據,可能出現順序變化,這是正常,因為數據在表中是無序。需要 順序的時候可以通過 orderby 實現。
思路: - 首先使用 create 語句進行表和數據的復制;
- 然后使用 alter table 語句在復制得到的表中添加對應列;注意 alter 似乎不能一起添加,因此需要一列一列地進行屬性列地添加;
- 最后使用 update … set … 子句來對表中的屬性列進行更新即可(set 可以同時更新多列哦~~)
需要注意的是:對于院系編號地更新時,現在是從兩個表中尋找對應的院系編號而不是一個表了(當時卡了好久/(ㄒoㄒ)/~~),這兩個表可以通過 union 來連接。(由于是前面問題的綜合,因此代碼較長)
create table test4_05 as select * from pub.student_41 alter test4_05add sum_score int -----------------分開哦----------------------- alter test4_05add avg_score numeric(3, 1) -----------------分開哦----------------------- alter test4_05add sum_credit int -----------------分開哦----------------------- alter test4_05add did varchar(2) update test4_05 t0 set sum_score = (select sum(score)from pub.student_course t1where t0.sid = t1.sidgroup by sid), avg_score =(select round(avg(score), 1)from pub.student_course t2where t0.sid = t2.sidgroup by sid), sum_credit = (select sum(credit)from pub.course natural join (select sid, cid, max(score) max_scorefrom pub.student_coursegroup by sid, cid) t1where t0.sid = sidand t1.max_score >= 60group by sid), did = casewhen dname in( (select dnamefrom pub.department)union(select dnamefrom pub.department_41) )then(select didfrom ( (select dname, didfrom pub.department)union(select dname, didfrom pub.department_41) )where dname = t0.dname) else '00' end- 4-6 將 pub 用戶下的 Student_42 及數據復制到主用戶的表 test4_06 中,對表中的數據進行整理,修復那些不規范的數據: 剔除姓名列中的所有空格;
思路: -
使用 create 來將表和數據進行復制;
-
為了刪除空格,我們可以使用函數 replace(string, target_str, replace_str) 來進行;
第一個參數 string 表示需要修改的字符串;第二個參數 target_str 表示在該字符串中需要修改的字符(為了查找到該字符);第三個參數 replace_str 表示需要將 target_str 替換為什么字符;
在本題中,我們可以這樣使用 replace 函數:replace(name, ’ ', ‘’),找到空格并將它刪去;(translate()函數也有類似的功能!)
- 4-7 將 pub 用戶下的 Student_42 及數據復制到主用戶的表 test4_07 中,對表中的數據進行整理,修復那些不規范的數據: 對性別列進行規范(需要先確定哪些性別數據不規范,也就是那些和大多數不一樣的就是不規范的);
思路: - 使用 create 子句來對表和表中的數據進行復制;
- 為了看到哪些才是不規范的數據,我們可以首先使用:
select distinct sex, count(sex) from test4_07 group by sex
來查看所謂的“不規范數據”。發現:不規范的數據是加上了“性”字的 sex 值,同時有些 sex 值的前后可能還有空格等; - 具體的刪除方法我們還是可以使用 replace() 函數;
- 4-8 將 pub 用戶下的 Student_42 及數據復制到主用戶的表 test4_08 中,對表中的數據進行整理,修復那些不規范的數據: 對班級列進行規范(需要先確定哪些班級不規范)。
思路: - 首先使用 create 來對表以及表中的數據進行復制;
- 然后使用
select distinct class, count(class) from test4_08 group by class
來看看哪些班級數據是不規范的數據。發現,不規范的班級數據后面又“級”字,我們只需要使用 replace() 函數來將它去掉即可;
- 4-9 將 pub 用戶下的 Student_42 及數據復制到主用戶的表 test4_09 中,對表中的數據進行整理,修復那些不規范的數據: 年齡為空值的根據出生日期設置學生年齡(截止到 2012 年的年齡,即年齡=2012-出生年份),年齡不 為空值的不要改變。
思路: - 首先使用 create 來對表以及表中的數據進行復制;
- 然后使用 update 和 where 判定語句來對 age 列進行更新即可;
- 期間還是用到了實驗三中提到的 extract() 函數哦~~
- 4-10 將 pub 用戶下的 Student_42 及數據復制到主用戶的表 test4_10 中,對表中的數據進行整理,修復那些不規范的數據:
(1) 剔除姓名列中的所有空格;
(2) 剔除院系名稱列中的所有空格;
(3) 對性別列進行規范(需要先確定哪些性別數據不規范,也就是那些和大多數不一樣的就是不規范的);
(4) 對班級列進行規范(需要先確定哪些班級不規范)。
(5) 年齡為空值的根據出生日期設置學生年齡(截止到 2012 年的年齡,即年齡=2012-出生年份), 年齡不為空值的不要改變。
思路: - 就是對前面所有的問題的綜合,由于 set 中可以同時設置多個列,因此將它們連接起來即可;
再次強調:一定是看懂思路之后自己實踐哈~~
有問題還請斧正!
總結
以上是生活随笔為你收集整理的山东大学 2020级数据库系统 实验四的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模学习笔记(四)——拟合算法
- 下一篇: python写算法求最短路径,Pytho