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 的表以及它们之间的外键关系。点击可查看完整尺寸。
数据库包含什么
这些表分为三组。
人员和组织
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)包含现成的报表。
各表的数据量:
| 表 | 行数 | 内容 |
|---|---|---|
| students | 2,000 | 学生 |
| faculty | 250 | 教师 |
| departments | 25 | 院系 |
| courses | 116 | 课程 |
| course_prerequisites | 49 | 先修课程 |
| semesters | 20 | 学期 |
| sections | 1,715 | 某学期的教学班 |
| rooms | 48 | 教室 |
| enrollments | 24,981 | 选课记录 |
| grade_events | 307,081 | 作业和考试成绩 |
| research_projects | 200 | 科研项目 |
| project_members | 876 | 项目成员 |
| publications | 500 | 论文 |
| scholarships | 20 | 奖学金 |
| student_scholarships | 773 | 学生获得的奖学金 |
| audit_log | 664,124 | 变更日志 |
表结构
点击表名可查看它的列、示例行和键。
表列表
- 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)
- 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)
- 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)
- 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_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 | 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)
- 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 | 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
示例查询这些查询展示了数据之间是如何关联的。复制任意一条,在练习场中运行即可。 学生、课程和成绩:从选课记录经由教学班到课程和学期。
JSON 中的答疑时间:用 JSON_VALUE 从 JSON 列中读取值。
按主题分类的 SQL 练习目前基于 University 数据库共有 5 道练习,更多练习正在添加中。答案会在真实的 MariaDB 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。
从哪里开始University 数据库的前几道练习: 常见问题使用 University 需要安装 MariaDB 吗?不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中,University 可在 MariaDB 11.8 上使用。 它使用了 MariaDB 的哪些功能?JSON 列、ENUM 和 SET 类型、全文索引、用于嵌入向量的 VECTOR 列、视图,以及可用于递归查询的院系层级。 可以修改数据吗?在练习场中数据库是只读的,以保证所有人看到相同的数据。如果想在自己的表上练习 INSERT、UPDATE 和 DELETE,请在练习场中选择普通的 MariaDB 版本。 |