數據庫原理實驗報告


實驗一   熟悉SQL Server 2008環境及SQL 語言

實驗內容和步驟:

1.手動建庫:打開SQL Server 2008企業管理器,建立1個名為StudentDB1,數據文件名為StudentDB1_data、大小為10M,日志文件名為StudentDB1_log、大小為5M的新數據庫;

 

2. 手動建表:為數據庫StudentDB1創建四個表,教師T、課程C、學生S、選課SC,其結構為:

  • Ø 教師表T(教師號T#,教師名字TNAME,職稱TITLE);
  • Ø 課程表C(課程號C#,課程名稱CNAME,教師號T#); 
  • Ø 學生表S(學號S#,學生姓名SNAME,年齡AGE,性別SEX);
  • Ø 選課表SC(學號S#,課程號C#,成績,GRADE)。

 

將 S# C# 設置為外鍵

 

 

3.通過SQL語句建庫:在企業管理器中,使用SQL語句建立名為StudentDB2,數據文件名為StudentDB2_data、大小為10M,日志文件名為StudentDB2_log、大小為5M的新數據庫;(要求每個同學建立的數據庫的名稱為自己的學號,替換StudentDB2,注意全為數字名稱的數據庫在SQL語句中的用法)

create  database  [201811040806]--數據庫名
on primary( name = '201811040806_data',--數據文件名 filename = 'E:\數據庫\數據庫實驗\201811040806_data.mdf',--地址 size=10,--初始大小 maxsize=50,--最大大小 filegrowth=1--增長速率 ) log on( name = '201811040806_log',--日志文件名 filename = 'E:\數據庫\數據庫實驗\201811040806_log.ldf', size=5, maxsize=12, filegrowth=10% )

4.利用SQL語句,按照列表中的字段名(英文)、類型建立如下四個表結構 :

  • Ø 教師表T(教師號T#,教師名字TNAME,職稱TITLE);
use [201811040806]--調用數據庫
create table T( T# char(10) NOT NULL,--char 類型數據為固定長度,不滿自動補空格 TNAME nvarchar(5) NOT NULL,--varchar 類型數據為可變長度,不滿不會自動補空格;若有中文,前面 + n  TITLE nvarchar(5), primary key (T#)--設置主鍵 );
  • Ø 課程表C(課程號C#,課程名稱CNAME,教師號T#);
use [201811040806]
create table C( C# char(10) NOT NULL, CNAME nvarchar(10) NOT NULL, T# char(10) NOT NULL, primary key(C#), foreign key(T#) references T(T#)--設置外鍵 );
  • Ø 學生表S(學號S#,學生姓名SNAME,年齡AGE,性別SEX);
use [201811040806]
create table S( S# char(10) NOT NULL, SNAME nvarchar(5) NOT NULL, AGE int NOT NULL, SEX bit NOT NULL, primary key(S#) );
  • Ø 選課表SC(學號S#,課程號C#,成績,GRADE)。
use [201811040806]
create table SC( S# char(10) NOT NULL, C# char(10) NOT NULL, GRADE [int], primary key(S#,C#), foreign key(S#) references S(S#),--兩個外鍵 foreign key(C#) references C(C#) );

5.在StudentDB2的各個表中插入數據,用SQL語句實現。數據如下表:

use [201811040806]
insert into T values ('T1','ZHANG',NULL), ('T2','WU',NULL), ('T3','LIU',NULL), ('T4','ZHOU',NULL); use [201811040806]
insert into S values ('S1','TOM',20,1), ('S10','ZHOU',16,0), ('S2','JACK',20,1), ('S3','MARY',21,0), ('S4','WANG',21,0), ('S5','ZHAO',24,1) ('S6','LI',25,1), ('S7','DU',19,0), ('S8','TANG',19,1), ('S9','MAO',17,1); use [201811040806]
insert into C values ('C1','MATHS','T1'), ('C2','ENGLISH','T2'), ('C3','CHINESE','T3'), ('C4','PHYSICS','T3'), ('C5','COMPUTER','T4'); use [201811040806]
insert into SC values ('S1','C1',70), ('S1','C2',80), ('S1','C4',90), ('S10','C1',87), ('S2','C1',70), ('S2','C5',90), ('S3','C1',80), ('S3','C4',90), ('S4','C1',90), ('S4','C2',60), ('S5','C1',60), ('S5','C2',60), ('S5','C3',NULL), ('S5','C4',60), ('S5','C5',78), ('S6','C1',76), ('S7','C1',68), ('S7','C4',70), ('S8','C1',76), ('S9','C1',90);

6.S 表中增加“出生日期”屬性列;

use [201811040806]
alter table S add birthday char(10)

7.備份數據庫StudentDB2,再還原。

--備份
backup database [201811040806]
to disk='E:/數據庫/201811040806.bak'
--還原
use master restore database [201811040806]
from disk='E:/數據庫/201811040806.bak'

 

實驗二   數據操作

實驗內容和步驟

使用SQL語言完成各類查詢操作(單表查詢,連接查詢,嵌套查詢,集合查詢);完成各類更新操作(插入數據,修改數據,刪除數據)。

1. 用SQL語句在StudentDB2(數據庫名稱為學號)數據庫中表達下列查詢,寫出運行結果。

查詢操作:

①檢索年齡小於17歲的女學生的學號和姓名。

use [201811040806] 
select S#,SNAME from S where AGE<17 and SEX=0

②檢索男學生所學課程的課程名與課程號。

use [201811040806]
select distinct CNAME,C.C# --distinct 去除重復元組 from SC,S,C where SC.C#=C.C# and SC.S#=S.S# and S.SEX=1

③檢索男學生所學課程的任課教師的工號和姓名

use [201811040806] 
select T#,TNAME from T where T# in(select distinct T# from C where C# in(select distinct C# from SC where S# in(select S# from S where SEX=1)))

④檢索至少選修兩門課程的學生學號。

use [201811040806]
select distinct x.S# from SC as x,SC as y where x.S#=y.S# and x.C#<>y.C#

⑤檢索至少有學號S2和S4學生選修的課程的課程號。

use [201811040806] 
select distinct x.C# from SC as x,SC as y where x.C#=y.C# and (x.S#='S2' and y.S#='S1') 

⑥檢索WANG同學不學的課程的課程號。

use [201811040806]
select C# from C where C# not in(select C# from SC where S#=(select distinct S# from S where SNAME ='WANG'))

⑦檢索全部學生都選修的課程的課程號與課程名。

use [201811040806] 
select C#,CNAME from C where C# in(select C# from SC group by C# having COUNT(*)=(select COUNT(*) from S))

⑧檢索選修課程包含LIU老師所授課程的學生學號。

use [201811040806]
select distinct S# from SC where C# in(select C# from C where T#=(select T# from T where TNAME ='LIU'))

組合查詢:

①  統計有學生選修的課程門數。

use [201811040806] 
select COUNT(distinct C#) from SC

②  求選修C4課程的女學生的平均年齡。

use [201811040806]
select AVG(AGE) from S where SEX=0 and S# in(select S# from SC where C#='C4')

③  求LIU老師所授課程的每門課程的平均成績。

use [201811040806]
select C#,AVG(GRADE) from SC where C# in(select C# from C where T# =(select T# from T where TNAME = 'LIU')) group by C#

④ 統計每門課程的學生選修人數(超過10人的課程才統計)。要求顯示課程號和人數。

use [201811040806]
select C#,COUNT(*) from SC group by C# having COUNT(*)>10 

⑤  檢索學號比WANG同學大,而年齡比他小的學生姓名。

use [201811040806] 
select SNAME from S where S#>(select S# from S where SNAME ='WANG') and AGE<(select AGE from S where SNAME ='WANG')

⑥ 在表SC中檢索成績為空值的學生學號和課程號。

use [201811040806]
select S#,C# from SC where GRADE is NULL

⑦  檢索姓名以L打頭的所有學生的姓名和年齡。

use [201811040806]
select SNAME,AGE from S where SNAME LIKE('L%')

⑧ 求年齡大於女同學平均年齡的男學生姓名和年齡。 

use [201811040806]
select SNAME,AGE from S where SEX=1 and AGE>(select AVG(AGE)  from S  where SEX=0 )

2. 使用SQL進行數據完整性控制。

①用戶定義完整性:學生年齡<30。

use [201811040806]
alter table S add constraint u1 check (AGE<30)

用實驗驗證當操作違反了完整性約束時,系統如何處理?

如:在S中插入一條記錄,年齡 > 30

use [201811040806]
insert into S values ('S11','QI',31,1,NULL)

②修改SC中的約束條件,成績在0-100之間。

use [201811040806]
alter table SC add constraint u2 check (GRADE<=100 and GRADE >=0)

用實驗驗證當操作違反了完整性約束時,系統如何處理?

如:在SC中插入一條記錄,成績不在0-100之間

use [201811040806]
insert into SC values ('S1','C5',300)

3. 數據更新。(全部做)

①求某門課的平均成績,並把結果存入數據庫;

use [201811040806]
create table average( C# char(10) NOT NULL, AVGGRADE [int], primary key(C#), foreign key(C#) references C(C#) ); use [201811040806]
insert into average select C#,AVG(GRADE) from SC group by C#

②將選LIU老師所授課的全體學生的成績置零。

update SC set GRADE = 0
where C# in(select C# from C where T# in(select T# from T where TNAME ='LIU'))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM