1. 程式人生 > >資料庫學習之旅——實驗2

資料庫學習之旅——實驗2

本次實驗的目的是對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