数据库原理实验报告

 

实验一   熟悉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=3,--初始大小

maxsize=50,--最大大小

filegrowth=1--增长速率

)

log on(

name = '201811040806_log',--日志文件名

filename = 'E:\数据库\数据库实验\201811040806_log.ldf',

size=1,

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 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 distinct x.S#

from SC as x,SC as y

where x.S#=y.S# and x.C#<>y.C#

⑤检索至少有学号S2和S4学生选修的课程的课程号。

⑥检索WANG同学不学的课程的课程号。

use [201811040806]

select distinct C#

from C

where C# not in(select C#

                from SC

                where S#=(select distinct S#

                          from S

                          where SNAME ='WANG'))

⑦检索全部学生都选修的课程的课程号与课程名。

⑧检索选修课程包含LIU老师所授课程的学生学号。

use [201811040806]

select distinct S#

from SC

where C# in(select C#

            from C

            where T#=(select T#

                      from T

                      where TNAME ='LIU'))

组合查询:

①  统计有学生选修的课程门数。

②  求选修C4课程的女学生的平均年龄。

use [201811040806]

select AVG(AGE)

from S

where SEX=0 and S# in(select S#

                      from SC

                      where C#='C4')

③  求LIU老师所授课程的每门课程的平均成绩。

④ 统计每门课程的学生选修人数(超过10人的课程才统计)。要求显示课程号和人数。

use [201811040806]

select C#,COUNT(*)

from SC

group by C#

    having COUNT(*)>10 

⑤  检索学号比WANG同学大,而年龄比他小的学生姓名。

⑥ 在表SC中检索成绩为空值的学生学号和课程号。

use [201811040806]

select S#,C#

from SC

where GRADE is NULL;

⑦  检索姓名以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'))

猜你喜欢

转载自www.cnblogs.com/bjxqmy/p/11620342.html