• 数据库原理实验报告


    实验一   熟悉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'))

  • 相关阅读:
    3.31上午英语视频
    3.30上午
    leetcode 38
    leetcode 36
    leetcode 28
    leetcode 27
    leetcode 26
    leetcode 24
    leetcode 21
    leetcode 20
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/11620342.html
Copyright © 2020-2023  润新知