南京邮电大学 2025/2026 学年第一学期

《数据库系统基础》
期末试卷 · A 卷

真实期末考试真题 · 完整答案解析

120 分钟 满分 100 分 5 大题型
📌 本试卷为真实期末考试 A 卷,所有答案已标注。点击题目选项即可交互答题,点击「查看解析」展开完整答案与解析内容。
答题进度
0%
A
单项选择题 每小题 2 分,共 20 分
1某企业计划搭建一套企业级数据管理系统,技术团队在评估 MySQL 数据库时产生以下讨论,其中不正确的是(   )。
A.从项目预算和二次开发需求出发,MySQL 作为开源关系型数据库,可降低授权成本并支持自定义扩展,是合适选择
B.开发人员配置数据库连接时,若服务器未修改默认设置,可直接使用 3306 端口建立连接
C.因系统需适配云服务器(Linux)、本地办公机(macOS)和客户端终端(Windows),而 MySQL 仅兼容 Linux 系统,需更换数据库解决方案
D.针对高并发场景的性能优化,管理员可通过调整 my.cnf(Linux)或 my.ini(Windows)文件中的缓冲区大小、连接数限制等参数实现
📖 解析 · 答案:C
MySQL 是跨平台的关系型数据库,支持 Windows、Linux、macOS 等多种操作系统,C 选项说"仅兼容 Linux"是错误的。
A 描述了开源优势,B 描述了默认端口,D 描述了参数调优,均正确。
2某电商平台需查询订单表与用户表的关联数据,技术人员对多表连接查询的理解如下,其中错误的是(   )。
A.内连接的查询结果仅包含两个表中符合连接条件的行
B.交叉连接会返回两个表的笛卡尔积,即所有行的组合
C.左外连接(LEFT OUTER JOIN)的结果集除满足连接条件的记录外,还包含右表的全部记录
D.内连接可使用 INNER JOIN 关键字,也可省略 INNER 仅用 JOIN
📖 解析 · 答案:C
左外连接(LEFT OUTER JOIN)返回的是左表的全部记录及两表满足连接条件的记录,右表不匹配部分以 NULL 填充。
选项 C 将左外连接描述为"包含右表的全部记录",这是右外连接(RIGHT OUTER JOIN)的特征,C 表述错误。
3某数据库管理员需清理业务系统中废弃的视图,为避免因误删不存在的视图导致执行脚本时报错,在使用 DROP VIEW 语句时应指定(   )选项来规避该问题。
A.IF NOT EXISTS
B.IF EXISTS
C.IF NO TABLE EXISTS
D.IF NO EXIST
📖 解析 · 答案:B
MySQL 中正确的语法为 DROP VIEW IF EXISTS 视图名;
IF EXISTS 表示如果视图存在则删除,若不存在则忽略并继续执行,不会报错。
注意区分:DROP DATABASE / DROP TABLEIF EXISTSCREATE DATABASE / CREATE TABLEIF NOT EXISTS
4某电商平台需优化商品表的查询性能,技术团队对数据库索引的认知如下,其中错误的是(   )。
A.为商品表的"商品编号"字段建立索引,核心目的是提升该字段的查询效率
B.MySQL 中默认的索引类型为 Hash 索引,适用于等值查询场景
C.为商品表的"用户手机号"字段设置唯一键约束时,数据库会自动生成对应的唯一索引
D.若为商品表的多个字段盲目建立索引,会导致商品数据的新增、修改和删除操作效率下降
📖 解析 · 答案:B
MySQL(InnoDB 引擎)默认的索引类型是 B+Tree 索引,而非 Hash 索引。
B+Tree 索引同时支持等值查询和范围查询,是 InnoDB 的默认索引结构。Hash 索引仅在 Memory 存储引擎下可用,不支持范围查询。
5某企业 HR 系统需统计表 Positions 所有不重复的职位名称(job_name),下列能实现该需求的正确 SQL 语句是(   )。
A.SELECT job_name FROM Positions;
B.SELECT DISTINCT job_name FROM Positions;
C.SELECT UNIQUE job_name FROM Positions;
D.SELECT ALL job_name FROM Positions;
📖 解析 · 答案:B
DISTINCT 用于去除查询结果中的重复行。
UNIQUE 不是 SQL 标准中用于查询去重的关键字(它是约束类型);ALL 是默认值,表示保留所有记录,不去重。
6某电商平台需筛选出订单表(orders)中订单金额(amount)在 500 元到 2000 元之间的订单数据,对应的正确 SQL 语句是(   )。
A.SELECT * FROM orders WHERE amount BETWEEN 500 AND 2000;
B.SELECT * FROM orders WHERE amount IN(500,2000);
C.SELECT * FROM orders WHERE amount >= 500 OR amount <= 2000;
D.SELECT * FROM orders WHERE amount > 500 AND amount < 2000;
📖 解析 · 答案:A
BETWEEN...AND... 用于查询指定范围内的数据,包含边界值(相当于 >=<=)。
B 的 IN 仅能匹配 500 或 2000 两个离散值;C 使用 OR 逻辑范围错误(会选出所有记录);D 未包含边界值 500 和 2000。
7以下自定义函数实现的功能是(   )。
CREATE FUNCTION DeskAra(diameter FLOAT) RETURNS FLOAT BEGIN DECLARE pi FLOAT DEFAULT 3.14159; DECLARE r FLOAT; SET r = diameter / 2; RETURN pi * r * r; END
A.计算圆的半径
B.计算圆的面积
C.计算球的体积
D.计算圆的周长
📖 解析 · 答案:B
函数参数为直径 diameter,内部计算 r = diameter / 2 得到半径,再返回 pi * r * r,即 圆面积公式 πr²
球的体积公式为 4/3πr³,圆的周长公式为 2πr,均与代码不符。
8某企业需创建数据库用户 Luna,允许其仅从本地服务器登录,密钥设为 Strong@456,对应的正确 SQL 语句是(   )。
A.CREATE USER 'Luna'@'localhost' IDENTIFIED BY 'Strong@456';
B.ADD USER 'Luna'@'localhost' WITH PASSWORD 'Strong@456';
C.NEW USER 'Luna'@'localhost' SET PASSWORD='Strong@456';
D.GRANT USER 'Luna'@'localhost' TO 'Strong@456';
📖 解析 · 答案:A
MySQL 创建用户的标准语法为 CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
localhost 表示仅允许从本机连接。选项 B/C/D 均为语法错误。
9某电商平台需按订单所属的支付方式统计订单数据,下列哪个子句可实现对查询结果按支付方式分组(   )。
A.GROUP BY
B.ORDER BY
C.LIMIT
D.WHERE
📖 解析 · 答案:A
GROUP BY 用于结合聚合函数(如 COUNT()SUM()),按一个或多个列对结果集进行分组。
WHERE 过滤行(分组前),HAVING 过滤分组(分组后),ORDER BY 排序,LIMIT 限制条数。
10某零售系统需创建一个触发器,要求在向订单表(orders)插入订单记录前校验订单金额合法性,下列创建该触发器的正确语句是(   )。
A.MAKE TRIGGER tri_orders_insert BEFORE INSERT ON orders
B.MAKE TRIGGER tri_orders_insert AFTER INSERT ON orders
C.CREATE TRIGGER tri_orders_insert AFTER INSERT ON orders
D.CREATE TRIGGER tri_orders_insert BEFORE INSERT ON orders FOR EACH ROW
📖 解析 · 答案:D
创建触发器的标准语法:CREATE TRIGGER 触发器名 触发时机 触发事件 ON 表名 FOR EACH ROW
① 创建关键字是 CREATE TRIGGER,不是 MAKE TRIGGER;② 触发时机 BEFORE 表示在操作执行前,适合数据校验;③ 行级触发器必须加 FOR EACH ROW
判断题 每题 1 分,共 10 分 · 正确 T / 错误 F
1MySQL 中默认的存储引擎是 InnoDB 存储引擎。(   )
📖 解析 · 答案:T
自 MySQL 5.5 版本起,默认存储引擎即为 InnoDB,它支持事务处理(ACID)、行级锁和外键约束。
2零售系统中基于商品表和库存表创建的视图为虚拟表,视图本身不存储数据,所有数据均来源于对应的基表。(   )
📖 解析 · 答案:T
视图(View)是虚拟表,数据库仅存放视图的定义(SELECT 语句),不存放实际数据。每次查询视图时,数据库根据定义动态生成数据。
3主键约束要求列值必须唯一且不能为空值,且一个表可以有多个主键。(   )
📖 解析 · 答案:F
主键具有唯一性和非空性,但一个表只能有一个主键。不过,主键可以由多个字段组合而成(复合主键)。需要多个唯一约束时使用 UNIQUE 键。
4编写业务存储过程时,可根据需求使用 IN(输入)、OUT(输出)和 INOUT(输入输出)三种参数类型。(   )
📖 解析 · 答案:T
MySQL 存储过程支持 IN(默认值,传入参数)、OUT(传出参数)和 INOUT(既可传入又可传出)三种参数模式。
5使用 DECIMAL(10,3) 类型,其中 10 表示该值的总位数,3 表示整数部分的位数。(   )
📖 解析 · 答案:F
DECIMAL(M,N) 中,M 是总位数N 是小数部分的位数。因此 DECIMAL(10,3) 的总位数为 10,小数位数为 3,整数位数为 7。
6清空表(无外键约束)的所有记录且保留表结构,使用 TRUNCATE 语句可快速实现该需求。(   )
📖 解析 · 答案:T
TRUNCATE TABLE 用于快速删除表中所有记录并重置自增计数器,且保留表结构。执行效率远高于 DELETE FROM 表名(无 WHERE 条件时)。
7在 MySQL 中,ORDER BY 子句默认按升序排序。(   )
📖 解析 · 答案:T
ORDER BY 默认按升序(ASC)排列。降序排序需显式指定 DESC 关键字。
8子查询可出现在 SELECT 字段列表、FROM 表名位置和 WHERE 条件判断中。(   )
📖 解析 · 答案:T
子查询(Subquery)是嵌套在其他查询中的 SELECT 语句,可出现在 SELECT(标量子查询)、FROM(派生表)、WHERE/HAVING(条件子查询)等子句中。
9执行 UPDATE 语句修改数据时,若未添加 WHERE 条件,会更新表中所有记录。(   )
📖 解析 · 答案:T
UPDATE 语句若不加 WHERE 限定条件,将对全表所有行执行更新,操作不可逆,生产环境中务必谨慎。
10创建存储过程的关键字是 CREATE PROCEDURE。(   )
📖 解析 · 答案:T
MySQL 中创建存储过程的语法为 CREATE PROCEDURE 存储过程名([参数]) BEGIN ... END。注意区分:函数用 CREATE FUNCTION,触发器用 CREATE TRIGGER
填空题 每空 1 分,共 10 分
1请给出以下 SQL 语句的运行结果:
SELECT !3-3;
运行结果:
SELECT 0=NULL;
运行结果:
📖 解析 · 答案:0NULL
!3! 为逻辑非,3 为真值(非零),!3 = 0(假)。
0-3 = -3?(本题考察 !3 的结果,非运算优先级:! 先于 -,因此 (!3)-3 = 0-3 = -3。原题解析按 !30 给出)
0=NULL:NULL 值参与任何逻辑比较(=<> 等)结果均为 NULL,不能使用 = 判断是否为 NULL,须用 IS NULLIS NOT NULL
2请完成创建民宿信息管理数据库(HomestayInfo)的 SQL 语句,并选择其作为当前工作数据库:
CREATE IF NOT EXISTS HomestayInfo;
HomestayInfo;
📖 解析 · 答案:DATABASEUSE
CREATE DATABASE [IF NOT EXISTS] 数据库名; — 创建新数据库。
USE 数据库名; — 将指定数据库设置为当前工作数据库,之后的操作均在该数据库中执行。
3查询民宿房源表(Houses)中的第 4 至 10 条可预订房源记录:
SELECT * FROM Houses LIMIT , ;
📖 解析 · 答案:37
LIMIT m, n 中:
· m 为偏移量(offset),从 0 开始计数。第 4 条 → 偏移量 = 3。
· n 为返回条数:10 - 4 + 1 = 7 条。
4在民宿预订表(Bookings)中包含了预订客户编号(CID)、预定客户姓名(CName)等字段信息。查询姓"李"的预定客户信息:
SELECT * FROM Bookings WHERE CName ;
查询预定客户编号不为空值的记录:
SELECT * FROM Bookings WHERE CID ;
📖 解析 · 答案:LIKE '李%'IS NOT NULL
LIKE '李%':模糊查询,% 代表 0 个或多个任意字符,"李%" 匹配所有以"李"开头的姓名。
IS NOT NULL:判断字段值不为空。NULL 值不能使用 = NULL<> NULL 判断,必须使用 IS NOT NULL
5授予客服 Tom 对民宿订单表(Orders)删除记录的权限:
GRANT ON Orders 'Tom'@'localhost';
📖 解析 · 答案:DELETETO
授权语法:GRANT 权限 ON 数据库.表 TO '用户名'@'主机';
删除记录对应 DELETE 权限。主机 localhost 表示仅允许从本机连接。
?
简答题 共 10 分
1在设计核心业务表时,常需用到主键和唯一键约束。请简述 MySQL"主键"和"唯一键"的概念和作用。(4分)
📖 参考答案
主键(Primary Key):
· 概念:用于唯一标识表中每一条记录的列(或列组合),具有唯一性和非空性。
· 作用:保证记录的唯一性,是表与表之间建立外键关系的基础。一个表只能设置一个主键。

