資料庫學習之旅——實驗2
阿新 • • 發佈:2018-12-31
本次實驗的目的是對SQL語句中比較基礎的部分,SELECT語句中的group by,order by,having,以及集合運算,聚集函式的學習與練習
由於無法上傳附件SCHOOL資料庫的資訊,所以,這裡只提交了資料庫的表頭,以及練習部分:
/*STUDENTS(SID,SNAME,EMAIL,GRADE); TEACHERS(TID,TNAME,EMAIL,SALARY); COURSES(CID,CNAME,HOUR); CHOICES(NO,SID,TID,CID,SCORE);*/ --(1)查詢年級為2001的所有學生的名稱,按編號升序排列。 SELECT SNAME '學生名稱' FROM STUDENTS WHERE GRADE='2001' ORDER BY SID; --(2)查詢學生的選課成績合格的課程成績,並把成績換算為積點(60分對應積點為1,每增加1分,積點增加0.1) SELECT SID '學生編號' , SCORE '學生成績', (SCORE-50)/10 '積點' FROM CHOICES WHERE SCORE>'60'; --(3)查詢課時是48或64的課程的名稱 SELECT CNAME '課程名稱' FROM COURSES WHERE HOUR IN('48','64'); --(4)查詢所有課程名稱中含有DATA的課程編號 SELECT CID '課程編號' FROM COURSES WHERE CNAME LIKE '%DATA%'; --(5)查詢所有選課記錄的課程號(不重複顯示) SELECT DISTINCT CID '課程號' FROM CHOICES; --(6)統計所有老師的平均工資 SELECT AVG(SALARY) '平均工資' FROM TEACHERS; --*********************************(7)查詢所有學生的編號,姓名和平均成績,按總平均成績降序排列 SELECT STUDENTS.SID '學生編號' , SNAME '學生姓名' , AVG(SCORE) '平均成績' FROM CHOICES,STUDENTS WHERE STUDENTS.SID=CHOICES.SID GROUP BY STUDENTS.SID,STUDENTS.SNAME ORDER BY AVG(SCORE)DESC; --(8)統計各個課程的選課人數和平均成績 SELECT CID '課程編號' , COUNT(NO)'選課人數' , AVG(SCORE)'平均成績' FROM CHOICES GROUP BY CID; --ORDER BY CID --(9)查詢至少選修了三門課程的學生的編號 SELECT SID '編號' FROM CHOICES GROUP BY SID HAVING COUNT(*)>3 --(10)查詢編號800009026的學生所選的全部課程的課程名和成績 SELECT COURSES.CNAME,CHOICES.SCORE FROM CHOICES,COURSES WHERE CHOICES.SID='800009026' AND COURSES.CID=CHOICES.CID; --(11)查詢所有選了database的學生的編號 SELECT CHOICES.SID '學生編號' FROM CHOICES,COURSES WHERE COURSES.CNAME='database' AND CHOICES.CID=CHOICES.CID --(12)求出選擇了同一個課程的學生對 SELECT X.SID '學生1', Y.SID'學生2' FROM CHOICES X,CHOICES Y WHERE X.CID=Y.CID AND X.NO<Y.NO --(13)求出至少被兩名學生選修的課程編號 SELECT CHOICES.CID FROM CHOICES GROUP BY CHOICES.SID,CHOICES.CID HAVING COUNT(SID)>2 --(14)查詢選修了編號850955252的學生所選的某個課程的學生編號 SELECT Y.SID FROM CHOICES AS X, CHOICES AS Y WHERE X.CID=Y.CID AND X.SID='850955252' --(15)查詢學生的基本資訊及選修課程編號和成績 SELECT STUDENTS.SID,SNAME,STUDENTS.EMAIL,GRADE,CHOICES.CID,SCORE FROM STUDENTS,CHOICES WHERE STUDENTS.SID=CHOICES.SID --(16)查詢學號850955252的學生的姓名和選修的課程名稱及成績 SELECT STUDENTS.SNAME,COURSES.CNAME,CHOICES.SCORE FROM STUDENTS,COURSES,CHOICES WHERE STUDENTS.SID=CHOICES.SID AND COURSES.CID=CHOICES.CID AND STUDENTS.SID='850955252' --(17)查詢學號850955252的學生同年級的所有學生資料 SELECT * FROM STUDENTS WHERE GRADE IN( SELECT STUDENTS.GRADE FROM STUDENTS WHERE STUDENTS.SID='850955252' ) --(18)查詢所有的有選課的學生的詳細資訊 SELECT * FROM STUDENTS WHERE SID IN( SELECT SID FROM CHOICES ) /* SELECT * FROM STUDENTS WHERE SID IN( SELECT CHOICES.SID FROM CHOICES,STUDENTS WHERE STUDENTS.SID=CHOICES.SID ) */ --(19)查詢沒有學生選的課程的編號 SELECT CID FROM CHOICES WHERE SID NOT IN( SELECT SID FROM CHOICES ) /* SELECT CID FROM CHOICES WHERE CID NOT IN( SELECT CID FROM CHOICES )這兩個一樣嗎? */ --(20)查詢選修了課程名為C++的學生學號和姓名 SELECT STUDENTS.SID,STUDENTS.SNAME,COURSES.CNAME FROM STUDENTS,COURSES,CHOICES WHERE CHOICES.CID=COURSES.CID AND COURSES.CNAME='C++' /* SELECT SID,SNAME FROM STUDENTS WHERE SID IN( SELECT SID FROM CHOICES WHERE CID IN( SELECT CID FROM COURSES WHERE CNAME='C++' ) ) 問題:1.查詢結果是否相同? 2.如果結果相同,查詢時間為什麼不同?*/ --**********************************(21)找出選修課程成績最差的選課記錄 SELECT * FROM CHOICES WHERE CHOICES.SCORE >= ALL( SELECT SCORE FROM CHOICES WHERE SCORE IS NOT NULL ) --(22)找出和課程UML或課程C++的課時一樣的課程名稱 SELECT CNAME FROM COURSES WHERE HOUR IN( SELECT HOUR FROM COURSES WHERE CNAME='UML' OR CNAME='C++' ) /* SELECT CNAME FROM COURSES WHERE HOUR =SOME( SELECT HOUR FROM COURSES WHERE CNAME='UML' OR CNAME='C++' ) 問題:IN 和 =SOME 的區別在哪裡?*/ --(23)查詢所有選修編號10001的課程的學生的姓名 SELECT DISTINCT SNAME FROM STUDENTS,CHOICES WHERE STUDENTS.SID=CHOICES.SID AND CID='10001' /* SELECT SNAME FROM STUDENTS WHERE EXISTS( SELECT * FROM CHOICES X WHERE X.CID='10001' AND X.SID=STUDENTS.SID ) 問題:區別在哪裡?*/ --**********************************(24)查詢選修了所有課程的學生姓名 SELECT SNAME FROM STUDENTS WHERE NOT EXISTS( SELECT * FROM COURSES AS X WHERE NOT EXISTS( SELECT * FROM CHOICES AS Y WHERE Y.SID=STUDENTS.SID AND Y.CID=X.CID ) ) --(25)利用集合運算,查詢選修課程C++或課程Java的學生的編號 SELECT CHOICES.SID FROM CHOICES,COURSES WHERE (COURSES.CNAME='C++' OR COURSES.CNAME='JAVA') AND CHOICES.CID=COURSES.CID --(26)實現集合交運算,查詢既選修課程C++又選修課程Java的學生的編號 SELECT CHOICES.SID FROM CHOICES,COURSES WHERE (COURSES.CNAME='C++' AND COURSES.CNAME='JAVA') AND CHOICES.CID=COURSES.CID --(27)實現集合減運算,查詢選修課程C++而沒有選修課程Java的學生的編號 SELECT CHOICES.SID FROM CHOICES,COURSES WHERE (COURSES.CNAME='C++' AND COURSES.CNAME<>'JAVA') AND CHOICES.CID=COURSES.CID