# 1. 举例说明函数依赖 X→Y 如何用于判定候选键,并阐述 Armstrong 公理(自反律、增广律、传递律)及其推论的完整推导。 A 只要属性集 X 的闭包覆盖全部属性,X 就是候选键,无需检查冗余 B 传递律说明 X→Y 且 Y→Z 等价于 Z→X C 自反律可以直接推出候选键,无需闭包计算 D 候选键判定需要计算属性闭包,闭包覆盖全部属性且无冗余真子集时 X 才是候选键 ✓ 正确答案
# 2. 元组(Tuple)与记录(Record)的差异是什么?关系是集合而文件是序列,从 SQL 模型与物理存储两个层面分别说明。 A 元组是逻辑概念、记录是物理概念;逻辑上关系是无序集合,物理上记录按地址存放 ✓ 正确答案 B 元组与记录是同一概念,都指物理存储单位 C 关系在物理上也是无序集合,不需要地址 D 元组必须按物理存储顺序排列
# 3. 实体完整性、参照完整性、用户定义完整性的违约处理(NO ACTION、CASCADE、SET NULL、SET DEFAULT)各自适用场景是什么? A CASCADE 适合子行需要独立存活、父行删除后置空的场景 B NO ACTION 拒绝删除被引用的父行,CASCADE 级联删除子行,SET NULL 将子表外键置空,三者适用场景不同 ✓ 正确答案 C SET NULL 会把父表主键置空 D 三类完整性约束中只有用户定义完整性可以违约
# 4. 数据库中的 NULL 与业务空值(0、空字符串)有何本质区别?三值逻辑(TRUE、FALSE、UNKNOWN)如何影响等值比较与唯一约束? A NULL 与空字符串完全等价,可以互换使用 B NULL = NULL 返回 TRUE C NULL 表示未知或值缺失,任何与 NULL 的等值比较都返回 UNKNOWN,唯一约束默认允许多个 NULL ✓ 正确答案 D 唯一约束列不允许出现任何 NULL
# 5. 数据库系统中的元数据(Catalog、Schema、Database)三层命名空间结构是怎样的?PostgreSQL 的 search_path 与 MySQL 的数据库限定如何工作? A MySQL 中 Schema 与 Database 是完全不同的两层结构 B PostgreSQL 中 search_path 不影响对象解析 C 标准结构为 Catalog→Schema→对象;PostgreSQL 用 search_path 解析未限定对象名,MySQL 用 db.table 限定 ✓ 正确答案 D Catalog 是物理文件系统目录
# 6. 请解释关系模型中关系(Relation)的定义、属性、度与基数,并说明关系为何是无序元组的集合而非数组? A 关系的度是元组个数,基数是属性个数 B 属性可以来自任意域,无需合法性检查 C 关系是元组的有序数组,位置有意义 D 关系是定义在若干域上、由元组组成的无序集合,度为属性个数、基数为元组个数 ✓ 正确答案
# 7. 为什么 SQL 标准允许关系中出现重复元组,而关系代数严格要求集合?请从 MULTISET 与 SET 的角度分析 SELECT DISTINCT 的语义代价。 A 关系代数严格要求集合不允许重复元组,SQL 默认采用多重集语义,SELECT DISTINCT 需要排序或哈希去重、代价较高 ✓ 正确答案 B SQL 默认对 SELECT 结果自动去重 C UNION ALL 与 UNION 语义完全相同 D DISTINCT 去重不需要任何额外开销
# 8. 为什么说主键的本质是 UNIQUE NOT NULL + 复制标识符的语义?是否所有表都必须有主键?堆表(Heap Table)与索引组织表(IOT)的差异是什么? A 所有表都强制必须有主键,否则无法创建 B 堆表按主键顺序存放数据,无需索引 C 主键语义是 UNIQUE NOT NULL 并兼作复制标识符;堆表数据按插入顺序存放、IOT 按主键顺序组织 ✓ 正确答案 D IOT 中主键查询必须回表
# 9. 主键选择 INT 自增、UUID、雪花 ID、复合键、哈希键的依据分别是什么?请从空间、索引分裂、分布式唯一性、调试可读性四维评分。 A 随机 UUID 插入顺序随机,容易造成索引页分裂,但占用空间最小 B 雪花 ID 是 64 位趋势递增的分布式 ID,兼顾全局唯一与顺序插入,是分布式主键主流方案 ✓ 正确答案 C INT 自增适合跨库全局唯一场景 D 复合键占用空间最小
# 10. 代理键(Surrogate Key)与自然键(Natural Key)在数据迁移、ORM 映射、跨系统集成中的优劣是什么?业务字段作为主键的潜在风险。 A 代理键与业务无关、稳定适合做主键;自然键用于跨系统标识,应通过唯一约束保证而非直接做主键 ✓ 正确答案 B 业务字段作为主键更稳定,因为业务规则不会变化 C 代理键无法用于数据迁移 D 自然键做主键无需维护任何映射
# 11. 关系数据库与键值存储、文档数据库在关系运算上的根本差异是什么?为什么 NoSQL 系统通常不支持 JOIN? A NoSQL 完全支持分布式 JOIN 且性能优于关系数据库 B 关系数据库以关系代数支撑多表关联查询;NoSQL 为水平扩展通常不支持 JOIN,改用反规范化与应用层组装 ✓ 正确答案 C 键值存储支持复杂关系运算 D 文档数据库的嵌套文档与 JOIN 完全等价
# 12. 关系模型中是否允许一个表引用自身(自引用外键)?典型的树形结构(parent_id)与图结构(边表)如何用关系建模? A 关系模型禁止表引用自身 B 树形结构只能用嵌套集模型,邻接表不可行 C 自引用外键合法,树用 parent_id 邻接表建模、图用边表建模,递归 CTE 需注意终止条件与防环 ✓ 正确答案 D 边表只能表示有向无环图
# 13. 关系模型的封闭性如何保证 SQL 查询的输出仍是关系?这对组合查询(子查询、CTE、视图嵌套)的语义有何影响? A 封闭性指查询结果可以不是关系 B 封闭性只对视图有效,对子查询无效 C 关系运算以关系为输入和输出,使子查询、CTE、视图可以任意嵌套且语义一致 ✓ 正确答案 D 封闭性禁止把查询结果作为输入
# 14. 包含依赖(Inclusion Dependency)与函数依赖(Functional Dependency)在参照完整性表达上的等价性如何?哪些完整性不能用函数依赖表达? A 函数依赖刻画属性间依赖,包含依赖刻画跨表包含关系,外键是典型的包含依赖,FD 无法表达 ✓ 正确答案 B 外键约束属于函数依赖,可以在单表内表达 C CHECK 约束可以用函数依赖完全表达 D 函数依赖可以表达所有完整性约束
# 15. 参照动作(Referential Action)选择 CASCADE 与 SET NULL 在审计、回收站、级联删除场景下的取舍准则是什么? A 审计场景适合使用物理 CASCADE,保证彻底删除 B CASCADE 不会递归传导到更深的层级 C SET NULL 会把父行删除 D 父子生命周期一致时用 CASCADE,子行需独立存在时用 SET NULL,审计与回收站场景应避免物理级联 ✓ 正确答案
# 16. 多对多关系在关系模型中如何表达?连接表(Join Table)与数组外键、JSON 数组外键的取舍依据是什么? A 关系模型可以直接存储 M:N 关系,无需中间表 B JSON 数组外键支持高效的按成员反查 C 数组外键天然支持外键约束 D M:N 需用连接表拆成两个 1:N,连接表可带关系属性并保证参照完整性;数组/JSON 外键虽免 JOIN 但丧失完整性且难以反查 ✓ 正确答案
# 17. 关系代数中的选择(σ)与 SQL 中的 WHERE 子句有何对应?投影(π)与 SELECT 列表有何对应? A σ 对应 SELECT 列表,π 对应 WHERE 子句 B σ 按谓词过滤行对应 WHERE,π 裁剪列对应 SELECT 列表,二者是行级与列级过滤,支撑谓词下推与投影裁剪 ✓ 正确答案 C 投影 π 在 SQL 中必须去重 D 选择 σ 影响列的个数
# 18. 在 SQL 中如何声明主键?请给出 PostgreSQL、MySQL、SQL Server 三种主流方言的等价写法。 A 三种方言的主键语法完全不同,无法等价迁移 B PostgreSQL 主键列可以包含 NULL C SQL Server 主键不会自动创建索引 D PostgreSQL、MySQL、SQL Server 都支持表级与列级 PRIMARY KEY 声明,差异在自动索引与聚簇语义等实现细节 ✓ 正确答案
# 19. 集合运算(并、交、差)与 SQL 的 UNION、INTERSECT、EXCEPT 的对应关系如何?MySQL 8.0.31+ 才支持 INTERSECT/EXCEPT,早期版本如何模拟? A INTERSECT 与 EXCEPT 在 MySQL 所有版本都原生支持 B 集合运算要求两侧列数不同 C UNION ALL 会隐式去重 D UNION 对应并、INTERSECT 对应交、EXCEPT 对应差;MySQL 早期版本可用 JOIN 与 NOT EXISTS 模拟 ✓ 正确答案
# 20. 关系代数中的赋值(Assignment)符号如何用于表达迭代式查询(如传递闭包)?为什么 SQL:1999 之前的标准缺乏递归查询能力? A 赋值符号绑定中间关系,配合不动点迭代可表达传递闭包;SQL:1999 引入 WITH RECURSIVE 才在标准中支持递归 ✓ 正确答案 B 关系代数无法表达传递闭包 C SQL:1986 标准已支持递归查询 D 递归查询不需要终止条件
# 21. 关系的笛卡尔积(Cartesian Product)与自然连接的执行代价差异如何?为什么现代优化器倾向于避免显式笛卡尔积? A 笛卡尔积结果行数是 |R|+|S|,代价可忽略 B 自然连接比笛卡尔积结果行数更多 C 笛卡尔积行数为 |R|×|S| 且无索引可利用,优化器会避免显式笛卡尔积并优先安排有连接条件的表对 ✓ 正确答案 D 忘写 ON 条件的 JOIN 不影响性能
# 22. 半连接(Semi-Join)与反连接(Anti-Join)在 EXISTS / NOT EXISTS 子查询中的等价表达是什么?请从关系代数角度证明 EXISTS 等价于半连接。 A EXISTS 等价于全连接 B EXISTS 与半连接(R ⋉ S)等价,NOT EXISTS 与反连接等价,优化器常将其提升为半连接算子执行 ✓ 正确答案 C NOT IN 与 NOT EXISTS 在 NULL 存在时语义完全相同 D 半连接会输出 S 的所有列
# 23. 外连接(LEFT/RIGHT/FULL OUTER JOIN)在关系代数中的扩展记号是什么?如何用关系代数符号表达“保留左表所有元组”? A R ⟕ S 只保留两表都匹配的行 B 外连接补出的 NULL 与业务 NULL 完全等价可互换 C 外连接结果行数一定等于 |R| D 左外连接 R ⟕ S 保留 R 全部元组,未匹配行以 NULL 填充,且可由内连接并上补 NULL 行的集合表达 ✓ 正确答案
# 24. 聚集运算(SUM、COUNT、AVG、MIN、MAX)在关系代数扩展中如何形式化?为什么它们打破了封闭性(输出不再是关系而是标量或集合)? A SELECT 列表可随意混用普通列与聚集列 B 聚集运算输出行数与输入完全一致 C 聚集运算把多行归约为汇总行,无 GROUP BY 时输出单行标量,打破了关系的封闭性,SQL 用 HAVING 与子查询恢复 ✓ 正确答案 D COUNT(*) 只统计非 NULL 行
# 25. 自然连接与等值连接(Equi-Join)的差异体现在哪些列名冲突场景?ON 子句、USING 子句、WHERE 子句三者的语义如何区分? A 自然连接自动用所有同名列等值连接,ON 显式控制连接条件,USING 合并同名列,WHERE 在连接后过滤且外连接中误用会致其退化为内连接 ✓ 正确答案 B 自然连接按显式 ON 条件连接,行为可控 C WHERE 与 ON 在外连接中完全等价 D USING 保留两列同名列
# 26. 袋语义(Bag Semantics)与集合语义(Set Semantics)下,关系代数的运算结果有何不同?SQL 默认采用哪种?GROUP BY 引入去重的语义是什么? A SQL 默认采用集合语义,结果自动去重 B GROUP BY 与 DISTINCT 机制完全相同 C 袋语义下投影自动去重 D SQL 默认采用袋语义(允许重复行),DISTINCT/UNION 才回到集合语义;GROUP BY 是分组归约而非单纯去重 ✓ 正确答案
# 27. 请完整列出关系代数的八种基本运算(并、差、积、选择、投影、连接、自然连接、除),并分别给出形式化符号与等价 SQL 写法。 A 除运算在 SQL 中有原生 DIVISION 关键字 B 投影运算对应 WHERE 子句 C 选择运算对应 SELECT 列表 D 八种基本运算含并、差、积、选择、投影、连接、自然连接、除,其中除运算在 SQL 中需用双重否定(NOT EXISTS)组合实现 ✓ 正确答案
# 28. 除运算(Division)的语义“所有满足条件的元组”如何用 SQL 表达?常见的“找出选修了全部课程的学生”查询在 MySQL 与 PostgreSQL 中如何实现? A 除运算只能用 GROUP BY 实现 B "选修全部课程"可用双重否定 NOT EXISTS 或分组计数 HAVING 实现,二者在空课程表等边界场景语义略有差异 ✓ 正确答案 C 双重否定实现不可行,SQL 无法表达全称量化 D 计数法无需校验选课记录有效性
# 29. 关系代数中“空集语义”如何处理?空关系参与 UNION、JOIN、INTERSECT 时各有什么约定? A R ⋈ ∅ 等于 R B 空子查询中 NOT IN 恒为假 C 空表参与 JOIN 会报错 D 空关系有属性模式但无元组,R∪∅=R、R⋈∅=∅;SQL 中空子查询使 EXISTS 为假、标量子查询返回 NULL ✓ 正确答案
# 30. 关系代数的“安全性”(Safety)问题是什么?为何 Domain Relational Calculus 可能产生无限结果? A 域关系演算总是产生有限结果 B 安全性与查询结果无关 C 关系代数可能产生无限结果 D 安全性要求查询结果有限;域关系演算的自由变量若未被限定到具体关系上可能取遍无限定义域而产生无限结果 ✓ 正确答案
# 31. 在查询优化中,选择下推(Predicate Pushdown)与投影下推(Projection Pushdown)各自能减少多少 I/O?哪些场景下推无效? A 视图中的 LIMIT 不影响谓词穿透 B 所有谓词都可以任意穿透外连接 C 投影下推对行宽无影响 D 选择下推减少参与运算的行数,投影下推减少读取的列宽;外连接保留侧谓词与聚合/窗口边界等场景下推会失效 ✓ 正确答案
# 32. 外连接在关系代数中可以用基础运算与选择巧妙表达吗?请给出 LEFT OUTER JOIN 的等价组合(UNION ALL + 谓词选择)。 A LEFT OUTER JOIN 可拆为"匹配部分内连接 UNION ALL 未匹配部分补 NULL",用 UNION ALL 避免去重改变行数 ✓ 正确答案 B 外连接无法用基础运算表达 C 等价写法必须用 UNION 去重 D 未匹配部分不需要补 NULL 列
# 33. 用 SQL 写出关系代数表达式 π_{name}(σ_{age>30}(Student ⋈ Enroll)),并给出至少两种等价改写(如子查询与 CTE)。 A 自然连接在 SQL 中必须用 CROSS JOIN B σ 对应 SELECT 列表 C π 对应 SELECT DISTINCT、σ 对应 WHERE、⋈ 对应 JOIN,且可用派生表、CTE、EXISTS 等价改写 ✓ 正确答案 D 三种改写方式语义互不等价
# 34. INNER JOIN、LEFT JOIN、FULL JOIN 在关系代数扩展中分别如何记号化? A 左外连接记号 ⟕ 表示保留右表全部元组 B 内连接记 ⋈,左外连接记 ⟕、右外连接记 ⟖、全外连接记 ⟗,记号开口朝向被保留一侧 ✓ 正确答案 C FULL JOIN 记号为 ⟕ D 等值连接是自然连接的特例
# 35. COALESCE、NULLIF、ISNULL、IFNULL 这四个 NULL 处理函数在不同数据库方言中的对应关系与等价表达式是什么? A MySQL 的 ISNULL 与 SQL Server 的 ISNULL 语义完全相同 B COALESCE 全参数为 NULL 时返回 0 C COALESCE 取首个非 NULL 参数,IFNULL/ISNULL 是两参数等价形式,NULLIF 相等时返回 NULL;MySQL ISNULL 实为 NULL 判断,跨方言需注意 ✓ 正确答案 D NULLIF 相等时返回 0
# 36. DISTINCT、GROUP BY、ORDER BY 在处理 NULL 时如何排序?NULLS FIRST、NULLS LAST 子句在 PostgreSQL 中的语法如何? A 各数据库对 NULL 排序的默认位置完全一致 B DISTINCT 保留所有 NULL 行 C GROUP BY/DISTINCT 把全部 NULL 视为同一组;ORDER BY 的 NULL 位置各库默认不同,PostgreSQL 可用 NULLS FIRST/LAST 显式控制 ✓ 正确答案 D PostgreSQL 不支持 NULLS FIRST 语法
# 37. EXISTS 子查询遇到 NULL 时,EXISTS (SELECT NULL) 返回什么?为什么 EXISTS 不受三值逻辑影响? A EXISTS (SELECT NULL) 恒为 FALSE B EXISTS 遇到 NULL 返回 UNKNOWN C EXISTS 只判定子查询是否返回行,与列值无关,SELECT NULL 表示行存在即 TRUE,因此不受三值逻辑影响 ✓ 正确答案 D EXISTS (SELECT NULL) 会因 NULL 而报错
# 38. IN、NOT IN、= ANY、<> ALL 与 NULL 的交互,当子查询返回 NULL 时,NOT IN 为何可能产生空结果? A NOT IN 子查询含 NULL 时结果仍然正确 B IN 子查询含 NULL 时恒返回空 C 子查询含 NULL 时,任何 col <> NULL 均为 UNKNOWN,NOT IN 需要全部比较为 TRUE 故恒返回空结果,应用 NOT EXISTS 规避 ✓ 正确答案 D NOT IN 等价于 = ANY
# 39. IS NULL 与 IS NOT NULL 是否走索引?PostgreSQL 中如何创建带 IS NULL 谓词的索引?MySQL 在何种条件下使用? A IS NULL 原则上可走索引,PostgreSQL 可用 WHERE col IS NULL 的部分索引,MySQL 常用组合索引配合 ICP 覆盖高频空值过滤 ✓ 正确答案 B NULL 不能存入 B+ 树索引 C IS NULL 永远只能全表扫描 D IS NOT NULL 过滤性高,必走索引
# 40. NULL 与空字符串('')的关系,PostgreSQL、Oracle、MySQL、SQL Server 各自如何区分?为何 Oracle 把 '' 与 NULL 视为等同? A 所有数据库都严格区分 NULL 与 '' B PostgreSQL 中 '' 等于 NULL C Oracle 中 '' 与 NULL 完全独立 D PostgreSQL、MySQL、SQL Server 区分二者,Oracle 因历史与存储设计把 '' 视为 NULL,跨库迁移需显式映射 ✓ 正确答案
# 41. NULL 在唯一约束(UNIQUE)中的处理,PostgreSQL 允许多个 NULL(认为 NULL 各不相等),SQL Server 与 Oracle 默认行为如何? A 所有数据库唯一约束都只允许一个 NULL B NULL 在唯一约束中视为重复值,一律拒绝 C SQL Server 唯一约束默认只允许一个 NULL D PostgreSQL 与 Oracle 唯一约束允许多个 NULL(NULL 互不相等),SQL Server 唯一索引默认只允许一个 NULL,可用过滤索引模拟 ✓ 正确答案
# 42. NULL 在算术运算中的传播规则,NULL + 1、NULL * 0、NULL || 'abc'(字符串拼接)各自的结果是什么? A NULL 参与的任何算术或拼接表达式结果仍为 NULL,如 NULL+1、NULL*0、NULL||'abc' 均为 NULL,需用 COALESCE 兜底 ✓ 正确答案 B NULL * 0 等于 0 C NULL + 1 等于 1 D 字符串拼接中 NULL 一律当作空串
# 43. SQL 中 NULL 的语义到底是什么?它究竟表示“未知”、“不适用”还是“不存在”?为什么 Codd 主张用 A-marks 与多重 NULL 取代单一 NULL? A NULL 只表示"不存在"一种语义 B NULL 与 0 语义完全相同 C Codd 的多重 NULL 方案已被所有数据库实现 D NULL 可表示未知、不适用、缺失等多种语义,单一 NULL 无法区分;Codd 主张用 A-marks 与多重 NULL 区分,但主流数据库未采纳 ✓ 正确答案
# 44. 三值逻辑(TRUE、FALSE、UNKNOWN)下,AND、OR、NOT 的真值表是怎样的?UNKNOWN AND FALSE、UNKNOWN OR TRUE 各自的真值是什么? A UNKNOWN AND FALSE 为 FALSE(FALSE 决定性)、UNKNOWN OR TRUE 为 TRUE(TRUE 决定性)、NOT UNKNOWN 为 UNKNOWN ✓ 正确答案 B UNKNOWN AND FALSE 等于 UNKNOWN C UNKNOWN OR TRUE 等于 UNKNOWN D NOT UNKNOWN 等于 TRUE
# 45. 为什么 WHERE 子句中的 NULL 比较(column = NULL)永远返回 UNKNOWN 而非 TRUE?这对查询的过滤行为有什么影响? A WHERE col = NULL 保留 NULL 行 B CHECK 约束中 UNKNOWN 会触发违例 C WHERE col = NULL 等价于 WHERE col IS NULL D NULL 不是值,col = NULL 恒为 UNKNOWN,WHERE 只保留 TRUE 行故结果恒为空,必须用 IS NULL 判空 ✓ 正确答案
# 46. 外连接产生的 NULL 与数据本身的 NULL 如何区分?业务上如何识别“左连接补全产生的未知值”? A 数据库能直接区分补全 NULL 与业务 NULL B COALESCE 能区分两类 NULL C 结果集中补全 NULL 与业务 NULL 不可直接区分,可用被连接侧主键 IS NULL 或 CASE 标记识别匹配状态 ✓ 正确答案 D 补全 NULL 不会出现,外连接总是匹配
# 47. NULL 与统计函数的相关性(CORR、COVAR_POP)计算时如何处理?包含 NULL 的列被排除后样本量如何调整? A CORR 计算时 NULL 使整个结果变为 NULL B COUNT(*) 忽略 NULL 行 C CORR、COVAR 等统计函数默认成对忽略 NULL,只使用两列都非 NULL 的行对,样本量按配对行数调整 ✓ 正确答案 D SUM 遇到 NULL 返回 NULL
# 48. NULL 参与的等值比较(如 NULL = NULL)应返回 UNKNOWN 而非 TRUE,但为什么 GROUP BY 把所有 NULL 视为同一组? A GROUP BY 把每个 NULL 分成独立的一组 B NULL = NULL 返回 UNKNOWN,但 GROUP BY/DISTINCT 把所有 NULL 视为同一键值归为一组,需要显式等值判定时用 IS NOT DISTINCT FROM ✓ 正确答案 C 分组时 NULL 与具体值相等 D NULL 不能作为分组键
# 49. NULL 在 CHECK 约束中如何处理?CHECK (col > 0) 遇到 col IS NULL 时是否触发违例? A CHECK (col > 0) 会拒绝 NULL 行 B CHECK 只拒绝返回 FALSE 的行,NULL 使表达式为 UNKNOWN 而放行,需配合 NOT NULL 约束或显式 IS NOT NULL 才可拦截 NULL ✓ 正确答案 C UNKNOWN 在 CHECK 中按 FALSE 处理 D CHECK 约束总是允许 NULL
# 50. NULL 在外键约束中的处理,插入 NULL 到外键列是被允许的(除非 NOT NULL),删除父表行时子表外键为 NULL 的处理规则是什么? A NULL 外键(MATCH SIMPLE)不参与参照匹配,插入合法;删除父行时 NULL 子行不受任何参照动作影响 ✓ 正确答案 B 外键列插入 NULL 会被拒绝 C NULL 外键子行会随父行 CASCADE 删除 D 外键列必须同时 NOT NULL
# 51. UPDATE ... SET col = NULL 与 UPDATE ... SET col = '' 的差异,对触发器、默认值、约束的影响是什么? A 置 NULL 表示缺失、置 '' 为零长字符串,NOT NULL 拒绝 NULL 允许 '',触发器用 IS DISTINCT FROM 判定变化,显式 NULL 不触发 DEFAULT ✓ 正确答案 B SET col = NULL 会触发列的 DEFAULT 值 C 二者完全等价 D 唯一约束对 NULL 与 '' 的处理完全相同
# 52. 为什么 IS NULL 不能用 = NULL 替代?SQL 标准为什么不直接定义 = NULL 为 IS NULL? A = NULL 按三值逻辑恒为 UNKNOWN,IS NULL 是确定性判定;标准不把 = NULL 定义为判空是为了保持三值逻辑一致与 NULL 非值的语义 ✓ 正确答案 B WHERE col = NULL 与 WHERE col IS NULL 等价 C NULL = NULL 返回 TRUE D 判空可以任意使用 = NULL
# 53. 如何在查询中将 NULL 替换为业务默认值?COALESCE 与 CASE WHEN 的等价写法是什么? A COALESCE 遇到 NULL 返回 0 B COALESCE(col, 默认值) 返回首个非 NULL 值,等价于 CASE WHEN col IS NOT NULL THEN col ELSE 默认值 END,多参数可逐级兜底 ✓ 正确答案 C COALESCE 只能接收两个参数 D 替换会直接修改数据库存储
# 54. 窗口函数中的 NULL 处理,FIRST_VALUE、LAST_VALUE、NTH_VALUE 遇到 NULL 时的行为是什么?RESPECT NULLS 与 IGNORE NULLS 子句的使用场景? A FIRST_VALUE 默认忽略 NULL B 窗口函数一律跳过 NULL 行 C FIRST_VALUE/LAST_VALUE/NTH_VALUE 默认 RESPECT NULLS 会把 NULL 作为取值结果,IGNORE NULLS 用于取最近非空值,且 LAST_VALUE 需注意默认窗口框架陷阱 ✓ 正确答案 D MySQL 8.0 原生支持 IGNORE NULLS
# 55. MySQL 中 IFNULL 与 PostgreSQL 中 COALESCE 的等价语义是什么? A PostgreSQL 支持 IFNULL 与 COALESCE 两种写法 B IFNULL 可接受任意多个参数 C 双参数 IFNULL 与 COALESCE 等价,PostgreSQL 用标准 COALESCE(可多参数),跨库统一写 COALESCE 最稳妥 ✓ 正确答案 D MySQL 的 ISNULL 与 SQL Server 的 ISNULL 语义相同
# 56. PostgreSQL 中如何将 NULL 排在结果集的最前面?请给出 ORDER BY 子句写法。 A PostgreSQL 升序时默认 NULL 排最前 B 用 ORDER BY col ASC NULLS FIRST 可把 NULL 排最前,NULLS 子句跟随各自的排序列,MySQL 需用 (col IS NULL) 技巧模拟 ✓ 正确答案 C NULLS FIRST 只能用于降序 D NULLS 子句必须写在 ORDER BY 最后
# 57. WHERE col IS NULL 与 WHERE col IS NOT NULL 在执行计划中可能使用索引吗? A NULL 作为普通键值存入 B 树,IS NULL/IS NOT NULL 可走索引,是否使用取决于成本,常用部分索引与组合索引优化 ✓ 正确答案 B IS NULL 永远无法走索引 C IS NOT NULL 过滤性总是很好 D 索引中不存储 NULL
# 58. 三值逻辑下,TRUE AND UNKNOWN 的结果是什么?UNKNOWN AND UNKNOWN 呢? A TRUE AND UNKNOWN 等于 TRUE B AND 中 TRUE 是决定性的 C UNKNOWN AND UNKNOWN 等于 FALSE D TRUE AND UNKNOWN 与 UNKNOWN AND UNKNOWN 都是 UNKNOWN,因为只有 FALSE 在 AND 中决定性、全 TRUE 才为 TRUE ✓ 正确答案
# 59. 如何把 NULL 当作“缺勤”或“未填”的语义保留在数据库中?请给出两条建议。 A 用状态列与值列联动(CHECK 约束)或哨兵值方案,把缺勤/未填等语义显式承载,避免单一 NULL 的语义歧义 ✓ 正确答案 B NULL 本身就能区分"未填"与"不适用" C 统计时无需区分 NULL 来源 D 哨兵值方案无法配合 CHECK 约束
# 60. 交运算(Intersection)能否由差运算推导?请给出等价表达式。 A 交运算无法由差运算推导 B 差运算可由交推导 C 交可由差推导:R ∩ S = R − (R − S),且关系代数由差、并、积、选择、投影构成完备运算集 ✓ 正确答案 D 集合运算之间不存在推导关系
# 61. 第一范式(1NF)要求的原子性具体含义是什么?多值属性、复合属性、重复组违反 1NF 的具体反例与修正方案是什么? A 1NF 允许属性存放任意多个值 B 1NF 要求属性取值原子,多值属性、复合属性、重复组均违反;修正方式是把它们拆为独立表或原子列 ✓ 正确答案 C 重复组符合 1NF D JSON 列一定违反 1NF 且不可修正
# 62. 关系模型中的元组、属性、域分别对应 SQL 里的哪些元素?请列出三组对应关系。 A 元组对应列,属性对应行 B 属性对应索引 C 域对应数据库实例 D 元组对应行、属性对应列、域对应数据类型(及 CREATE DOMAIN 域对象),关系对应表 ✓ 正确答案
# 63. θ-连接(Theta Join)与自然连接的差别是什么?自然连接为何在多列同名列存在时容易产生非预期笛卡尔积? A θ-连接用任意条件显式连接且保留全部列,自然连接自动按所有同名列等值连接并合并同名列,额外同名列会使匹配对膨胀形成隐式笛卡尔积 ✓ 正确答案 B 自然连接需要显式写出连接条件 C 自然连接只按主键连接 D θ-连接自动合并同名列
# 64. 关系代数与关系演算(Tuple Relational Calculus、Domain Relational Calculus)的等价性是如何证明的?Codd 定理的核心思想是什么? A 关系代数的表达能力弱于关系演算 B Codd 定理证明关系代数与安全的关系演算表达能力等价,为声明式 SQL 与过程式执行的分离及优化器改写提供理论基础 ✓ 正确答案 C 关系演算的表达能力更强,包含代数 D 等价性证明不需要安全限定
# 65. 关系的依赖保持分解(Dependency-Preserving Decomposition)与无损连接分解(Lossless Join Decomposition)分别如何判定?请给出 Chase 检验法的步骤。 A 分解无损与依赖保持是同一概念 B 二元分解只要公共属性非空必无损 C Chase 检验法与函数依赖无关 D 无损连接要求自然连接可还原原关系(公共属性为某侧超键),依赖保持要求依赖投影能推导原依赖;Chase 检验法通过变量表反复应用函数依赖判定无损 ✓ 正确答案
# 66. 关系代数的可判定性,给定一个关系代数表达式,能否判定其结果是否为空?为何此问题是 NP 完全的? A 任意两个关系代数表达式等价性可多项式判定 B 查询包含与等价判定(如 CQ 包含问题)是 NP 完全的,优化器只能依靠规则与启发式进行等价改写 ✓ 正确答案 C 判空问题在任意输入下都是 NP 难的 D 表达式等价性判定与组合搜索无关
# 67. 关系代数表达式树(Expression Tree)如何映射到逻辑计划与物理计划?叶子节点与内部节点的运算符对应关系是什么? A 逻辑计划直接决定具体算法 B 表达式树内部节点只能是基表 C 物理计划与算法选择无关 D 表达式树叶子为基表扫描、内部为代数算子;逻辑计划做等价变换,物理计划为算子选择扫描方式与连接聚合算法,EXPLAIN 输出即物理计划 ✓ 正确答案
# 68. 重命名运算(Rename, ρ)在自然连接消除列名冲突时的标准做法是什么?SQL 中 AS 别名与关系代数 ρ 的对应关系如何? A ρ 只能重命名关系名,不能重命名属性 B AS 别名与 ρ 无任何对应 C ρ 可重命名关系与属性,自然连接冲突时先重命名一侧属性再连接;SQL 表别名对应关系重命名、列别名对应属性重命名 ✓ 正确答案 D 自然连接无法消除列名冲突
# 69. 关系代数与关系演算哪个更接近 SQL 语法?为什么说 SQL 是介于两者之间的语言? A SQL 是完全的过程式语言,等同关系代数 B SQL 语法上更接近声明式的关系演算,但执行时由优化器翻译为关系代数计划,是"演算语义+代数实现"的中间语言 ✓ 正确答案 C SQL 与关系演算毫无关系 D SQL 强制用户指定运算顺序
# 70. 在关系代数中表达“查询所有课程成绩大于 90 的学生姓名”,请用 π、σ、⋈ 写出表达式。 A 该查询用 σ 输出姓名列 B 连接运算必须最后执行 C 表达式为 π_{Sname}(Student ⋈ σ_{Score>90}(SC)):先选择成绩大于 90 的行、再连接学生表、最后投影姓名 ✓ 正确答案 D 该查询无法用关系代数表达
# 71. SQL 中如何判断一列是否为 NULL?请给出正确的语法示例。 A WHERE col = NULL 能正确筛选 NULL 行 B 判空必须用 IS NULL / IS NOT NULL,= NULL 恒为 UNKNOWN 结果为空,判空谓词可直接用于 WHERE、CASE 与 SELECT 列表 ✓ 正确答案 C IS NULL 只能用于 WHERE 子句 D COUNT(col) 会统计 NULL 行