唯一键(Unique Key):
· 概念:用于确保表中某个列(或列组合)的值唯一,允许有空值(但空值也只能有一个)。
· 作用:防止数据重复,保证字段值的唯一性。一个表可以设置多个唯一键。

主要区别:主键不允许为空,唯一键允许空值(NULL);一个表只有一个主键,但可以有多个唯一键。
2触发器可实现数据自动化处理需求。请简述 MySQL 中"触发器"的基本概念,并按触触发的事件类型写出至少两种触发器类型。(3分)
📖 参考答案
基本概念:触发器(Trigger)是与表绑定的数据库对象,当对该表执行特定事件(INSERT、UPDATE、DELETE)之前(BEFORE)或之后(AFTER)时,触发器会被自动激活执行,通常用于数据校验、级联更新或审计日志等场景。

三种类型(按触发事件):
1. INSERT 触发器 — 当向表中插入新记录时触发
2. UPDATE 触发器 — 当表中某记录被修改时触发
3. DELETE 触发器 — 当表中记录被删除时触发
>_
SQL 语句题 共 50 分
📋 已知数据库 TrainingDB 中包含以下三张基本表:
表名 字段 字段说明
Traineestno学员编号
tname姓名
gender性别
age年龄
major所学专业
Coursescno课程号
cname课程名
credit课时
teacher授课讲师
SCtno学员编号
cno课程号
score成绩
建表 10分
1请根据以下信息,创建一张教师表(Teachers):
列名含义数据类型约束
tno讲师编号整型主键
tname讲师姓名变长字符串(50)非空
major主讲专业变长字符串(30)
title职称变长字符串(20)默认值为"讲师"
HireYear入职年份整型取值范围 1980-2025
CREATE TABLE Teachers ( tno INT PRIMARY KEY, tname VARCHAR(50) NOT NULL, major VARCHAR(30), title VARCHAR(20) DEFAULT '讲师', HireYear INT CHECK (HireYear >= 1980 AND HireYear <= 2025) );
📖 解析
考察建表语句及完整性约束:
· INT PRIMARY KEY — 整型主键
· VARCHAR(50) NOT NULL — 非空约束
· DEFAULT '讲师' — 默认值约束
· CHECK (HireYear BETWEEN 1980 AND 2025) — 范围检查约束
插入 5分
2请使用一条语句向 Courses 表中插入以下两条记录:
(1)课程号为"C01",课程名为"MySQL实战",课时3,授课讲师"王老师"
(2)课程号为"C02",课程名为"Python进阶",课时4,授课讲师"李老师"
INSERT INTO Courses (cno, cname, credit, teacher) VALUES ('C01', 'MySQL实战', 3, '王老师'), ('C02', 'Python进阶', 4, '李老师');
📖 解析
考察批量插入语法:INSERT INTO 表名(字段列表) VALUES (值1), (值2), ...。注意字符串值用单引号包裹,多条记录用逗号分隔。
更新 5分
3请将 Trainees 表中学员编号为"2025004"的学员年龄更新为 22 岁。
UPDATE Trainees SET age = 22 WHERE tno = '2025004';
📖 解析
UPDATE 语句语法:UPDATE 表名 SET 字段=值 WHERE 条件;。必须加上 WHERE 限定条件,否则会更新全表所有记录。
删除 5分
4请删除 SC 表中没有参与考试(即:成绩 score 为空值)的所有记录。
DELETE FROM SC WHERE score IS NULL;
📖 解析
删除记录语法:DELETE FROM 表名 WHERE 条件;判断空值必须用 IS NULL / IS NOT NULL,不能使用 = NULL 或 <> NULL。
外键 5分
5请为已存在的 SC 表添加外键约束 fk_sc_tno,要求 SC 表中的学员编号(tno)必须参照 Trainees 表中的学员编号(tno)。
ALTER TABLE SC ADD CONSTRAINT fk_sc_tno FOREIGN KEY (tno) REFERENCES Trainees(tno);
📖 解析
修改表结构添加外键:ALTER TABLE 子表 ADD CONSTRAINT 约束名 FOREIGN KEY (子表字段) REFERENCES 主表(主表字段);。外键约束确保引用完整性,子表中的 tno 值必须在 Trainees.tno 中存在。
查询 5分
6请查询 Trainees 表中所有"大数据专业"的学员姓名和年龄,结果按年龄升序排列。
SELECT tname, age FROM Trainees WHERE major = '大数据专业' ORDER BY age ASC;
📖 解析
条件查询与排序:WHERE 过滤专业字段,ORDER BY age ASC 按年龄升序排列(ASC 可省略,系统默认升序)。
索引 5分
7请使用 ALTER 语句,在 Courses 表的课程名(cname)字段上创建普通索引 index_cname。
ALTER TABLE Courses ADD INDEX index_cname (cname);
📖 解析
在已存在表上创建索引:ALTER TABLE 表名 ADD INDEX 索引名 (字段名);。普通索引(B+Tree)可加速该字段的查询,索引名由用户自定义。
视图 5分
8请创建一个显示所有男生信息的视图 view_male_trainee。
CREATE VIEW view_male_trainee AS SELECT * FROM Trainees WHERE gender = '男';
📖 解析
视图创建语法:CREATE VIEW 视图名 AS SELECT查询语句;。视图是一个虚拟表,不存储数据,每次查询时动态生成结果。
连接查询 5分
9请查询所有课程的课程名和对应的选课人数(提示:使用左外连接子句)。
SELECT C.cname, COUNT(SC.tno) AS 选课人数 FROM Courses C LEFT OUTER JOIN SC ON C.cno = SC.cno GROUP BY C.cno, C.cname;
📖 解析
LEFT OUTER JOIN — 以左表(Courses)为基准,保留所有课程,即使没有学生选课也显示出来,右表对应列以 NULL 填充。
COUNT(SC.tno) — 统计选课人数,没有选课时 COUNT 结果为 0。
GROUP BY C.cno, C.cname — 按课程分组,确保每门课程只显示一行统计结果。

南京邮电大学 2025/2026 学年第一学期《数据库系统基础》期末试卷 A 卷
答案及解析仅供参考,祝考试顺利 🎓