《數據庫原理與應用》(第三版)書後上機練習題——第六章
書上給的三個表的數據
題目錯誤的地方
- 所有關於VB課的題目,這裏可以選擇把表中的Java課改成VB課,或者把題目中的VB課改爲Java課
- 我這裏是把題目中的VB課改爲Java課來寫的
- 18題: 查詢選課人數最多的前兩名學生的學號和選課門數,包括並列的情況。
- 這裏不通順應該是: 選課門數最多的前兩名學生
答案
題1.查詢學生選課表中的全部數據。
SELECT * FROM SC
題2.查詢計算機系的學生姓名、年齡。
SELECT Sname,Sage FROM Student WHERE Sdept='計算機系'
題3.查詢成績在70 ~ 80 分之間的學生學號、課程號和成績。
SELECT Sno,Cno,Grade FROM SC WHERE Grade BETWEEN 70 AND 80
題4.查詢計算機系年齡在18 ~ 20且性別爲“男”的學生姓名、年齡。
SELECT Sname,Sage FROM Student
WHERE Sdept='計算機系' AND Sage BETWEEN 18 AND 20 AND Ssex='男'
題5.查詢“c01” 課程最高分。
SELECT MAX(Grade) AS c01的最高分 FROM SC WHERE Cno = 'c01'
題6.查詢計算機系學生的最大年齡和最小年齡。
SELECT MAX(Sage) AS 計算機系的最大年齡,MIN(Sage) AS 計算機系的最小年齡 FROM Student
WHERE Sdept = '計算機系'
題7.統計每個系的學生人數。
SELECT Sdept,COUNT(*) AS 學生人數 FROM Student GROUP BY Sdept
題8.統計每個學生的選課門數和考試總成績,並按選課門數升序顯示結果(不包括沒選課的學生)。
SELECT Sno,COUNT(*) AS 選課門數,SUM(Grade) AS 總成績 FROM sc GROUP BY Sno
ORDER BY COUNT(*) ASC
題9.查詢總成績超過200分的學生,列出學號、總成績。
SELECT Sno,SUM(Grade) AS 總成績 FROM SC
GROUP BY Sno HAVING SUM(Grade)>200
題10.查詢選了“c02”課程的學生姓名和所在系。
SELECT Sname,Sdept FROM Student S JOIN SC ON S.Sno = SC.Sno
WHERE Cno = 'c02'
題11.查詢成績80分以上的學生姓名、課程號和成績,並按成績降序排列結果。
SELECT Sname,Cno,Grade FROM Student S JOIN SC ON S.sno = SC.sno
WHERE Grade>80 ORDER BY Grade DESC
題12.查詢哪些學生沒有選課,要求列出學號、姓名和所在系。
SELECT S.Sno,Sname,Sdept FROM Student S LEFT JOIN SC ON S.Sno = SC.Sno
WHERE SC.Cno is NULL
題13.統計每門課程的選課人數,列出課程號和選課人數(包括沒人選的課程)。
SELECT C.Cno,COUNT(SC.Sno) AS 選課人數 FROM Course C LEFT JOIN SC
ON C.Cno = SC.Cno GROUP BY C.Cno
題14.查詢與"VB""Java"在同一學期開設的課程的課程名和開課學期。
/*題目應該是 查詢與“Java"在同一學期開設的課程的課程名和開課學期。*/
SELECT Cname,Semester FROM Course
WHERE Semester IN (
SELECT Semester FROM Course WHERE Cname='Java')
題15.查詢與李勇年齡相同的學生的姓名、所在系和年齡。
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage IN (
SELECT Sage FROM Student WHERE Sname='李勇')
題16.查詢計算機系年齡最小的兩名學生的姓名和年齡。
SELECT TOP 2 WITH TIES Sname,Sage FROM Student
WHERE Sdept='計算機系'
ORDER BY Sage ASC
題17.查詢"VB"“Java"成績最高的前兩名學生的姓名、所在系和"VB”"Java"成績,包括並列的情況。
/*題目應該是 查詢Java成績最高的前兩名學生的姓名,所在系和Java成績,包括並列情況*/
SELECT TOP 2 WITH TIES Sname,Sdept,Grade
FROM Student S JOIN SC ON S.Sno=SC.Sno
JOIN Course C ON C.Cno=SC.Cno
WHERE Cname = 'Java'
ORDER BY Grade DESC
題18.查詢選課人數門數最多的前兩名學生的學號和選課門數,包括並列的情況。
/*題目應該是 查詢選課門數組多的前兩名學生的學號和選課門數,包括並列情況*/
SELECT TOP 2 WITH TIES Sno,COUNT(*) AS 選課門數
FROM SC GROUP BY Sno ORDER BY COUNT(*) DESC
題19.查詢學生人數最多的系,列出系名和人數。
SELECT TOP 1 Sdept,COUNT(*) AS 人數 FROM Student
GROUP BY Sdept ORDER BY COUNT(*) DESC
題20.用子查詢實現如下查詢:
(1)查詢選修了"c01"號課程的學生的姓名和所在系。
SELECT Sname,Sdept FROM Student
WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = 'c01')
(2)查詢數學系成績在80分以上的學生學號、姓名、課程號和成績。
SELECT Student.Sno,Sname,Cno,Grade FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Student.Sno IN(SELECT Sno FROM Student WHERE Sdept = '數學系')
AND SC.Sno IN(SELECT Sno FROM SC WHERE Grade > 80)
(3)查詢計算機系考試成績最高的學生姓名。
SELECT Sname FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept = '計算機系' AND Grade = (SELECT MAX(Grade) FROM
SC JOIN Student ON SC.Sno=Student.Sno WHERE Sdept = '計算機系')
(4)查詢數據結構考試成績最高的學生姓名、所在系、性別和成績。
SELECT Sname,Sdept,Ssex,Grade FROM Student
JOIN SC ON Student.Sno=SC.Sno
JOIN Course ON SC.Cno=Course.Cno
WHERE Cname='數據結構' AND Grade=(SELECT MAX(Grade)
FROM SC JOIN Course ON SC.Cno=Course.Cno WHERE Cname='數據結構')
題21.查詢沒選"VB""Java"課程的學生姓名和所在系。
/*題目應該是 查詢沒選“Java*課程的學生姓名和所在系*/
SELECT Sname,Sdept FROM Student
WHERE Sno IN(SELECT Sno FROM SC JOIN Course ON SC.Cno = Course.Cno
WHERE Cname != 'Java')
題22.查詢計算機系沒有選課的學生的姓名和性別。
SELECT Sname,Ssex FROM Student
LEFT JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept='計算機系' AND SC.Sno IS NULL
題23.查詢計算機系考試平均成績最低的學生的姓名以及所選的課程名。
SELECT Sname,Cname FROM Student
JOIN SC ON Student.Sno=SC.Sno
JOIN Course ON SC.Cno=Course.Cno
WHERE Student.Sno IN
(SELECT TOP 1 WITH TIES Student.Sno
FROM Student JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept='計算機系'
GROUP BY Student.Sno ORDER BY AVG(Grade) ASC)
題24.查詢1 ~ 5學期中,選課人數最少的課程的課程名、開課學期和學分。
SELECT Cname,Semester,Credit FROM Course
WHERE Cno IN
(SELECT TOP 1 WITH TIES Cno FROM SC
WHERE Cno IN
(SELECT Cno FROM Course
WHERE Semester
BETWEEN 1 AND 5)
GROUP BY Cno ORDER BY COUNT(Sno)
)
/*對1到5學期的課程號進行分組,根據學生數量排序(就是選課人數)*/
題25.查詢計算機系每個學生的考試情況,列出姓名、課程名和考試成績,並將查詢結果保存到一個新表中。新表名爲: Computer_Dept。
/*查詢計算機系每個學生的考試情況,列出姓名、課程名和考試成績,並將查詢結果保存到一個新表中。新表名爲: Computer_Dept*/
SELECT Sname,Cname,Grade INTO Computer_Dept
FROM Student
LEFT JOIN SC ON Student.Sno=SC.Sno
LEFT JOIN Course ON SC.Cno=Course.Cno
WHERE Sdept='計算機系'
題26.創建一個新表,表名爲test _t,其結構爲(COLI, COL2, COL3),其中:
CREATE TABLE test_t(
COL1 int,
COL2 char(10) not NULL,
COL3 char(10)
)
INSERT INTO test_t(COL2) VALUES('B1')
INSERT INTO test_t(COL1,COL2,COL3) VALUES(1,'B2','C2')
INSERT INTO test_t(COL1,COL2) VALUES(2,'B3')
題27.刪除考試成績低於50分的學生的選課記錄。
DELETE FROM SC WHERE Grade < 50
沒有低於50分的
題28.刪除沒有人選的課程。
DELETE FROM Course
WHERE Cno NOT IN(SELECT Cno FROM SC)
刪了兩個課程 c03計算機網路,c08離散數學
題29.刪除計算機系"VB"“Java"成績不及格學生的"VB”"Java"選課記錄。
DELETE FROM SC
FROM SC JOIN Student ON Student.Sno=SC.Sno
JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java' AND Grade < 60 AND Sdept='計算機系'
沒有不及格的
題30.刪除"VB"“Java"考試成績最低的學生的"VB”"Java"選課記錄。
DELETE FROM SC
FROM SC JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java' AND Grade=(
SELECT MIN(Grade) FROM SC
JOIN Course ON Course.Cno=SC.Cno
WHERE Cname='Java')
刪除了9521103 c02 68 這條記錄
題31.將第2學期開設的所有課程的學分增加2分。
UPDATE Course SET Credit=Credit+2
WHERE Semester=2
高等數學學分從8變爲10
題32.將VBJava課程的學分改爲3分。
UPDATE Course SET Credit=3
WHERE Cname='Java'
題33.將計算機系學生的年齡增加1歲。
UPDATE Student SET Sage=Sage+1
WHERE Sdept='計算機系'
題34.將信息系學生的“計算機文化學”課程的考試成績加5分。
UPDATE SC SET Grade=Grade+5
FROM SC JOIN Course ON Course.Cno=SC.Cno
JOIN Student ON SC.Sno=Student.Sno
WHERE Sdept = '信息系' AND Cname='計算機文化學'
9521102 c01 分數從82變爲87
題35.將選課人數最少的課程的學分降低1分。
UPDATE Course SET Credit=Credit-1
WHERE Cno IN (
SELECT TOP 1 WITH TIES Cno
FROM SC GROUP BY Cno
ORDER BY COUNT(Sno) ASC)
數據庫基礎、數據結構、操作系統的學分從4、5、4變爲3、4、3
如有大佬發現錯誤,還請指正,感謝!