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

第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                |
+------------------------+

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

参考代码

#请在此添加创建开课信息表的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 ##########

第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 *********#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值