University 数据库(MariaDB):模式、表和 SQL 练习
University 是关于大学的 MariaDB 示例数据库:院系、教师、学生、课程、教学班、选课、成绩和科研。
在 SQLtest.online 上,你可以直接在浏览器中查询它:做自动判题的练习,或在练习场中运行自己的查询,无需安装任何软件。
16 张表和 7 个视图
2,000 名学生
24,981 条选课记录
7 道 SQL 练习
什么是 University
University 是为 MariaDB 11 设计的现代示例数据库,旨在成为经典 Sakila 的更丰富替代品。它规范化到第三范式,并使用了多种 MariaDB 数据类型:JSON、ENUM 和 SET、全文索引以及用于嵌入向量的 VECTOR 列。
数据量足以进行真正的分析:约 2.5 万条选课记录、30 万条成绩记录和超过 50 万行的审计日志。同时,这个主题对上过大学的人来说都很熟悉。
ER 图
该图展示了 University 的表以及它们之间的外键关系。点击可查看完整尺寸。
University 数据库 ER 图
数据库包含什么
这些表分为三组。
人员和组织
departments (树形结构)、faculty 、students 和 rooms 。
教学
courses 及 course_prerequisites 、semesters 、sections 、enrollments 和 grade_events 。
科研和奖学金
research_projects 、project_members 、publications 、scholarships 和 student_scholarships ,以及 audit_log 。
最需要记住的一点:学生选的不是课程本身,而是教学班-某门课程在某学期的具体开课。因此从学生到课程的路径是 enrollments → sections → courses 。七个视图(如 v_student_gpa 和 v_course_pass_rate )包含现成的报表。
各表的数据量:
表结构
点击表名可查看它的列、示例行和键。
表列表
semesters - 学术学期表。
semester_id 唯一记录标识符 (PK, TINYINT)
term 学期类型:秋季、春季或夏季 (ENUM)
academic_year 学年 (YEAR)
name 学期名称 (例如 'Fall 2024')
start_date 学期的第一天
end_date 学期的最后一天
enroll_deadline 学生注册的最后日期
is_active 学期是否当前有效 (BOOLEAN)
semester_id
term
academic_year
name
start_date
end_date
enroll_deadline
is_active
1
秋季
2024
2024 秋季
2024-09-02
2024-12-20
2024-09-13
1
主键,btree (semester_id)
唯一键 (term, academic_year)
rooms - 校园教室和实验室。
room_id 唯一记录标识符 (PK, SMALLINT)
building 建筑名称
room_number 房间号码或标签
capacity 最大座位数 (SMALLINT)
room_type 房间类型:讲座、研讨会、实验室、计算机实验室或在线 (ENUM)
has_projector 房间是否有投影仪 (BOOLEAN)
has_video 房间是否有视频会议设备 (BOOLEAN)
room_id
building
room_number
capacity
room_type
has_projector
has_video
1
科学大楼
101
120
讲座
1
0
主键,btree (room_id)
唯一键 (building, room_number)
scholarships - 可用奖学金和助学金。
scholarship_id 唯一记录标识符 (PK, SMALLINT)
name 奖学金名称
amount 奖励金额 (DECIMAL)
frequency 奖励频率:一次性、年度或每学期 (ENUM)
eligibility 资格标准作为 JSON - 例如 {"min_gpa": 3.5, "need_based": true}
is_active 奖学金是否当前提供 (BOOLEAN)
scholarship_id
name
amount
frequency
eligibility
is_active
1
院长优秀奖
5000.00
年度
{"min_gpa": 3.8, "need_based": false, "majors": ["CS","Math"]}
1
主键,btree (scholarship_id)
departments - 三层部门层级 (学院 → 部门 → 子部门)。
department_id 唯一记录标识符 (PK, TINYINT)
parent_id 父部门标识符 - 自引用外键 (可为空)
code 短部门代码 (CHAR)
name 部门名称
level 层级:1 = 学院,2 = 部门,3 = 子部门 (TINYINT)
head_faculty_id 部门负责人的标识符 (外键,可为空)
established 部门成立年份 (YEAR,可为空)
department_id
parent_id
code
name
level
head_faculty_id
established
1
[null]
ENG
工程学院
1
1
1965
主键,btree (department_id)
唯一键 (code)
外键 (parent_id) 参考 departments(department_id)
外键 (head_faculty_id) 参考 faculty(faculty_id)
faculty - 学术和行政人员。
faculty_id 唯一记录标识符 (PK, SMALLINT)
department_id 部门标识符 (外键)
first_name 教职员工的名字
last_name 教职员工的姓氏
email 机构电子邮件地址
phone 办公室电话号码 (可为空)
rank 学术职称:讲师、助理教授、副教授、教授或名誉教授 (ENUM)
hire_date 入职日期
office 办公室房间号码或位置 (可为空)
office_hours 每周办公时间作为 JSON 数组 - 例如 [{"day":"Mon","start":"10:00","end":"12:00"}]
bio 个人简介文本 (TEXT, 可为空)
is_active 教职员工是否当前有效 (BOOLEAN)
faculty_id
department_id
first_name
last_name
email
phone
rank
hire_date
office
office_hours
bio
is_active
1
3
Alice
Carter
a.carter@university.edu
+15550100
教授
2010-08-15
ENG-204
[{"day":"Mon","start":"10:00","end":"12:00"}]
分布式系统专家。
1
主键,btree (faculty_id)
唯一键 (email)
外键 (department_id) 参考 departments(department_id)
students - 注册学生。
student_id 唯一记录标识符 (PK, INT)
department_id 所属院系标识符 (FK)
student_number 唯一学号 (CHAR,例如 'S000123')
first_name 学生的名字
last_name 学生的姓氏
email 学生的电子邮件地址
date_of_birth 学生的出生日期
gender 性别:M、F、NB、Other 或 Prefer not to say (ENUM,可为空)
enrollment_date 学生首次入学日期
expected_grad 预计毕业年份 (YEAR,可为空)
status 学籍状态:active、inactive、graduated、suspended 或 withdrawn (ENUM)
gpa 累计 GPA 0.000–4.000,由触发器维护 (DECIMAL,可为空)
contacts 紧急联系人和地址(JSON),例如 {"emergency":{"name":"Jane Doe","phone":"+1-555-0100"}}
student_id
department_id
student_number
first_name
last_name
email
date_of_birth
gender
enrollment_date
expected_grad
status
gpa
contacts
1
3
S000123
James
Miller
j.miller@student.edu
2002-04-23
M
2021-09-01
2025
active
3.720
{"emergency":{"name":"Susan Miller","phone":"+1-555-0100"}}
主键,btree (student_id)
唯一键 (student_number)
唯一键 (email)
外键 (department_id) 参考 departments(department_id)
courses - 支持全文和向量搜索的课程目录。
course_id 唯一记录标识符 (PK, SMALLINT)
department_id 开课院系标识符 (FK)
code 课程代码,例如 'CS101' (CHAR)
title 课程名称
credits 学分数 (TINYINT)
level 学术层次:undergraduate、graduate 或 doctoral (ENUM)
description 详细课程描述 (TEXT,与 title 共同建立 FULLTEXT 索引)
is_active 课程当前是否开设 (BOOLEAN)
embedding 用于向量相似度搜索的 1536 维语义嵌入 (VECTOR(1536),可为空)
course_id
department_id
code
title
credits
level
description
is_active
embedding
1
3
CS301
Database Systems
3
undergraduate
Introduction to relational databases, SQL, and data modeling.
1
[0.023, -0.011, ...]
主键,btree (course_id)
唯一键 (code)
FULLTEXT (title, description)
外键 (department_id) 参考 departments(department_id)
course_prerequisites - 课程先修关系(自引用多对多)。
course_id 课程标识符 (FK)
prerequisite_id 先修课程标识符 (FK)
is_mandatory 先修课程是必修还是推荐 (BOOLEAN)
course_id
prerequisite_id
is_mandatory
5
1
1
主键,btree (course_id, prerequisite_id)
外键 (course_id) 参考 courses(course_id)
外键 (prerequisite_id) 参考 courses(course_id)
sections - 某学期开设的一个课程班。
section_id 唯一记录标识符 (PK, INT)
course_id 课程标识符 (FK)
semester_id 学期标识符 (FK)
faculty_id 授课教师标识符 (FK)
room_id 分配的教室标识符 (FK,可为空-完全在线时为 NULL)
section_number 课程/学期内的班号 (TINYINT)
delivery 授课方式:in-person、online 或 hybrid (ENUM)
max_capacity 最大选课人数 (SMALLINT)
status 课程班状态:open、closed、cancelled 或 completed (ENUM)
schedule 每周上课时间(JSON),例如 [{"day":"Mon","start":"09:00","end":"10:30"}]
section_id
course_id
semester_id
faculty_id
room_id
section_number
delivery
max_capacity
status
schedule
1
1
1
1
1
1
in-person
30
open
[{"day":"Mon","start":"09:00","end":"10:30"},{"day":"Wed","start":"09:00","end":"10:30"}]
主键,btree (section_id)
唯一键 (course_id, semester_id, section_number)
外键 (course_id) 参考 courses(course_id)
外键 (semester_id) 参考 semesters(semester_id)
外键 (faculty_id) 参考 faculty(faculty_id)
外键 (room_id) 参考 rooms(room_id)
enrollments - 学生选课记录。
enrollment_id 唯一记录标识符 (PK, INT)
student_id 学生标识符 (FK)
section_id 课程班标识符 (FK)
enrolled_at 选课日期和时间 (TIMESTAMP)
status 选课状态:enrolled、dropped、completed、failed 或 incomplete (ENUM)
final_grade 最终字母成绩,例如 'A'、'B+' (CHAR,可为空)
final_score 最终分数 0.00–100.00 (DECIMAL,可为空)
enrollment_id
student_id
section_id
enrolled_at
status
final_grade
final_score
1
1
1
2024-08-25 10:34:02
completed
A
93.50
主键,btree (enrollment_id)
唯一键 (student_id, section_id)
外键 (student_id) 参考 students(student_id)
外键 (section_id) 参考 sections(section_id)
student_scholarships - 授予学生的奖学金。
award_id 唯一记录标识符 (PK, INT)
student_id 学生标识符 (FK)
scholarship_id 奖学金标识符 (FK)
awarded_date 奖学金授予日期
expires_date 奖学金到期日期(可为空)
amount_awarded 实际授予金额 (DECIMAL)
notes 关于奖学金的附加说明 (TEXT,可为空)
award_id
student_id
scholarship_id
awarded_date
expires_date
amount_awarded
notes
1
1
1
2024-09-01
2025-08-31
5000.00
[null]
外键 (student_id) 参考 students(student_id)
外键 (scholarship_id) 参考 scholarships(scholarship_id)
research_projects - 教师主导的科研项目。
project_id 唯一记录标识符 (PK, SMALLINT)
department_id 院系标识符 (FK)
lead_faculty_id 项目负责人 (FK)
title 项目名称
abstract 项目描述 (TEXT,可为空)
start_date 项目开始日期
end_date 项目结束日期(可为空)
status 项目状态:proposed、active、completed 或 cancelled (ENUM)
funding 资金来源(JSON),例如 [{"source":"NSF","amount":150000,"grant_id":"NSF-2024-001"}]
project_id
department_id
lead_faculty_id
title
abstract
start_date
end_date
status
funding
1
5
1
AI-Assisted Drug Discovery
Using machine learning to identify candidate molecules.
2023-01-15
[null]
active
[{"source":"NSF","amount":150000,"grant_id":"NSF-2023-042"}]
外键 (department_id) 参考 departments(department_id)
外键 (lead_faculty_id) 参考 faculty(faculty_id)
publications - 支持全文搜索的科研论文。
publication_id 唯一记录标识符 (PK, INT)
project_id 关联的科研项目 (FK,可为空)
title 论文标题
abstract 论文摘要 (MEDIUMTEXT,与 title 共同建立 FULLTEXT 索引)
pub_year 发表年份 (YEAR)
venue 期刊或会议名称(可为空)
doi 数字对象标识符 DOI(可为空)
keywords 关键词标签,可取以下一个或多个值:AI、ML、Data Science、Networking、Security、Algorithms、Databases、HCI、Theory、Bioinformatics、Systems、Mathematics、Physics、Chemistry、Biology (SET)
citation_count 被引用次数 (INT)
publication_id
project_id
title
abstract
pub_year
venue
doi
keywords
citation_count
1
1
Deep Learning for Molecular Screening
We present a transformer-based architecture for virtual screening...
2024
Nature Machine Intelligence
10.1038/s42256-024-00001-1
AI,ML,Bioinformatics
12
主键,btree (publication_id)
唯一键 (doi)
FULLTEXT (title, abstract)
外键 (project_id) 参考 research_projects(project_id)
project_members - 教师和学生参与科研项目的记录。
member_id 唯一记录标识符 (PK, INT)
project_id 科研项目标识符 (FK)
faculty_id 教师标识符 (FK,可为空)
student_id 学生标识符 (FK,可为空)
role 成员角色:Principal Investigator、Co-Investigator、Research Assistant、Graduate Student 或 Undergraduate Student (ENUM)
joined_date 成员加入项目的日期
left_date 成员离开项目的日期(可为空)
member_id
project_id
faculty_id
student_id
role
joined_date
left_date
1
1
1
[null]
Principal Investigator
2023-01-15
[null]
外键 (project_id) 参考 research_projects(project_id)
外键 (faculty_id) 参考 faculty(faculty_id)
外键 (student_id) 参考 students(student_id)
grade_events - 每条选课记录的单项评分(约 120 000 行)。
event_id 唯一记录标识符 (PK, BIGINT)
enrollment_id 选课记录标识符 (FK)
item_name 评分项名称,例如 'Assignment 1'、'Midterm Exam'
item_type 评分项类型:assignment、quiz、midterm、final、project、participation 或 lab (ENUM)
score 得分 (DECIMAL)
max_score 满分,默认 100.00 (DECIMAL)
weight 占最终成绩的比例,例如 0.1500 表示 15% (DECIMAL)
graded_at 成绩录入日期和时间 (DATETIME)
grader_id 评分教师 (FK,可为空)
feedback 评分教师的反馈 (TEXT,可为空)
event_id
enrollment_id
item_name
item_type
score
max_score
weight
graded_at
grader_id
feedback
1
1
Midterm Exam
midterm
87.00
100.00
0.3000
2024-10-18 14:22:00
1
Good analysis, review section 3.
外键 (enrollment_id) 参考 enrollments(enrollment_id)
外键 (grader_id) 参考 faculty(faculty_id)
audit_log - 由触发器生成的行级变更历史(约 60 000 行)。
log_id 唯一记录标识符 (PK, BIGINT)
table_name 被修改的表名
record_id 被修改记录的主键 (BIGINT)
action 变更类型:INSERT、UPDATE 或 DELETE (ENUM)
changed_at 变更日期和时间 (TIMESTAMP)
changed_by 数据库用户或应用上下文(可为空)
old_values 变更前的列值(JSON,INSERT 时为 NULL)
new_values 变更后的列值(JSON,DELETE 时为 NULL)
log_id
table_name
record_id
action
changed_at
changed_by
old_values
new_values
1
enrollments
1
UPDATE
2024-12-21 09:05:33
app_user
{"status":"enrolled","final_score":null}
{"status":"completed","final_score":93.50}
视图
v_student_gpa - 每名学生每学期的加权 GPA。
student_id 学生标识符
student_number 唯一学号
first_name 学生的名字
last_name 学生的姓氏
semester_id 学期标识符
semester_name 学期名称
semester_gpa 本学期加权 GPA
credits_earned 本学期获得的学分
student_id
student_number
first_name
last_name
semester_id
semester_name
semester_gpa
credits_earned
1
S000123
James
Miller
1
Fall 2024
3.72
15
v_section_roster - 各课程班的选课学生及联系方式。
section_id 课程班标识符
course_code 课程代码
course_title 课程名称
semester_name 学期名称
student_id 学生标识符
student_number 唯一学号
first_name 学生的名字
last_name 学生的姓氏
email 学生的电子邮件地址
status 选课状态
section_id
course_code
course_title
semester_name
student_id
student_number
first_name
last_name
email
status
1
CS301
Database Systems
Fall 2024
1
S000123
James
Miller
j.miller@student.edu
enrolled
v_course_pass_rate - 各课程的历史通过率和平均分。
course_id 课程标识符
code 课程代码
title 课程名称
semester_id 学期标识符
semester_name 学期名称
total_enrolled 选课学生总数
passed 通过的学生人数
pass_rate 通过率(百分比)
avg_score 平均最终分数
course_id
code
title
semester_id
semester_name
total_enrolled
passed
pass_rate
avg_score
1
CS301
Database Systems
1
Fall 2024
28
25
89.29
81.40
v_faculty_workload - 每位教师每学期的授课班数和满员率。
faculty_id 教师标识符
first_name 教师的名字
last_name 教师的姓氏
semester_id 学期标识符
semester_name 学期名称
sections_taught 授课班数
total_capacity 所有课程班的总容量
total_enrolled 选课学生总数
fill_rate 满员率(百分比)
faculty_id
first_name
last_name
semester_id
semester_name
sections_taught
total_capacity
total_enrolled
fill_rate
1
Alice
Carter
1
Fall 2024
3
90
82
91.11
v_top_scholars - 按获得奖学金总额排名的学生。
rank_position 按奖学金总额的排名
student_id 学生标识符
student_number 唯一学号
first_name 学生的名字
last_name 学生的姓氏
total_scholarships 获得奖学金的次数
total_amount 所有奖学金 amount_awarded 的总和
rank_position
student_id
student_number
first_name
last_name
total_scholarships
total_amount
1
1
S000123
James
Miller
2
8500.00
v_publication_stats - 各院系每年的论文数和引用数。
department_id 院系标识符
department_name 院系名称
pub_year 发表年份
paper_count 发表论文数
total_citations 所有论文的总引用数
department_id
department_name
pub_year
paper_count
total_citations
3
Computer Science
2024
12
87
v_prerequisite_tree - 每门课程的直接先修课程。
course_id 课程标识符
course_code 课程代码
course_title 课程名称
prerequisite_id 先修课程标识符
prerequisite_code 先修课程代码
prerequisite_title 先修课程名称
is_mandatory 先修课程是必修还是推荐
course_id
course_code
course_title
prerequisite_id
prerequisite_code
prerequisite_title
is_mandatory
5
CS401
Advanced Database Systems
1
CS301
Database Systems
1
示例查询
这些查询展示了数据之间是如何关联的。复制任意一条,在练习场 中运行即可。
学生、课程和成绩 :从选课记录经由教学班到课程和学期。
SELECT s.first_name, s.last_name, c.code, sem.name AS semester, e.final_grade
FROM enrollments e
JOIN students s ON s.student_id = e.student_id
JOIN sections sec ON sec.section_id = e.section_id
JOIN courses c ON c.course_id = sec.course_id
JOIN semesters sem ON sem.semester_id = sec.semester_id
WHERE e.final_grade IS NOT NULL
ORDER BY e.enrollment_id
LIMIT 3;
JSON 中的答疑时间 :用 JSON_VALUE 从 JSON 列中读取值。
SELECT first_name, last_name,
JSON_VALUE(office_hours, '$[0].day') AS day,
JSON_VALUE(office_hours, '$[0].start') AS starts_at
FROM faculty
ORDER BY faculty_id
LIMIT 3;
按主题分类的 SQL 练习
目前基于 University 数据库共有 7 道练习,更多练习正在添加中。答案会在真实的 MariaDB 上自动检查。
右侧数字是该主题的练习数量,彩色圆点表示难度范围。
从哪里开始
University 数据库的前几道练习:
学生入学年龄
识别非实验室建筑
最古老的部门
活跃的NASA资助项目
出版物查询
每栋楼的教室类型
每月新开始的研究项目
全部 University 练习 →
常见问题
使用 University 需要安装 MariaDB 吗?
不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,University 可在 MariaDB 11.8 上使用。
它使用了 MariaDB 的哪些功能?
JSON 列、ENUM 和 SET 类型、全文索引、用于嵌入向量的 VECTOR 列、视图,以及可用于递归查询的院系层级。
可以修改数据吗?
在练习场中数据库是只读的,以保证所有人看到相同的数据。如果想在自己的表上练习 INSERT、UPDATE 和 DELETE,请在练习场中选择普通的 MariaDB 版本。