數據庫實驗

表的創建:

① 創建一數據庫Temp,在數據庫中創建教材中的Student 表、Course 表和SC表。

② 向表中插入內容並設定表的主碼、外碼約束關係。

 

2)基於以上創建的表,完成如下基本SQL查詢語句。

①  查詢信息系和計算機系的學生,並按學生所在系和學號排序。

②  查詢學生表中最小的年齡。

③  查詢課程名中包含“設計”的課程名。

④  查詢先行課程爲空值的課程號、課程名及學分。

⑤  查詢李勇選修的數據庫課程的成績。

⑥  查詢平均成績80分以上的學生的學號。

⑦  求計算機系沒有選修數據庫課程的學生姓名。

⑧  求至少選修了學號爲S1所選修的全部課程的學生學號。

⑨  求各系的系的學生人數,並將結果按學生人數的降序排序。

⑩  查詢選修了數據庫課程並且成績高於該門課程平均分的學生學號和成績。

 

3)基於以上創建的表,利用SQL語句完成如下操作。

 

①  將學習了數據庫課程的學生成績加5分。

②  將選修了2號課程且成績爲空的選課記錄刪除。

③  從課程表中刪除在選課表中沒有選課記錄的課程記錄。

④  求各系的系名及男女生人數並將結果保存到另一個表中。

⑤  將平均成績80分以上的學生的學號、選學的課程數和平均成績保存到另一個表中。

⑥  創建一個視圖,求選修了2號課程且成績高於該門課程平均分的學生學號和成績。

⑦  創建用戶user1,將學生表select權限賦給用戶user1,然後以user1登錄,檢查權限情況。

⑧  收回用戶user1的對學生表的select權限,然後以user1登錄,檢查權限情況。

①
  /* 查詢信息系和計算機系的學生,並按學生所在系和學號排序。*/
SELECT *
FROM Student
  ORDER BY Sdept,Sage DESC;
  /*Sdept升序  Sage降序*/

②
  /*查詢學生表中最小的年齡。*/
SELECT MIN(Sage)
FROM Student
/*最小年齡爲18*/

③
  /*查詢課程名中包含“設計”的課程名。*/
SELECT *
FROM Course
WHERE Cname = '設計';

④
  /*查詢先行課程爲空值的課程號、課程名及學分。*/
SELECT Cno,Cname,Ccredit
FROM Course
WHERE Cpno IS NULL;
/*IS不能用等號代替*/

⑤
  /*查詢李勇選修的數據庫課程的成績。*/
SELECT Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno   AND 
         Student.Sname='李勇' AND
	     Course.Cno=SC.Cno    AND
	     Course.Cname='數據庫';

⑥
  /*查詢平均成績80分以上的學生的學號。*/
SELECT Sno
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>80;

⑦
  /*求計算機系沒有選修數據庫課程的學生姓名。*/
SELECT Sname
FROM Student
WHERE Sdept = 'CS' AND NOT EXISTS
(
       SELECT *
	   FROM SC,Course
	   WHERE Student.Sno = SC.Sno AND
	         Course.Cno = SC.Cno AND
	         Course.Cname = '數據庫'
);

⑧
  /*求至少選修了學號爲201215127所選修的全部課程的學生學號。*/
SELECT DISTINCT Sno
FROM SC SCX 
WHERE NOT EXISTS
(
    SELECT *
	FROM SC SCY
	WHERE SCY.Sno = '201215127' AND
	      NOT EXISTS
		  (
		      SELECT *
			  FROM SC SCZ
			  WHERE SCZ.Sno = SCX.Sno AND
			        SCZ.Cno = SCY.Cno
		  )
)

⑨  
   /*求各系的系的學生人數,並將結果按學生人數的降序排序。*/
SELECT Sdept,COUNT(*) 學生人數
FROM Student
GROUP BY Sdept 
ORDER BY COUNT(*) DESC;

⑩
  /* 查詢選修了數據庫課程並且成績高於該門課程平均分的學生學號和成績。*/
SELECT SC.Sno,Grade
FROM SC,Course
WHERE SC.Cno = Course.Cno AND
      Course.Cname = '數據庫' AND
      SC.Grade >
	  (
	      SELECT AVG(Grade)
		  FROM Course,SC 
		  WHERE Course.Cname = '數據庫' AND
		         Course.Cno = SC.Cno
	  );

(2)
①
  /*將學習了數據庫課程的學生成績加5分。*/
UPDATE SC
SET Grade = Grade + 5
WHERE Cno IN
(
    SELECT Cno
	FROM Course
	WHERE Cname = '數據庫'
);

②
/*將選修了2號課程且成績爲空的選課記錄刪除。*/
DELETE 
FROM SC
WHERE Cno = 2 AND Grade IS NULL;


③
  /*從課程表中刪除在選課表中沒有選課記錄的課程記錄。*/
DELETE 
FROM Course
WHERE Cno NOT IN
(
    SELECT DISTINCT Cno
	FROM SC
);

④
  /*求各系的系名及男女生人數並將結果保存到另一個表中。*/
CREATE TABLE TB4
(    Sdept CHAR(15),
       Sex CHAR(10),
       Num CHAR(10) 
);
INSERT
INTO TB4(Sdept,Sex,Num)
SELECT Sdept,Ssex,COUNT(Sno)
FROM Student
GROUP BY Sdept,Ssex;

⑤
  /*將平均成績80分以上的學生的學號、選學的課程數
和平均成績保存到另一個表中。*/
CREATE TABLE TB5
(    Sno CHAR(20),
       CouNum CHAR(10),
	   AvgGrade CHAR(15)
);
INSERT 
INTO TB5(Sno,CouNum,AvgGrade)
SELECT Sno,COUNT(Cno),AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(GRADE) > 80;

⑥
  /*創建一個視圖,求選修了2號課程且成績
高於該門課程平均分的學生學號和成績。*/
CREATE VIEW BT6(Sno,Grade)
AS
SELECT Sno,Grade
FROM SC 
WHERE Cno = 2 AND Grade >(
     SELECT AVG(Grade)
	 FROM SC
	 WHERE Cno = 2
);

⑦
  /*創建用戶user1,將學生表select權限賦給用戶user1,
然後以user1登錄,檢查權限情況。*/
CREATE LOGIN user1 WITH PASSWORD='123456'
CREATE USER user1
USE Temp
GO
GRANT SELECT 
ON Student
TO user1;
⑧
  /*收回用戶user1的對學生表的select權限,
然後以user1登錄,檢查權限情況。*/
USE Temp
GO
REVOKE SELECT
ON Student
FROM user1;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章