實驗二 資料物件的定義、單表資料查詢
實驗內容
1、建立資料庫Student_DB,並在此資料庫中用命令方式建立資料表(注意表中列的相關約束):
學生表:Student(Sno, Sname, Ssex, Sage, Sdept);
課程表:Course(Cno, Cname, Cpno, Ccredit);
學生選課表:SC(Sno, Cno, Grade)
學生表的邏輯設計:
欄位名 |
型別 |
長度 |
主碼/外碼 |
描述 |
是否可空 |
Sno |
char |
9 |
主碼 |
學號 |
× |
Sname |
char |
20 |
|
姓名 |
× |
Ssex |
char |
2 |
|
性別 |
√ |
Sage |
smallint |
|
|
年齡 |
√ |
Sdept |
char |
20 |
|
系別 |
√ |
課程表的邏輯設計:
欄位名 |
型別 |
長度 |
主碼/外碼 |
描述 |
是否可空 |
Cno |
char |
4 |
主碼 |
課程號 |
× |
Cname |
char |
40 |
|
課程名 |
× |
Cpno |
char |
4 |
外碼 |
先修課程號 |
√ |
Ccredit |
smallint |
|
|
學分 |
√ |
選課表的邏輯設計:
欄位名 |
型別 |
長度 |
主碼/外碼 |
描述 |
是否可空 |
Sno |
char |
9 |
外碼 |
學號 |
× |
Cno |
char |
4 |
外碼 |
課程號 |
× |
說明:選課表的主碼:(Sno, Cno)
2、用SQL語言完成如下的操作(請給出SQL語句及相應執行結果的截圖):
(1)將學生表中年齡的資料型別改為整型。
Alter table student alter column sage int;
(2)向SC表中增加成績(Grade)列,其資料型別為短整型。
Alter table SC add Grade smallint;
(3)用SSMS方式向三個表中填充資料(參照課本P79頁)(此題可不用給出結果圖)。
(4)對Student表按學號降序建唯一索引。
Create index stu_index on student( sno desc);
(5)對Student表按學生姓名列建聚集索引,觀察能否建立成功,如未成功請分析原因。
Create cluster index sname_index on student (sname) ;
(6)刪除第(4)題建的索引。
Drop index stu_index;
3、用SQL語句完成如下對三個表的查詢(請給出SQL語句及執行結果的截圖):
(1)查詢所有課程的課程號和課程名。
(2)查詢全體學生的記錄。
(3)查詢學生表中的所有的系。
(4)查詢全體學生的姓名、出生年份和所在的院系,併為出生年份和所在院系兩列分別起別名為sbirth,department,並將系名全部轉換成小寫字母。
(5)求數學系學生的學號和姓名。
(6)查詢所有考試成績在80分以下的學生學號、課程號。
(7)查詢學分在2~7之間的課程資訊。
(8)查詢課程名為資料庫課程的課程號和學分。
(9)查詢沒有先修課的課程號、課程名及學分。
(10)查詢資訊系學生性別為男且年齡小於20歲的學生姓名。
(11)查詢選修了3號課程的學生的學號及成績,並要求對查詢結果按成績的降序排列,如果成績相同按學號的升序排列。
(12)查詢課程的總數。
(13)查詢選修2號課程的學生平均成績和最高成績,並分別為平均成績和最高成績起別名為AVG,MAX。
(14)查詢每個學生的選課門數,要求輸出學生學號及選課的門數。
(15)查詢選修了2門及以上的課程的學生學號。
實驗過程、存在的問題及解決辦法:
2、用SQL語言完成如下的操作(請給出SQL語句及相應執行結果的截圖)
(1)將學生表中年齡的資料型別改為整型。
Alter table student alter column sage int;
(2)向SC表中增加成績(Grade)列,其資料型別為短整型。
Alter table SC add Grade smallint;
(3)用SSMS方式向三個表中填充資料(參照課本P79頁)(此題可不用給出結果圖)。
(4)對Student表按學號降序建唯一索引。
Create unique index stu_index on student( sno desc);
(5)對Student表按學生姓名列建聚集索引,觀察能否建立成功,如未成功請分析原因。
Create clustered index sname_index on student (sname) ;
原因分析:
聚集索引是通過設定主碼來完成的,每個表的主碼都是聚集索引,一個表只能有一個聚集索引,非聚集索引可以有多個。因此無法重複建立聚焦索引。
(6)刪除第(4)題建的索引。
Drop index stu_index on student;
3、用SQL語句完成如下對三個表的查詢(請給出SQL語句及執行結果的截圖):
(1)查詢所有課程的課程號和課程名。
select Cno,Cname
from Course
(2)查詢全體學生的記錄。
select *
from student
(3)查詢學生表中的所有的系。
select Sdept
from student
(4)查詢全體學生的姓名、出生年份和所在的院系,併為出生年份和所在院系兩列分別起別名為sbirth,department,並將系名全部轉換成小寫字母。
select Sname,2018-Sage as sbirth,
Sdept as department,Lower(Sdept) departments
from student
(5)求數學系學生的學號和姓名。
select Sno,Sname,Sdept
from Student
where Sdept='MA'
(6)查詢所有考試成績在80分以下的學生學號、課程號。
select Sno,Cno
from SC
where grade<=80
(7)查詢學分在2~7之間的課程資訊。
select Ccredit,Cname
from Course
where Ccredit between 2 and 7
(8)查詢課程名為資料庫課程的課程號和學分。
select Cno,Ccredit
from Course
where Cname='資料庫'
(9)查詢沒有先修課的課程號、課程名及學分。
select Cno,Ccredit,Cname
from Course
where Cpno is NULL
(10)查詢資訊系學生性別為男且年齡小於20歲的學生姓名。
select Sname
from Student
where Ssex='男' and Sage<20 and Sdept='CS'
(11)查詢選修了3號課程的學生的學號及成績,並要求對查詢結果按成績的降序排列,如果成績相同按學號的升序排列。
select Sno,Grade
from SC
where Cno='3'
Order by Grade desc,Sno
(12)查詢課程的總數。
select COUNT(*) as 課程總數
from course
(13)查詢選修2號課程的學生平均成績和最高成績,並分別為平均成績和最高成績起別名為AVG,MAX。
select AVG(grade) as avg,MAX(Grade) as max
from sc
where cno='2'
(14)查詢每個學生的選課門數,要求輸出學生學號及選課的門數。
select Sno,COUNT(Cno) as 總門數
from sc
group by Sno
(15)查詢選修了2門及以上的課程的學生學號。
select Sno
from sc
group by Sno
having COUNT(*)>2
實驗總結:
1、掌握基本表的定義、結構的修改及刪除;
2、掌握索引的建立及刪除;
3、掌握Select語句的基本語法;
4、掌握Group By子句的作用和使用方法;
5、掌握聚集函式的使用;
6、掌握Order By子句的作用和使用方法;