日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

山东大学 2020级数据库系统 实验三

發布時間:2025/3/15 windows 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 山东大学 2020级数据库系统 实验三 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

What’s more

山東大學 2020級數據庫系統 實驗一
山東大學 2020級數據庫系統 實驗二
山東大學 2020級數據庫系統 實驗三
山東大學 2020級數據庫系統 實驗四
山東大學 2020級數據庫系統 實驗五
山東大學 2020級數據庫系統 實驗六
山東大學 2020級數據庫系統 實驗七
山東大學 2020級數據庫系統 實驗八、九

寫在前面

做數據庫實驗一定要靜得下心來,才能發現其中的錯誤然后進行改正。同時,如果發現 SQL 語句總是報錯,“一定是你錯了,只是不知道錯在哪里”

其次,SQL 語句中較為復雜的點博主都進行了注釋,希望大家一定要看懂思路后自己寫一遍,而不是盲目的 Ctrl+C,Ctrl+V,切記切記!!

實驗三

知識儲備:本實驗涉及的主要是 delete … from … where 語句,完成本實驗需要熟練這個子句描述的內容,然后組織對應的邏輯結構進行求解。

  • 3-1 將pub用戶下的Student_31及數據復制到主用戶的表test3_01,刪除表中的學號不全是數字的那些錯誤數據,學號應該是數字組成,不能夠包含字母空格等非數字字符。
    方法之一:用substr函數,例如Substr(sid,1,1)返回學號的第一位,判斷是否是數字。

    思路:

  • 此題最簡便的方法我覺得是使用函數 regexp_like(string, 正則表達式) 來進行學號正確格式的尋找。
  • 下面對正則表達式進行一個補充:
    正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。主要是記憶住表達相應字符的符號就行了,具體可以上 B 站尋找教程。

    eg. ‘^’ 匹配一行字符的行首;’+’ 匹配前面一個字符出現 1 次及以上的字符串;’$’ 匹配一行字符的行尾;’[]’ 表示一個范圍,匹配的字符只能取自于括號中的字符。

    因此,本實驗中為了驗證 sid 是否是全數字,可以這樣:regexp_like(sid, '^[0-9]+$'),滿足這個正則表達式返回 true,否則返回 false。

create table test3_01 asselect *from pub.student_31 delete from test3_01 where sid not in(select sidfrom test3_01where regexp_like(sid, '^[0-9]+$')) --檢驗字符串是否是全數字
  • 3-2 將pub用戶下的Student_31及數據復制到主用戶的表test3_02,刪除表中的出生日期和年齡(截止到2012年的年齡,即年齡=2012-出生年份)不一致的那些錯誤數據。
    函數extract(year from birthday)返回birthday的年份

    思路:
  • 此題直接使用題目中的提示 extract 函數提取出出生年份;
  • 然后與 2012 作差,最后跟 age 比較即可;
create table test2_02 asselect *from pub.student_31 delete from test3_02 where age <> 2012 - extract(year from birthday)
  • 3-3 將pub用戶下的Student_31及數據復制到主用戶的表test3_03,刪除表中的性別有錯誤的那些錯誤數據(性別只能夠是"男"、"女"或者空值)。
    思路:
  • 直接對性別進行判定即可。
    但是,注意:null 的判斷需要使用 not null 而不是 = 哦~~
create table test3_03 asselect *from pub.student_31 delete from test3_03 where sex <> '男' and sex <> '女' and sex is not null
  • 3-4 將pub用戶下的Student_31及數據復制到主用戶的表test3_04,刪除表中的院系名稱有空格的、院系名稱為空值的或者院系名稱小于3個字的那些錯誤數據。
    思路:
  • 直接對院系名稱進行判斷即可;
  • 空格的判斷可以采用 like 來對字符串進行處理;
  • 院系名稱小于 3 個字直接使用函數 length() 即可;
create table test3_04 asselect *from pub.student_31 delete from test3_04 where dname like '% %' or dname is null or length(dname) < 3
  • 3-5 將pub用戶下的Student_31及數據復制到主用戶的表test3_05,刪除表中的班級不規范的那些錯誤數據,不規范是指和大多數不一致。
    這個題知識點是學會用sql找出不規范的數據,而不是用人工辦法找不規范。
    提示:尋找不規范有很多解決思路,可以去對比大綱最后的提示。

    思路:
  • 根據提示,我們可以先對 class 進行 select 看看哪些數據不太符合規范;
  • 可以知道:不符合規范的數據是那些 class 中間有空格、后面加上了 ‘級’ 字的數據;
  • 因此可以確定符合規范的數據是全數字的 class 數據;
  • 使用前面講到的 regexp_like() 函數來進行判斷就好;
  • 刪除這些數據即可;
