表的創建:
① 創建一數據庫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;