2024年江西省职业院校技能大赛中职组"数据库应用"竞赛样题解析
一、赛项背景
本赛项内容基于数据库课程教学标准及人才培养目标,引领相关 专业课程改革创新,促进高等职业院校信息类相关专业建设,培养技能型人才;产教融合、校企合作,通过赛项展示和提高教师的数据库 教学科研能力,提升学生从事数据库相关岗位的适配性,提供数据库 领域的高素质技术技能型人才。全面考察中职学生在数据库概念设计、逻辑设计、物理设计、数据查询与分析、数据库部署与维护、数据库备份与恢复等知识、技术技能以及职业素养能力;全面检验学生在数据库方面的工程实践能力和创新能力;以高水平赛事引领职业教育高 质量发展,发挥树旗、导航、定标、催化作用。
二、竞赛内容
赛卷分模块A、模块B 和模块C 三个部分。
三、成果物提交
“数据库应用”赛项参赛选手须按照三个模块的任务要求完成对应的成果物并提交。模块 A、C 在竞赛平台中完成考核并提交,无需额外再提交成果物。模块 B 的成果物按照任务要求命名并放至对应模块文件夹下。
比赛结束时,选手须将完成的模块 B 成果物文件放至以选手工位号命名的文件夹,并复制到提前发放给选手的 U 盘中提交给现场裁判。
四、竞赛注意事项
提交的成果物资源内容中,不能填写与选手相关的信息,如赛位号、姓名和院校。如出现上述标记,成绩按照零分处理。
模块A:数据库理论
一、模块考核点
本模块分值为 15 分。
本模块采用机考方式,试题为单选题、多选题、判断题等,主要考查从事本职业应掌握的基础知识、专业知识、课程思政等内容。包括但不限于:数据库基础理论、SQL 语言与查询优化、数据库设计与建模、事务与并发控制、数据库索引与性能优化、数据库安全、数据库备份与恢复、分布式数据库与大数据处理、存储引擎、计算机网络与数据库的交互、服务器配置与数据库管理、相应的法律法规及课程思政等内容。
二、模块任务
单选题
1.以下哪个 SQL 语句用于插入数据?
(A)INSERT
(B) SELECT
(C) DELETE
(D) UPDATE
(A)INSERT 语句用于向表中插入数据。SELECT 用于查询数据,DELETE 用于删除数据,UPDATE 用于更新数据。所以答案是 A。
2.关系数据库的主要特点是?
(A) 数据是树状结构
(B) 数据存储在表中
(C) 数据存储在文件中
(D) 数据没有固定结构
(B)关系数据库的主要特点是数据存储在表中,通过表之间的关系来组织和管理数据。数据是树状结构一般是层次数据库的特点;数据存储在文件中表述太宽泛且不是关系数据库主要特点;关系数据库中数据是有固定结构的表形式。所以答案是 B。
3.在 MySQL 中,以下哪个命令用于删除表?
A)DROP
B)DELETE
C)REMOVE
D)TRUNCATE
(A)在 MySQL 中,DROP 命令用于删除表。DELETE 用于删除表中的数据,REMOVE 不是 MySQL 中用于删除表的标准命令,TRUNCATE 用于快速删除表中的所有数据但保留表结构。所以答案是 A。
4.哪个事务隔离级别可以防止脏读,但允许不可重复读?
A)可重复读
B)读未提交
C)读已提交
D)序列化
(C)读已提交的事务隔离级别可以防止脏读,但允许不可重复读。可重复读隔离级别可防止脏读和不可重复读;读未提交允许脏读;序列化可防止脏读、不可重复读和幻读,是最高隔离级别。所以答案是 C。
5.以下哪种类型的索引会强制表中的每一条记录唯一?
A)聚簇索引
B)非聚簇索引
C)唯一索引
D)全文索引
(C)唯一索引会强制表中的每一条记录在索引列上唯一。聚簇索引是一种数据存储方式,它决定了表中数据的物理存储顺序;非聚簇索引是与表数据分开存储的索引;全文索引主要用于文本内容的快速检索。所以答案是 C。
多选题
1.在数据库设计中,以下哪些是规范化设计的目标?
A)消除数据冗余
B)优化查询速度
C)确保数据的一致性
D)增加事务隔离性
(A、C)规范化设计的主要目标是消除数据冗余和确保数据的一致性。优化查询速度不一定是规范化设计的直接目标,规范化过度可能还会影响查询速度;增加事务隔离性与规范化设计关系不大。所以答案是 A、C。
2.以下哪些语句用于修改数据库中的数据?
A)INSERT
B)UPDATE
C)DELETE
D)SELECT
(B、C)UPDATE 语句用于修改表中的已有数据,DELETE 语句用于删除表中的数据,这两个操作都是对数据库中原有的数据进行改变。INSERT 用于插入新数据,SELECT 用于查询数据。所以答案是 B、C。
3.关于数据库的 ACID 特性,以下哪些是正确的?
A)A 代表原子性
B)C 代表一致性
C)I 代表隔离性
D)D 代表可用性
(A、B、C)数据库的 ACID 特性中,A 代表原子性(Atomicity),即事务是一个不可分割的工作单位;C 代表一致性(Consistency),事务完成时,数据必须处于一致状态;I 代表隔离性(Isolation),多个事务并发执行时,相互之间要隔离;D 代表持久性(Durability),而不是可用性。所以答案是 A、B、C。
4.以下哪些是 MySQL 的常用存储引擎?
A)InnoDB
B)MyISAM
C)MEMORY
D)Oracle
(A、B、C)InnoDB、MyISAM、MEMORY 都是 MySQL 的常用存储引擎。Oracle 是另一种数据库管理系统,不是 MySQL 的存储引擎。所以答案是 A、B、C。
5.以下哪些是数据库备份的常见类型?
A)全备份
B)增量备份
C)差异备份
D)快照备份
(A、B、C、D)全备份是对整个数据库进行完整备份;增量备份是只备份自上次备份(全备份或增量备份)以来更改的数据;差异备份是备份自上次全备份以来更改的数据;快照备份也是一种常见的备份方式,通过创建数据库的快照来实现备份。所以答案是 A、B、C、D。
判断题
1.数据库中的外键约束用于确保数据的完整性。
A)正确
B)错误
(A)正确。外键约束用于建立表与表之间的关系,通过引用其他表的主键或唯一键来确保数据的完整性,防止出现无效的关联数据。
2.SQL 中的 GROUP BY 子句用于对查询结果进行排序。
A)正确
B)错误
(B)错误。SQL 中的 GROUP BY 子句用于对查询结果按照指定的列进行分组,而不是排序。ORDER BY 子句才用于对查询结果进行排序。
3.数据库索引越多,查询速度就一定越快。
A)正确
B)错误
(B)错误。虽然索引可以提高查询速度,但并不是数据库索引越多查询速度就一定越快。过多的索引会增加数据插入、更新和删除操作的开销,可能反而降低整体性能。
4.在事务中,如果一条操作失败,整个事务会回滚到开始状态。
A)正确
B)错误
(A)正确。在事务中,如果一条操作失败,根据事务的原子性,整个事务会回滚到开始状态,以保证数据的一致性。
5.在数据库中,主键可以为空。
A)正确
B)错误
(B)错误。在数据库中,主键是用于唯一标识表中的每一条记录的,主键列的值不可以为空,必须是唯一且非空的值。
模块B:数据库设计与运维
一、模块考核点模块分值 45 分。
本模块主要考察选手在数据库设计和维护中的综合能力。选手需围绕给定的业务场景和需求描述,详细分析业务流程,识别关键实体和流程需求,理解数据流动和交互,设计合理的实体关系图(ER 图) 或数据流图,定义实体、属性及其相互关系,确保数据的完整性和规范化。在设计阶段,选手需合理规划字段类型、主键、外键约束,并构建数据库表结构,完成数据库的概念设计、逻辑设计和物理设计全过程。
题目:简化版学校信息管理系统数据库设计
背景描述:
某学校需要开发一个管理系统来处理日常运营中的关键业务,包括学生管理、教师管理、课程安排和成绩管理。该系统需要支持日常的教学流程,确保数据的完整性,并能够高效地查询学生和教师的信息及其关联的课程和成绩。
需求描述:
1.学生信息管理:
记录学生的基本信息,包括:学生 ID、姓名、性别、出生日期、联系方式、年级、紧急联系人信息。
每个学生可以注册多门课程,且每门课程有对应的成绩。
2.教师信息管理:
记录教师的基本信息,包括:教师 ID、姓名、科目 ID、职称、联系方式。
每个教师可以教授多门课程,且负责对应学生的成绩记录。
3.课程管理:
记录课程的基本信息,包括:课程 ID、课程名称、课程描述、教师 ID(负责该课程的教师)、上课时间、课程学分。
每门课程由一个教师授课,并可以有多个学生注册。
4.成绩管理:
记录学生在每门课程中的成绩信息,包括:成绩 ID、学生 ID、课程 ID、成绩、评定时间。
每个学生在每门课程中只有一条成绩记录。
1.根据需求阶段收集的信息,设计一个概念模型(ER 图)。需包含需求描述所涉及的实体,并定义他们之间的关系。
2.基于概念模型,设计一个逻辑模型,定义表结构和字段,请你使用 SQL DDL 语句来表示这些设计。包括:每个表的字段及其合适的数据类型、确定字段的数据存储规格(例如,字符串字段的长度)、有意义的字段名称、主键和外键约束、表与表之间的关系。
3.在逻辑模型的基础上,进行物理设计。请考虑为表设计索引, 以优化查询性能。
答题思路
一、概念模型(ER图)设计
(一)实体
- 学生(Student):具有学生ID、姓名、性别、出生日期、联系方式、年级、紧急联系人信息等属性。
- 教师(Teacher):包含教师ID、姓名、科目ID、职称、联系方式等属性。
- 课程(Course):包括课程ID、课程名称、课程描述、教师ID、上课时间、课程学分等属性。
- 成绩(Grade):由成绩ID、学生ID、课程ID、成绩、评定时间等属性构成。
(二)关系
- 学生与课程的关系(多对多):一个学生可以注册多门课程,一门课程可以有多个学生注册,通过一个中间表(例如:Student_Course)来关联,该中间表包含学生ID和课程ID两个字段,分别作为外键指向学生表和课程表。
- 教师与课程的关系(一对多):一个教师可以教授多门课程,一门课程只能由一个教师授课,在课程表中设置教师ID作为外键指向教师表。
- 学生与成绩的关系(一对多):一个学生可以有多门课程的成绩记录,在成绩表中设置学生ID作为外键指向学生表。
- 课程与成绩的关系(一对多):一门课程会有多个学生的成绩记录,在成绩表中设置课程ID作为外键指向课程表。
以下是大致的ER图结构示意:
+-----------------+
| Student |
+-----------------+
| StudentID (PK) |
| Name |
| Gender |
| BirthDate |
| ContactInfo |
| GradeLevel |
| EmergencyContact|
+-----------------+
|
| (Many-to-Many)
|
+-----------------+
| Student_Course |
+-----------------+
| StudentID (FK) |
| CourseID (FK) |
+-----------------+
|
|
+-----------------+
| Course |
+-----------------+
| CourseID (PK) |
| CourseName |
| CourseDescription|
| TeacherID (FK) |
| ClassTime |
| CourseCredit |
+-----------------+
|
| (One-to-Many)
|
+-----------------+
| Teacher |
+-----------------+
| TeacherID (PK) |
| Name |
| SubjectID |
| Title |
| ContactInfo |
+-----------------+
|
| (One-to-Many)
|
+-----------------+
| Grade |
+-----------------+
| GradeID (PK) |
| StudentID (FK) |
| CourseID (FK) |
| GradeValue |
| EvaluationTime |
+-----------------+
二、逻辑模型(SQL DDL语句)设计
(一)创建学生表(Student)
CREATE TABLE Student (
StudentID VARCHAR(10) PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Gender ENUM('Male', 'Female') NOT NULL,
BirthDate DATE NOT NULL,
ContactInfo VARCHAR(100),
GradeLevel VARCHAR(10),
EmergencyContact VARCHAR(100)
);
(二)创建教师表(Teacher)
CREATE TABLE Teacher (
TeacherID VARCHAR(10) PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
SubjectID VARCHAR(10) NOT NULL,
Title VARCHAR(20) NOT NULL,
ContactInfo VARCHAR(100)
);
(三)创建课程表(Course)
CREATE TABLE Course (
CourseID VARCHAR(10) PRIMARY KEY,
CourseName VARCHAR(50) NOT NULL,
CourseDescription VARCHAR(200),
TeacherID VARCHAR(10),
ClassTime VARCHAR(50),
CourseCredit DECIMAL(3, 1) NOT NULL,
FOREIGN KEY (TeacherID) REFERENCES Teacher(TeacherID)
);
(四)创建成绩表(Grade)
CREATE TABLE Grade (
GradeID VARCHAR(10) PRIMARY KEY,
StudentID VARCHAR(10),
CourseID VARCHAR(10),
GradeValue DECIMAL(5, 2),
EvaluationTime TIMESTAMP,
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
FOREIGN KEY (CourseID) REFERENCES Course(CourseID)
);
(五)创建学生与课程关联表(Student_Course)
CREATE TABLE Student_Course (
StudentID VARCHAR(10),
CourseID VARCHAR(10),
PRIMARY KEY (StudentID, CourseID),
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
FOREIGN KEY (CourseID) REFERENCES Course(CourseID)
);
三、物理设计(索引优化)
(一)学生表(Student)
为了提高根据学生ID快速查询学生信息的性能,可以在学生表的 StudentID
字段上创建索引:
CREATE INDEX idx_student_id ON Student(StudentID);
(二)教师表(Teacher)
在教师表的 TeacherID
字段上创建索引,便于根据教师ID快速查询教师信息:
CREATE INDEX idx_teacher_id ON Teacher(TeacherID);
(三)课程表(Course)
- 在课程表的
CourseID
字段上创建索引,用于快速查询特定课程的信息:
CREATE INDEX idx_course_id ON Course(CourseID);
- 由于经常需要根据教师ID查询其授课的课程信息,在
TeacherID
字段上也创建索引:
CREATE INDEX idx_course_teacher_id ON Course(TeacherID);
(四)成绩表(Grade)
- 在成绩表的
StudentID
字段上创建索引,以便快速查询某个学生的所有成绩记录:
CREATE INDEX idx_grade_student_id ON Grade(StudentID);
- 在成绩表的
CourseID
字段上创建索引,用于快速查询某门课程的所有学生成绩记录:
CREATE INDEX idx_grade_course_id ON Grade(CourseID);
(五)学生与课程关联表(Student_Course)
在该表的 StudentID
和 CourseID
字段上创建索引,可提高通过学生ID或课程ID查询关联记录的速度:
CREATE INDEX idx_student_course_student_id ON Student_Course(StudentID);
CREATE INDEX idx_student_course_course_id ON Student_Course(CourseID);
模块C:数据库查询与分析
一、模块考核点模块分值 40 分。
本模块主要考察选手根据给定的任务场景、数据库表结构及字段说明,结合实际业务需求,编写对应的 SQL 查询语句。要求选手在准确理解任务要求的基础上,合理运用 SQL 语言中的查询、条件过滤、聚合函数、连接(JOIN)操作等功能,完成数据查询和结果集的生成。
二、模块任务
有一个课程表(course_tb)简况如下:
id | name | course | grade | hire_date |
---|---|---|---|---|
10001 | 张三 | 数据库系统 | 88.5 | 2023 春季 |
10002 | 李四 | 计算机网络 | 92 | 2023 春季 |
10003 | 张伟 | 数据库系统 | 99 | 2020 春季 |
10004 | 王红 | 计算机网络 | 78.5 | 2020 春季 |
10005 | 刘丽 | 信息技术 | 70 | 2023 春季 |
1.编写 SQL 语句,查询所有学生 ID、姓名、课程,并按学生 ID
升序排列。
2.编写 SQL 语句,查询成绩大于 90 分的姓名和课程。
3.编写 SQL 语句,查询每门课程的平均成绩。
4.编写 SQL 语句,查询“2023 春季”学期中成绩最高的学生姓名、课程名称和成绩。
答题思路
1. 查询所有学生ID、姓名、课程,并按学生ID升序排列。
SELECT id AS student_id, name, course
FROM course_tb
ORDER BY id ASC;
在上述语句中,使用 SELECT
关键字选取 id
字段并通过 AS
关键字将其别名为 student_id
,同时选取 name
和 course
字段。然后使用 ORDER BY
子句按照 id
(即学生ID)字段进行升序排列。
2. 查询成绩大于90分的姓名和课程。
SELECT name, course
FROM course_tb
WHERE grade > 90;
这里通过 SELECT
关键字选取 name
和 course
字段,然后使用 WHERE
子句设置条件,筛选出 grade
(成绩)字段大于90分的记录。
3. 查询每门课程的平均成绩。
SELECT course, AVG(grade) AS average_grade
FROM course_tb
GROUP BY course;
在这个查询语句中,首先通过 SELECT
关键字选取 course
字段,然后使用聚合函数 AVG()
计算每门课程的平均成绩,并通过 AS
关键字将其别名为 average_grade
。接着使用 GROUP BY
子句按照 course
字段进行分组,这样就能得到每门课程各自的平均成绩。
4. 查询“2023春季”学期中成绩最高的学生姓名、课程名称和成绩。
SELECT name, course, grade
FROM course_tb
WHERE (hire_date = '2023春季') AND (grade = (SELECT MAX(grade) FROM course_tb WHERE hire_date = '2023春季'));
此语句先在主查询中通过 SELECT
关键字选取 name
、course
和 grade
字段。然后在 WHERE
子句中设置两个条件:一是 hire_date
(学期)字段等于 ‘2023春季’,二是 grade
字段等于在子查询中计算出的“2023春季”学期中的最高成绩。子查询 (SELECT MAX(grade) FROM course_tb WHERE hire_date = '2023春季')
用于找出“2023春季”学期内的最高成绩值,只有同时满足这两个条件的记录才会被查询出来。