create table test3_05 asselect *from pub.student_31 delete from test3_05 where class not in(select classfrom test3_05where regexp_like(class, '^[0-9]+$'))
  • 3-6 將pub用戶下的Student_31及數據復制到主用戶的表test3_06,刪除表中的錯誤數據,不規范的數據也被認為是那些錯誤數據。
    (1)學號不全是數字;
    (2)出生日期和年齡不一致的(年齡=2012-出生年份);
    (3)姓名有空格的或者長度小于2個字的;函數length()返回字符串長度。
    (4)性別有錯誤的(只能夠是"男"、“女”、空值);
    (5)院系名稱有空格的、院系名稱為空值的;
    (6)院系名稱小于3個字的;
    (7)班級數據有錯誤的(需要先找到班級里面的錯誤)。
    保留最后全部正確的數據。

    思路:
  • 綜合全面的判斷并用 or 將它們連接起來即可;
create table test3_06 asselect *from pub.student_31 delete from test3_06 where not regexp_like(sid, '^[0-9]+$') or age <> 2012 - extract(year from birthday) or name like '% %' or length(name) < 2 or sex in(select distinct sexfrom test3_06where sex <> '男'and sex <> '女'and sex is not null) or dname like '% %' or dname is null or length(dname) < 3 or class not in(select classfrom test3_05where regexp_like(class, '^[0-9]+$'))
  • 3-7 將pub用戶下的Student_course_32及數據復制到主用戶的表test3_07,刪除其中的錯誤數據,錯誤指如下情況:
    學號在學生信息pub.student中不存在的;

    思路:
  • 直接在 pub.student 中找到 sid,然后使用 not in 判斷即可;
create table test3_07 asselect *from pub.student_31 delete from test3_07 where sid not in(select sidfrom pub.student)
  • 3-8 將pub用戶下的Student_course_32及數據復制到主用戶的表test3_08,刪除其中的錯誤數據,錯誤指如下情況:
    課程號和教師編號在教師授課表pub.teacher_course中不同時存在的,即沒有該教師教該課程;

    思路:
  • 可以使用 not exists 來判斷 cid, sid 是否存在于pub.teacher_course 即可;
create table test3_08 asselect *from pub.teacher_course delete from test3_08 S where not exists(select cid, tidfrom pub.teacher_course Twhere S.cid = T.cidand S.tid = T.tid)
  • 3-9 將pub用戶下的Student_course_32及數據復制到主用戶的表test3_09,刪除其中的錯誤數據,錯誤指如下情況:
    成績數據有錯誤(需要先找到成績里面的錯誤)。
    這個題知識點是學會用sql找出錯誤數據,而不是用人工辦法找錯誤數據。
    提示:尋找不規范有很多解決思路,可以去對比大綱最后的提示。

    思路:
  • 同樣,還是可以先進行 select 來判斷究竟哪些是錯誤數據;
  • 可以發現:錯誤的數據在于分數有 > 100,也有 < 0 的;
  • 使用 between … and … 將他們刪除即可;
create table test3_09 asselect *from pub.student_31 delete from test3_09 where score not between 0 and 100
  • 3-10 將pub用戶下的Student_course_32及數據復制到主用戶的表test3_10,刪除其中的錯誤數據,錯誤指如下情況:
    (1) 學號在學生信息pub.student中不存在的;
    (2) 課程號在課程信息pub.course中不存在的;
    (3) 教師編號在教師信息pub.teacher中不存在的;
    (4) 課程號和教師編號在教師授課表pub.teacher_course中不存在的;
    (5) 成績數據有錯誤(需要先找到成績里面的錯誤)。
    保留最后正確的數據。

    思路:
  • 綜合前面的步驟,用 or 連接各條件,然后進行刪除即可;
create table test3_10 asselect *from pub.student_31 delete from test3_10 S where sid not in(select sidfrom pub.student) or cid not in(select cidfrom pub.course) or tid not in(select tidfrom pub.teacher) or not exists(select cid, tidfrom pub.teacher_course Twhere S.cid = T.cidand S.tid = T.tid) or score not between 0 and 100

再次強調:一定是看懂思路之后自己實踐哈~~
有問題還請斧正!

總結

以上是生活随笔為你收集整理的山东大学 2020级数据库系统 实验三的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。