新月份,新目标。您的帮助使项目向前推进。 🖥️ 支持 sqltest →
SQL 代码已复制到剪贴板

University 数据库(MariaDB):模式、表和 SQL 练习

University 是关于大学的 MariaDB 示例数据库:院系、教师、学生、课程、教学班、选课、成绩和科研。 在 SQLtest.online 上,你可以直接在浏览器中查询它:做自动判题的练习,或在练习场中运行自己的查询,无需安装任何软件。

  • 16 张表和 7 个视图
  • 2,000 名学生
  • 24,981 条选课记录
  • 5 道 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)包含现成的报表。

各表的数据量:

表行数内容
students2,000学生
faculty250教师
departments25院系
courses116课程
course_prerequisites49先修课程
semesters20学期
sections1,715某学期的教学班
rooms48教室
enrollments24,981选课记录
grade_events307,081作业和考试成绩
research_projects200科研项目
project_members876项目成员
publications500论文
scholarships20奖学金
student_scholarships773学生获得的奖学金
audit_log664,124变更日志

表结构

点击表名可查看它的列、示例行和键。

表列表

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所属部门标识符 (外键)
  • student_number唯一学生 ID 号码 (CHAR, 例如 'S000123')
  • first_name学生的名字
  • last_name学生的姓氏
  • email学生的电子邮件地址
  • date_of_birth学生的出生日期
  • gender性别:M、F、NB、其他或不愿透露 (ENUM, 可为空)
  • enrollment_date学生首次注册的日期
  • expected_grad预计毕业年份 (YEAR, 可为空)
  • status注册状态:有效、无效、已毕业、暂停或退学 (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

示例查询

这些查询展示了数据之间是如何关联的。复制任意一条,在练习场中运行即可。

学生、课程和成绩:从选课记录经由教学班到课程和学期。

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;
first_namelast_namecodesemesterfinal_grade
AlexisCollierMATH111Fall 2024B+
AlexisCollierNURS102Fall 2024B
AlexisCollierMATH106Summer 2024B

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;
first_namelast_namedaystarts_at
DanielleJohnsonTue09:00
JasonHahnFri08:00
KathleenCannonFri08:00

按主题分类的 SQL 练习

目前基于 University 数据库共有 5 道练习,更多练习正在添加中。答案会在真实的 MariaDB 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。

从哪里开始

University 数据库的前几道练习:

  1. 学生入学年龄
  2. 识别非实验室建筑
  3. 最古老的部门
  4. 活跃的NASA资助项目
  5. 出版物查询

全部 University 练习 →

常见问题

使用 University 需要安装 MariaDB 吗?

不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,University 可在 MariaDB 11.8 上使用。

它使用了 MariaDB 的哪些功能?

JSON 列、ENUM 和 SET 类型、全文索引、用于嵌入向量的 VECTOR 列、视图,以及可用于递归查询的院系层级。

可以修改数据吗?

在练习场中数据库是只读的,以保证所有人看到相同的数据。如果想在自己的表上练习 INSERT、UPDATE 和 DELETE,请在练习场中选择普通的 MariaDB 版本。