• 实训三:多表查询 - 大学数据库创建与查询实战


    第1关:数据库表设计

    任务描述

    本关任务:创建大学数据库的教师信息表和开课信息表。

    相关知识

    大学数据库的整体设计

    一个大学里面会有很多教学楼、学生、老师,他们之间的都有着密不可分的关系,因此将大学数据库整体设计如下图所示,总共涉及到八张表:

    1. 学生表(student):包含学生学号 ID,学生姓名 name,学生所在系 dept_name,总学分 tot_cred 属性。

    2. 课程表(course):包含课程号 course_id,课程名称 title,课程所属的系名 dept_name,学分 credits 属性。

    3. 系表(department):包含系名 dept_name,建筑 building,预算 budget 属性。

    4. 教室表(classroom):包含建筑 building,房间号 room_number,容量 capacity 属性。

    5. 教学信息表(teaches):包含教室号 ID,课程号 course_id,课程信息序号 sec_id,学期 semester,年份 year 属性。

    6. 选课信息表(takes):包含学生学号 ID,课程标识 course_id,课程段标识 sec_id,学期 semester,年份 year,成绩 grade 属性。

    7. 教师信息表(instructor)。

    8. 开课信息表(section)。

    image

    图1 大学数据库模型

    教师信息表(instructor)

    教师信息表的具体属性及约束如下:

    字段名称类型备注约束
    IDvarchar(5)教师号主键
    namevarchar(20)教师名字非空
    dept_namevarchar(20)教师所在的系外键
    salarynumeric(8,2)薪资底薪大于 29000

    开课信息表(section)

    开课信息表的具体属性及约束如下:

    字段名称类型备注约束
    course_idvarchar(8)课程号外键
    sec_idvarchar(8)课程段标识
    semestervarchar(6)学期只能插入 FallWinterSpringSummer四个值。
    yearnumeric(4,0)年份1701 < year < 2100
    buildingvarchar(15)课程所在建筑外键
    room_numbervarchar(7)课程所在教室号外键
    time_slot_idvarchar(4)时间档序号

    section 表的主键由 course_idsec_idsemesteryear 四个属性共同组成。

    编程要求

    在右侧编辑器中的Begin-End之间补充代码,创建教师信息表和开课信息表(其他六张表系统已为你创建完成),使用 universityDB 数据库,创建的表命名依次为 instructorsection

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    每次点击评测后台都会将数据库环境重置,数据库 universityDB 会自动创建好。

    预期输出:

    +------------------------+
    | Tables_in_universityDB |
    +------------------------+
    | classroom              |
    | course                 |
    | department             |
    | instructor             |
    | section                |
    | student                |
    | takes                  |
    | teaches                |
    +------------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    开始你的任务吧,祝你成功!

    参考代码

    #请在此添加创建开课信息表的SQL语句
    ########## Begin ##########
    #请在此添加创建开课信息表的SQL语句
    ########## Begin ##########
    use universityDB;
    create table instructor(
        ID varchar(5) COMMENT'教师号',primary key(ID),
        name varchar(20) COMMENT'教师名字'NOT NULL,
        dept_name varchar(20) DEFAULT NULL COMMENT'教师所在的系',
        salary numeric(8,2) COMMENT'薪资' check(salary>29000),
        foreign key (dept_name) references department(dept_name)
            on delete set null
    );
    create table section(
        course_id varchar(8)  COMMENT '课程号' ,
        sec_id varchar(8) COMMENT'课程段标识',
        semester varchar(6) COMMENT'学期' check(semester in('Fall','Winter','Spring','Summer')),
        year numeric(4,0)  COMMENT'年份',
        building varchar(15)  COMMENT '课程所在建筑' ,
        room_number varchar(7)  COMMENT '课程所在教室号' ,
        time_slot_id varchar(4) COMMENT'时间档序号',
        primary key (course_id, sec_id, semester, year),
         foreign key (course_id) references course(course_id)
            on delete cascade,
         foreign key (building, room_number) references classroom(building, room_number)
            on delete set null
    );
     
    ########## End ##########
    
    ########## End ##########
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    第2关:查询(一)

    任务描述

    本关任务:编写 sql 语句,输出符合条件的查询结果。

    相关知识

    为了完成本关任务,下面列出你可能需要使用到的表及数据。

    学生表(student)

    其中 dept_name 是系表(department)的外键。

    IDnamedept_nametot_cred
    00128ZhangComp. Sci.102
    12345ShankarComp. Sci.32
    19991BrandtHistory80
    23121ChavezFinance110
    44553PeltierPhysics56
    45678LevyPhysics46
    54321WilliamsComp. Sci.54
    55739SanchezMusic38
    70557SnowPhysics0
    76543BrownComp. Sci.58
    76653AoiElec. Eng.60
    98765BourikasElec. Eng.98
    98988TanakaBiology120

    选课信息表(takes)

    其中 course_idsec_idsemesteryear 为开课信息表(section)的外键,ID 为学生表(student)的外键。

    IDcourse_idsec_idsemesteryeargrade
    00128CS-1011Fall2009A
    00128CS-3471Fall2009A-
    12345CS-1011Fall2009C
    12345CS-1902Spring2009A
    12345CS-3151Spring2010A
    12345CS-3471Fall2009A
    19991HIS-3511Spring2010B
    23121FIN-2011Spring2010C+
    44553PHY-1011Fall2009B-
    45678CS-1011Fall2009F
    45678CS-1011Spring2010B+
    45678CS-3191Spring2010B
    54321CS-1011Fall2009A-
    54321CS-1902Spring2009B+
    55739MU-1991Spring2010A-
    76543CS-1011Fall2009A
    76543CS-3192Spring2010A
    76653EE-1811Spring2009C
    98765CS-1011Fall2009C-
    98765CS-3151Spring2010B
    98988BIO-1011Summer2009A
    98988BIO-3011Summer2010null

    课程表(course)

    course_idtitledept_namecredits
    BIO-101Intro. to BiologyBiology4
    BIO-301GeneticsBiology4
    BIO-399Computational BiologyBiology3
    CS-101Intro. to Computer ScienceComp. Sci.4
    CS-190Game DesignComp. Sci.4
    CS-315RoboticsComp. Sci.3
    CS-319Image ProcessingComp. Sci.3
    CS-347Database System ConceptsComp. Sci.3
    EE-181Intro. to Digital SystemsElec. Eng.3
    FIN-201Investment BankingFinance3
    HIS-351World HistoryHistory3
    MU-199Music Video ProductionMusic3
    PHY-101Physical PrinciplesPhysics4

    教师信息表(instructor)

    其中 dept_name 字段为系表(department)的外键。

    IDnamedept_namesalary
    10101SrinivasanComp. Sci.68250
    12121WuFinance94500
    15151MozartMusic42000
    22222EinsteinPhysics99750
    32343El SaidHistory63000
    33456GoldPhysics91350
    45565KatzComp. Sci.78750
    58583CalifieriHistory65100
    76543SinghFinance84000
    76766CrickBiology75600
    83821BrandtComp. Sci.96600
    98345Kim Elec.Eng.84000

    系表(department)

    dept_namebuildingbudget
    BiologyWatson90000
    Comp. Sci.Taylor100000
    Elec. Eng.Taylor85000
    FinancePainter120000
    HistoryPainter50000
    MusicPackard80000
    PhysicsWatson70000

    编程要求

    在右侧编辑器中的Begin-End之间补充代码,完成下列查询:

    1. 查询修了‘ Biology ’所有课程的学生姓名;

    2. 查询满足工资至少比‘ Biology ’系某一个教师的工资高的所有教师的姓名;

    3. 查询所有教师的姓名,以及他们所在系的名称和系所在建筑的名称;

    4. 查询在包含‘ Watson ’字段的大楼开课的所有系名。

    测试说明

    补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。


    开始你的任务吧,祝你成功!

    代码参考

    #********* Begin *********#
    echo "
    select distinct name from student,takes,course
    where student.ID=takes.ID and takes.course_id=course.course_id
    and course.dept_name='Biology';
    
    select name from instructor where salary>any
    (select salary from instructor where dept_name='Biology');
    
    select name,department.dept_name,building from instructor,department
    where instructor.dept_name=department.dept_name;
    
    select distinct department.dept_name from course,department
    where course.dept_name=department.dept_name
    and building like '%Watson%';
    "
    #********* End *********#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    安全 开发 自己想搭建一个靶场
    查看TCP/UDP网络连接通信情况
    quarkus依赖注入之九:bean读写锁
    PHP学习笔记
    文件操作安全之-文件读取原理篇
    代码随想录1刷—字符串篇
    UITableView的学习笔记
    回归与聚类算法01
    基础ArkTS组件:二维码,滚动条与滑动条,多选框与多选框群组(HarmonyOS学习第三课【3.4】)
    基于物联网的自动灌溉系统的设计与实现
  • 原文地址:https://blog.csdn.net/qq_46373141/article/details/131361735