🎯 本月只剩几天支持 SQLTest.online,帮助我们让 SQL 练习对每个人都免费。 今天捐赠 →
SQL 代码已复制到剪贴板

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)包含现成的报表。

各表的数据量:

表行数内容
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所属院系标识符 (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]
  • 主键,btree (award_id)
  • 外键 (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"}]
  • 主键,btree (project_id)
  • 外键 (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]
  • 主键,btree (member_id)
  • 外键 (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.
  • 主键,btree (event_id)
  • 外键 (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}
  • 主键,btree (log_id)

视图

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;
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 数据库共有 7 道练习,更多练习正在添加中。答案会在真实的 MariaDB 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。

从哪里开始

University 数据库的前几道练习:

  1. 学生入学年龄
  2. 识别非实验室建筑
  3. 最古老的部门
  4. 活跃的NASA资助项目
  5. 出版物查询
  6. 每栋楼的教室类型
  7. 每月新开始的研究项目

全部 University 练习 →

常见问题

使用 University 需要安装 MariaDB 吗?

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

它使用了 MariaDB 的哪些功能?

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

可以修改数据吗?

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