這是第三次上機內容以及結果,本次的程序是基於第二次上機時候的建立好的表格。所有完整代碼在我空間的代碼庫中均存放,可以直接運行。
上機實驗五 SELECT語句的使用(二)
一、實習目的
掌握SELECT語句的嵌套使用方法,能適用SQL Server對錶作複雜查詢。
二、實習準備
1.複習SELECT語句較高級格式的使用。
2.瞭解集合函數在分組查詢中的使用規則。
三、實驗內容
使用嵌套查詢和表的連接查詢分別完成以下查詢語句:
(1) 找出與李勇在同一個班級的學生信息。
(2) 找出所有與李勇有相同選修課的學生信息。
(3) 找出年齡介於學生李勇和25歲之間的學生信息。
(4) 找出選修了課程操作系統的學生學號和姓名。
(5) 找出所有沒有選修1號課程的學生姓名。
(6) 找出選修了全部課程的學生姓名。
完成以下查詢:
(1) 查詢選修了3號課程的學生學號及其成績,並按成績的降序排列。
(2) 查詢全體學生信息,要求查詢結果按班級號升序,同一班級學生按年齡降序排列。
(3) 求每個課程號相應的選課人數。
(4) 查詢選修了3門以上課程的學生學號。
四、實習報告內容
1.寫出上述操作的SQL語句。
2.使用存在量詞[NOT] EXISTS的嵌套查詢時,何時外層查詢的WHERE條件爲真,何時爲假?
3.當既能用連接查詢又能用嵌套查詢時,應該選擇哪種比較好?爲什麼?
上機實驗六 SQL的存儲操作
一、實習目的
掌握用交互式SQL語句對已建基本表進行存儲操作:修改,刪除,插入,加深對數據的完整性的理解。
二、實習準備
1.複習數據的完整性,在進行數據的修改、刪除、插入時,要注意保證數據的一致性。
2.複習UPDATE、DELETE、INSERT語句與子查詢的結合使用。
三、實習內容
完成以下查詢語句:
(1) 對每個班,求學生的平均年齡,並把結果存入數據庫。
(2) 將01311班的全體學生的成績置零。
(3) 刪除2001級計算機軟件班全體學生的選課記錄。
(4) 學生李勇已退學,從數據庫中刪除有關他的記錄。
四、實習報告內容
1.寫出上述操作的SQL語句。
2.DROP和DELETE命令的本質區別是什麼?運行代碼:
/*************上機試驗五************************/
/**找出與李勇在同一個班級的學生信息**/
SELECT Sno '學號',Sname '姓名',Ssex '性別',Sage '年齡',Clno '班級'
FROM Student
WHERE Clno =
(SELECT Clno
FROM Student
WHERE Sname = '李勇');
/**找出所有與李勇有相同選修課的學生信息**/
SELECT *
FROM Student
WHERE Sno IN
(SELECT Sno
FROM Grade
WHERE Cno IN
(SELECT Cno
FROM Grade
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sname='李勇')));
/**找出年齡介於學生李勇和25歲之間的學生信息**/
SELECT *
FROM Student
WHERE Sage BETWEEN
(SELECT Sage
FROM Student
WHERE Sname = '李勇') AND 25;
/**找出所有沒有選修1號課程的學生姓名**/
SELECT Sname '姓名'
FROM Student
WHERE Sno NOT IN
(SELECT Sno
FROM Grade
WHERE Cno = '1');
/**找出選修了全部課程的學生姓名**/
SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
FROM Course
WHERE NOT EXISTS (SELECT *
FROM Grade
WHERE Student.Sno=Grade.Sno and Course.Cno=Grade.Cno));
/**查詢選修了3號課程的學生學號及其成績,並按成績的降序排列**/
SELECT Sno '學號', Gmark '成績'
FROM Grade
WHERE Cno = '3' ORDER BY Gmark DESC;
/**查詢全體學生信息,要求查詢結果按班級號升序,同一班級學生按年齡降序排列**/
SELECT *
FROM Student
ORDER BY Clno,Sage DESC;
/**求每個課程號相應的選課人數**/
SELECT Cno '課程號',COUNT(*) '選課人數'
FROM Grade
GROUP BY Cno;
/**查詢選修了3門以上課程的學生學號**/
SELECT Sno
FROM Grade
GROUP BY Sno HAVING COUNT(*)>3;
/**********上機作業六***************/
/**對每個班,求學生的平均年齡,並把結果存入數據庫**/
/*第一種方法建立新的數據庫*/
DROP TABLE Savage;
CREATE TABLE Savage(
Clno Char(5) NOT NULL,
Avage Smallint
);
INSERT INTO Savage(Clno,Avage)
SELECT Clno,AVG(Sage)
FROM Student
GROUP BY Clno;
/*第二種方法在Class表中新建一個屬性列*/ /*一直出錯誤,錯在哪了。。。*/
/*ALTER TABLE Class add Avage Smallint;
UPDATE Class
SET Avage = AVG(Sage)
FROM Class,Student
GROUP BY Clno HAVING Student.Clno =Class.Clno;*/
/**將01311班的全體學生的成績置零**/
UPDATE Grade
SET Gmark=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Clno = '01311');
/**刪除2001級計算機軟件班全體學生的選課記錄**/
DELETE
FROM Grade
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Clno = (
SELECT Clno
FROM Class
WHERE Speciality = '計算機軟件' AND Inyear = '2001'));
/**學生李勇已退學,從數據庫中刪除有關他的記錄**/
/*受影響的表爲Class Grade Student (新建的Savage 表先不考慮)*/
UPDATE Class
SET Number = Number-1
WHERE Clno =
(SELECT Clno
FROM Student
WHERE Sname = '李勇');
DELETE
FROM Grade
WHERE Sno =
(SELECT Sno
FROM Student
WHERE Sname = '李勇');
DELETE
FROM Student
WHERE Sname = '李勇';