单项选择题 每小题 2 分,共 20 分
1某企业计划搭建一套企业级数据管理系统,技术团队在评估 MySQL 数据库时产生以下讨论,其中不正确的是( )。
📖 解析 · 答案:C
MySQL 是跨平台的关系型数据库,支持 Windows、Linux、macOS 等多种操作系统,C 选项说"仅兼容 Linux"是错误的。
A 描述了开源优势,B 描述了默认端口,D 描述了参数调优,均正确。
A 描述了开源优势,B 描述了默认端口,D 描述了参数调优,均正确。
2某电商平台需查询订单表与用户表的关联数据,技术人员对多表连接查询的理解如下,其中错误的是( )。
📖 解析 · 答案:C
左外连接(
选项 C 将左外连接描述为"包含右表的全部记录",这是右外连接(RIGHT OUTER JOIN)的特征,C 表述错误。
LEFT OUTER JOIN)返回的是左表的全部记录及两表满足连接条件的记录,右表不匹配部分以 NULL 填充。选项 C 将左外连接描述为"包含右表的全部记录",这是右外连接(RIGHT OUTER JOIN)的特征,C 表述错误。
3某数据库管理员需清理业务系统中废弃的视图,为避免因误删不存在的视图导致执行脚本时报错,在使用 DROP VIEW 语句时应指定( )选项来规避该问题。
📖 解析 · 答案:B
MySQL 中正确的语法为
注意区分:
DROP VIEW IF EXISTS 视图名;。IF EXISTS 表示如果视图存在则删除,若不存在则忽略并继续执行,不会报错。注意区分:
DROP DATABASE / DROP TABLE 用 IF EXISTS;CREATE DATABASE / CREATE TABLE 用 IF NOT EXISTS。
4某电商平台需优化商品表的查询性能,技术团队对数据库索引的认知如下,其中错误的是( )。
📖 解析 · 答案:B
MySQL(InnoDB 引擎)默认的索引类型是
B+Tree 索引同时支持等值查询和范围查询,是 InnoDB 的默认索引结构。Hash 索引仅在 Memory 存储引擎下可用,不支持范围查询。
B+Tree 索引,而非 Hash 索引。B+Tree 索引同时支持等值查询和范围查询,是 InnoDB 的默认索引结构。Hash 索引仅在 Memory 存储引擎下可用,不支持范围查询。
5某企业 HR 系统需统计表 Positions 所有不重复的职位名称(job_name),下列能实现该需求的正确 SQL 语句是( )。
📖 解析 · 答案:B
DISTINCT 用于去除查询结果中的重复行。UNIQUE 不是 SQL 标准中用于查询去重的关键字(它是约束类型);ALL 是默认值,表示保留所有记录,不去重。
6某电商平台需筛选出订单表(orders)中订单金额(amount)在 500 元到 2000 元之间的订单数据,对应的正确 SQL 语句是( )。
📖 解析 · 答案: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
📖 解析 · 答案:B
函数参数为直径
球的体积公式为 4/3πr³,圆的周长公式为 2πr,均与代码不符。
diameter,内部计算 r = diameter / 2 得到半径,再返回 pi * r * r,即 圆面积公式 πr²。球的体积公式为 4/3πr³,圆的周长公式为 2πr,均与代码不符。
8某企业需创建数据库用户 Luna,允许其仅从本地服务器登录,密钥设为
Strong@456,对应的正确 SQL 语句是( )。📖 解析 · 答案:A
MySQL 创建用户的标准语法为
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';。localhost 表示仅允许从本机连接。选项 B/C/D 均为语法错误。
9某电商平台需按订单所属的支付方式统计订单数据,下列哪个子句可实现对查询结果按支付方式分组( )。
📖 解析 · 答案:A
GROUP BY 用于结合聚合函数(如 COUNT()、SUM()),按一个或多个列对结果集进行分组。WHERE 过滤行(分组前),HAVING 过滤分组(分组后),ORDER BY 排序,LIMIT 限制条数。
10某零售系统需创建一个触发器,要求在向订单表(orders)插入订单记录前校验订单金额合法性,下列创建该触发器的正确语句是( )。
📖 解析 · 答案: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;
运行结果:
📖 解析 · 答案:0;NULL
!3:! 为逻辑非,3 为真值(非零),!3 = 0(假)。0-3 = -3?(本题考察 !3 的结果,非运算优先级:! 先于 -,因此 (!3)-3 = 0-3 = -3。原题解析按 !3 → 0 给出)0=NULL:NULL 值参与任何逻辑比较(=、<> 等)结果均为 NULL,不能使用 = 判断是否为 NULL,须用 IS NULL 或 IS NOT NULL。
2请完成创建民宿信息管理数据库(HomestayInfo)的 SQL 语句,并选择其作为当前工作数据库:
CREATE
IF NOT EXISTS HomestayInfo;
HomestayInfo;
📖 解析 · 答案:DATABASE;USE
CREATE DATABASE [IF NOT EXISTS] 数据库名; — 创建新数据库。USE 数据库名; — 将指定数据库设置为当前工作数据库,之后的操作均在该数据库中执行。
3查询民宿房源表(Houses)中的第 4 至 10 条可预订房源记录:
SELECT * FROM Houses LIMIT
,
;
📖 解析 · 答案:3;7
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';
📖 解析 · 答案:DELETE;TO
授权语法:
删除记录对应
GRANT 权限 ON 数据库.表 TO '用户名'@'主机';删除记录对应
DELETE 权限。主机 localhost 表示仅允许从本机连接。
简答题 共 10 分
1在设计核心业务表时,常需用到主键和唯一键约束。请简述 MySQL"主键"和"唯一键"的概念和作用。(4分)
📖 参考答案
主键(Primary Key):
· 概念:用于唯一标识表中每一条记录的列(或列组合),具有唯一性和非空性。
· 作用:保证记录的唯一性,是表与表之间建立外键关系的基础。一个表只能设置一个主键。
唯一键(Unique Key):
· 概念:用于确保表中某个列(或列组合)的值唯一,允许有空值(但空值也只能有一个)。
· 作用:防止数据重复,保证字段值的唯一性。一个表可以设置多个唯一键。
主要区别:主键不允许为空,唯一键允许空值(NULL);一个表只有一个主键,但可以有多个唯一键。
· 概念:用于唯一标识表中每一条记录的列(或列组合),具有唯一性和非空性。
· 作用:保证记录的唯一性,是表与表之间建立外键关系的基础。一个表只能设置一个主键。
唯一键(Unique Key):
· 概念:用于确保表中某个列(或列组合)的值唯一,允许有空值(但空值也只能有一个)。
· 作用:防止数据重复,保证字段值的唯一性。一个表可以设置多个唯一键。
主要区别:主键不允许为空,唯一键允许空值(NULL);一个表只有一个主键,但可以有多个唯一键。
2触发器可实现数据自动化处理需求。请简述 MySQL 中"触发器"的基本概念,并按触触发的事件类型写出至少两种触发器类型。(3分)
📖 参考答案
基本概念:触发器(Trigger)是与表绑定的数据库对象,当对该表执行特定事件(INSERT、UPDATE、DELETE)之前(BEFORE)或之后(AFTER)时,触发器会被自动激活执行,通常用于数据校验、级联更新或审计日志等场景。
三种类型(按触发事件):
1. INSERT 触发器 — 当向表中插入新记录时触发
2. UPDATE 触发器 — 当表中某记录被修改时触发
3. DELETE 触发器 — 当表中记录被删除时触发
三种类型(按触发事件):
1. INSERT 触发器 — 当向表中插入新记录时触发
2. UPDATE 触发器 — 当表中某记录被修改时触发
3. DELETE 触发器 — 当表中记录被删除时触发
SQL 语句题 共 50 分
📋 已知数据库 TrainingDB 中包含以下三张基本表:
| 表名 | 字段 | 字段说明 |
|---|---|---|
| Trainees | tno | 学员编号 |
tname | 姓名 | |
gender | 性别 | |
age | 年龄 | |
major | 所学专业 | |
| Courses | cno | 课程号 |
cname | 课程名 | |
credit | 课时 | |
teacher | 授课讲师 | |
| SC | tno | 学员编号 |
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,授课讲师"李老师"
(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 卷
答案及解析仅供参考,祝考试顺利 🎓