山东大学 2020级数据库系统 实验二
What’s more
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)一
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)二
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)三
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)四
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)五
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)六
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)七
山東大學(xué) 2020級(jí)數(shù)據(jù)庫(kù)系統(tǒng) 實(shí)驗(yàn)八、九
寫在前面
做數(shù)據(jù)庫(kù)實(shí)驗(yàn)一定要靜得下心來(lái),才能發(fā)現(xiàn)其中的錯(cuò)誤然后進(jìn)行改正。同時(shí),如果發(fā)現(xiàn) SQL 語(yǔ)句總是報(bào)錯(cuò),“一定是你錯(cuò)了,只是不知道錯(cuò)在哪里”
其次,SQL 語(yǔ)句中較為復(fù)雜的點(diǎn)博主都進(jìn)行了注釋,希望大家一定要看懂思路后自己寫一遍,而不是盲目的 Ctrl+C,Ctrl+V,切記切記!!
實(shí)驗(yàn)二
注意:實(shí)驗(yàn)二使用的表是:pub.student_course, pub.student, pub.course 哦,別搞錯(cuò)了!!
檢索查詢部分應(yīng)該算是數(shù)據(jù)庫(kù)中較為困難的一部分了,每道題我會(huì)先寫出思路,同時(shí)在 SQL 語(yǔ)句中進(jìn)行注釋,希望能夠看懂。
- 2-1 找出沒(méi)有選修任何課程的學(xué)生的學(xué)號(hào)、姓名(即沒(méi)有選課記錄的學(xué)生)
思路: - 找出有選課記錄的同學(xué)的學(xué)號(hào),不妨記為關(guān)系 A;
- 使用 not in 在 pub.student 中篩選不在 A 中有記錄的學(xué)生的學(xué)號(hào)及姓名;
-
2-2 找出至少選修了學(xué)號(hào)為“200900130417”的學(xué)生所選修的一門課的學(xué)生的學(xué)號(hào)、姓名(不包含這名同學(xué))。
思路 1: - 選出該同學(xué)所選修了的課程號(hào) cid,作為集合 A;
- 使用 = some 來(lái)對(duì) pub.student_course 中每個(gè)同學(xué)的課程號(hào) cid 進(jìn)行篩選;
- 最后在 pub.student 中選出對(duì)應(yīng)的學(xué)號(hào) sid 及姓名 name
- 選出該同學(xué)所選修了的課程號(hào) cid,作為集合 A;
- 使用 in 根據(jù) A 篩選出課程號(hào)在集合 A 中的同學(xué)對(duì)應(yīng)的學(xué)號(hào)及姓名;
- 集合運(yùn)算 minus(except) 減去該同學(xué)的學(xué)號(hào)及姓名
思路 2:
-
2-3 找出至少選修了一門其先行課程號(hào)為“300002”號(hào)課程的學(xué)生的學(xué)號(hào)、姓名
思路: - 根據(jù)先行課程號(hào) fcid 在 pub.course 中選出對(duì)應(yīng)的選修課程號(hào) cid,記為集合 A;
- 在 pub.student_course 中根據(jù)集合 A 篩選出所選課程在 A 中的學(xué)生的 sid,記為集合 B;
- 在 pub.student 中根據(jù)集合 B 篩選出對(duì)應(yīng)學(xué)生的 sid 和 name;
第 2 步以及第 3 步可以使用 natural join 進(jìn)行連接。
-
2-4 找出選修了“操作系統(tǒng)”并且也選修了“數(shù)據(jù)結(jié)構(gòu)”,但是沒(méi)有選修“程序設(shè)計(jì)語(yǔ)言”的學(xué)生的學(xué)號(hào)、 姓名
思路: - 找出選修了“操作系統(tǒng)”的學(xué)生的 sid,記為集合 A;
- 找出選修了“數(shù)據(jù)結(jié)構(gòu)”的學(xué)生的 sid,記為集合 B;
- 找出沒(méi)有選修“程序設(shè)計(jì)語(yǔ)言”的學(xué)生的 sid,記為集合 C;
- (A intersect B) except C 即可;
(注意 Oracle 中將 except 換為 minus 就行)
-
2-5 查詢 20 歲的所有有選課的學(xué)生的學(xué)號(hào)、姓名、平均成績(jī)(avg_score,此為列名,下同)(平均成績(jī)四舍 五入到個(gè)位)、總成績(jī)(sum_score)
思路: - 使用 natural join 將 pub.student 和 pub.student_course 連接起來(lái);
- 計(jì)算對(duì)應(yīng)的信息即可;
注意:函數(shù) round(number, precision) 可以將 number 按照 precision 精確到對(duì)應(yīng)位。round(avg(number), 0) 即代表將 score 的平均值保留到整數(shù)位。
-
2-6 查詢所有課的最高成績(jī)、最高成績(jī)?nèi)藬?shù),test2_06 有四個(gè)列:課程號(hào) cid、課程名稱 name、最高成績(jī) max_score、最高成績(jī)?nèi)藬?shù) max_score_count(一個(gè)學(xué)生同一門課成績(jī)都是第一,只計(jì)一次,需要考慮刷 成績(jī)情況,一個(gè)同學(xué)選了一個(gè)課程多次,兩次都是最高分。如果結(jié)果錯(cuò)一行,可能就是沒(méi)有考慮這種情 況,這里是為了考核“去重復(fù)計(jì)數(shù)”知識(shí)點(diǎn)的)。如果沒(méi)有學(xué)生選課,則最高成績(jī)?yōu)榭罩?最高成績(jī)?nèi)?數(shù)為零
此題應(yīng)該算是實(shí)驗(yàn)二中最難的一道了。希望我能將思路說(shuō)清楚
主要用到的表如下: - t1:得出 cid,name
- t2:得出max_score
- t5:得出max_score_count
思路:
1. t1, t2 表的求解過(guò)程不用多說(shuō),簡(jiǎn)單的分組查詢(查詢時(shí)一定要加上 cid ,因?yàn)楹竺嬉獙⑺鼈冞B接起來(lái));
2. 由于需要數(shù)最高分的人數(shù),因此首先要在查詢 max_score_count 部分的 from 子句中計(jì)算出 max_score (t4 表);
3. 然后針對(duì) score 對(duì)學(xué)生進(jìn)行篩選,讓 t3.cid = t4.cid 以及 t3.score = t4.max_score,得出每門課的最高分的學(xué)生的信息;
4. 再進(jìn)行分組后 count 得到 max_score_count;
5. 最后將這些表的信息連起來(lái) t1.cid = t2.cid and t2.cid = t5.cid;
-
2-7 查詢所有不姓張、不姓李、也不姓王的學(xué)生的學(xué)號(hào) sid、姓名 name
思路 1: - 直接使用函數(shù) substr(string, p1, p2),該函數(shù)可以針對(duì)取得字符串相對(duì)應(yīng)部分的字符。如 substr(name, 0, 1) 就可以取得學(xué)生姓名 name 的第一個(gè)字符,即為姓。
- 然后接著判斷取得的字符串是否是“張”、“李”、“王”即可。
- 使用 not like 子句對(duì)字符串進(jìn)行處理即可;
思路 2:
- 2-8 查詢學(xué)生表中每一個(gè)姓氏及其人數(shù)(不考慮復(fù)姓),test2_08 有兩個(gè)列:second_name、p_count
思路: - 使用 substr 函數(shù)來(lái)取得學(xué)生的姓,然后進(jìn)行 count 即可;
- 2-9 查詢選修了 300003 號(hào)課程的學(xué)生的 sid、name、score
思路: - 使用 natural join 將 pub.student 和 pub.student_course 進(jìn)行連接;
- 從中尋找對(duì)應(yīng)的 sid, name 以及 score;
-
2-10 找出同一個(gè)同學(xué)同一門課程有兩次或以上不及格的所有學(xué)生的學(xué)號(hào)、姓名(即一門課程需要補(bǔ)考兩次 或以上的學(xué)生的學(xué)號(hào)、姓名)
思路 1: - 先選出 score < 60 的學(xué)生,并將此時(shí)的 pub.student_course 記為 S;
- 然后將子查詢中的 pub.student_course 記為 T,在 S.cid = T.cid, T.score < 60 的條件下,查找是否還存在記錄;
- 若存在,則滿足條件;不滿足則不輸出;
- 選出分?jǐn)?shù) < 60 的學(xué)生的 sid 以及 cid,并按照這兩個(gè)標(biāo)準(zhǔn)對(duì) pub.student_course進(jìn)行分組;
- 在分組的基礎(chǔ)上使用 count 來(lái)數(shù)出每一組的人數(shù)。若人數(shù) > 2,則滿足條件,記錄其 sid;反之則不記錄;
思路 2:
再次強(qiáng)調(diào):一定是看懂思路之后自己實(shí)踐哈~~
有問(wèn)題還請(qǐng)斧正!
總結(jié)
以上是生活随笔為你收集整理的山东大学 2020级数据库系统 实验二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java对外查询接口注意的地方_Java
- 下一篇: qt坐标系统与布局的简单入门