约束、SQL 子句与方言

共 86 题
#

1. CHECK 约束在 MySQL 8.0 之前为何被静默忽略?8.0 之后如何处理跨行 CHECK(如 sum(balance) = 0)?

A MySQL 8.0 前 CHECK 被解析但静默忽略,8.0.16 起真正生效但仍不支持跨行校验,跨行约束需用触发器实现 ✓ 正确答案
B MySQL 所有版本的 CHECK 都正常生效
C MySQL 8.0 支持跨行 CHECK 聚合
D 5.7 中 CHECK 会强制校验
#

2. DEFERRABLE 与 INITIALLY DEFERRED、INITIALLY IMMEDIATE 三种约束检查时机的语义差异是什么?多约束依赖的循环依赖如何用延迟约束解决?

A DEFERRABLE 约束永远在语句结束时检查
B NOT DEFERRABLE 约束可以随时延迟
C INITIALLY DEFERRED 把检查推迟到事务提交,DEFERRABLE+INITIALLY IMMEDIATE 默认语句级检查且可用 SET CONSTRAINTS 切换,延迟约束可解决相互外键的循环插入 ✓ 正确答案
D 延迟约束在每条语句后立即报错
#

3. NOT NULL 约束在 PostgreSQL、MySQL、Oracle 中的实现差异是什么?为什么说 NOT NULL 是最廉价的完整性保证?

A Oracle 中 NOT NULL 是独立索引对象
B NOT NULL 用列标志或系统 CHECK 实现、检查成本极低,被称为最廉价的完整性保证;Oracle 因 '' 视为 NULL 使 NOT NULL 同时拒绝空串 ✓ 正确答案
C NOT NULL 需要维护索引
D 三库对 '' 的处理完全一致
#

4. 主键约束(PRIMARY KEY)与唯一约束(UNIQUE)的根本区别是什么?从空值允许性、索引类型、约束数量、外键引用四个维度对比。

A 主键是 UNIQUE+NOT NULL 且每表最多一个、InnoDB 中兼作聚簇索引、兼作复制标识符;唯一约束允许多 NULL 且可多个并存 ✓ 正确答案
B 主键列允许 NULL
C 唯一约束只能建一个
D 外键不能引用唯一约束列
#

5. 信息_SCHEMA 中的 TABLE_CONSTRAINTS、KEY_COLUMN_USAGE、REFERENTIAL_CONSTRAINTS、CHECK_CONSTRAINTS 视图结构与查询模式是什么?

A TABLE_CONSTRAINTS 记录每个约束涉及的列
B MySQL 8.0 没有 CHECK_CONSTRAINTS
C REFERENTIAL_CONSTRAINTS 不包含 DELETE_RULE
D TABLE_CONSTRAINTS 列约束类型、KEY_COLUMN_USAGE 关联约束与列、REFERENTIAL_CONSTRAINTS 提供外键级联动作、CHECK_CONSTRAINTS 提供 CHECK 文本,可关联查询约束全貌 ✓ 正确答案
#

6. 参照完整性与分布式事务的两阶段提交(2PC)冲突时如何解决?外键检查在跨库场景下的三种实现模式(同步、异步、关闭)如何取舍?

A 分布式数据库能原生保证跨节点外键
B 外键是单库机制,跨库引用需在应用层解决;同步校验一致性最强但代价高,异步校验有最终一致窗口,关闭模式风险最高,工程上按数据域混合取舍 ✓ 正确答案
C 2PC 可以无成本地跨库检查外键
D 关闭外键校验不会产生孤儿数据
#

7. 唯一约束在 PostgreSQL 中允许多个 NULL(认为 NULL ≠ NULL),而在 SQL Server 中如何?能否通过唯一索引或条件索引模拟差异?

A SQL Server 唯一索引允许多个 NULL
B PostgreSQL 唯一索引允许多个 NULL;SQL Server 唯一索引默认只允许一个 NULL(唯一约束允许多 NULL),可用过滤索引/表达式唯一索引互相模拟 ✓ 正确答案
C PostgreSQL 唯一约束只允许一个 NULL
D 唯一索引不存储 NULL
#

8. 复合主键(Composite Primary Key)的选择准则是什么?三列及以上复合键在二级索引、外键引用、ORM 映射上的代价有哪些?

A 复合主键列数越多,二级索引体积越小
B 复合主键适合业务天然联合唯一的场景;列数多会放大二级索引与外键体积、增加 ORM 主键类复杂度,常规场景更推荐代理主键加联合唯一约束 ✓ 正确答案
C 外键引用复合主键只需引用其中一列
D 复合主键最利于分布式分片
#

9. 外键约束的参照动作(RESTRICT、CASCADE、SET NULL、SET DEFAULT、NO ACTION)在不同数据库中的默认行为与差异是什么?

A NO ACTION 与 RESTRICT 都拒绝父行删除,标准中 NO ACTION 可延迟而 RESTRICT 不可;MySQL InnoDB 默认 NO ACTION 且不支持 SET DEFAULT,PostgreSQL 支持全部五种动作 ✓ 正确答案
B 所有数据库都支持 SET DEFAULT
C MySQL 默认 CASCADE
D RESTRICT 与 NO ACTION 在所有场景都不可延迟
#

10. 完整性约束的分类体系(域完整性、实体完整性、参照完整性、用户定义完整性)在 SQL 标准与各数据库方言中是如何实现的?

A 域完整性由外键实现
B MySQL 8.0 前 CHECK 完全生效
C 域完整性由类型/NOT NULL/CHECK/DOMAIN 实现,实体完整性由主键唯一约束实现,参照完整性由外键实现,用户定义完整性由 CHECK/触发器实现;断言在所有主流库中均未实现 ✓ 正确答案
D PostgreSQL 不支持 CREATE DOMAIN
#

11. 断言(ASSERTION)在 SQL 标准中定义但几乎所有数据库都未实现的原因是什么?PostgreSQL 的 DOMAIN CONSTRAINT 与触发器如何近似替代?

A 断言因实现代价高、性能不可控与标准含糊而未被主流数据库实现,跨行不变式用触发器(或物化视图对账)替代,单行规则可用 DOMAIN 约束复用 ✓ 正确答案
B 断言在所有主流数据库中都已实现
C 触发器无法替代断言的跨行校验
D DOMAIN 约束可以跨表引用
#

12. 约束的命名规范(CONSTRAINT name ...)在错误信息定位、迁移工具识别、运维管理上的价值是什么?请给出 PostgreSQL 与 MySQL 的命名惯例。

A 匿名约束报错时名称也易于定位
B 约束名不需要唯一
C 显式命名约束便于错误定位、迁移工具识别与运维管理,惯例为前缀+表名+列名(如 pk_/uk_/fk_/ck_),并需注意 PostgreSQL 约束名 63 字节限制 ✓ 正确答案
D 迁移工具按列名识别约束,与约束名无关
#

13. 约束的禁用与启用(ALTER TABLE ... DISABLE/ENABLE CONSTRAINT)在 MySQL、Oracle、PostgreSQL 中各自如何实现?

A 三库都支持 ALTER TABLE ... DISABLE CONSTRAINT
B Oracle 原生支持 DISABLE/ENABLE(含 NOVALIDATE),PostgreSQL 无 DISABLE 但可用 NOT VALID 与延迟约束,MySQL 只能删除后重建 ✓ 正确答案
C PostgreSQL 可直接禁用外键约束
D MySQL 支持 ENABLE NOVALIDATE 语法
#

14. CHECK 约束在 PostgreSQL 中如何引用其他列?跨表 CHECK 约束如何用触发器实现?

A CHECK 可以引用其他表的列
B 表级 CHECK 可引用同表任意列但不可跨表跨行、不可用子查询,跨表不变式需用触发器实现并注意循环依赖与性能 ✓ 正确答案
C CHECK 只能引用所在列
D CHECK 中可以使用 now() 等 volatile 函数
#

15. 参照完整性检查时机的同步(immediate)与异步(deferred)在多表更新事务中的取舍是什么?

A immediate 检查在事务提交时执行
B immediate 与 deferred 无任何区别
C deferred 检查违反约束不报错
D immediate 语句末检查错误发现早但要求写入顺序,deferred 提交前检查允许任意顺序写入(循环引用、批量导入友好),但失败推迟到提交、回滚成本高 ✓ 正确答案
#

16. 唯一约束与主键约束在 NULL 处理上的差异如何影响业务建模?业务上“软删除唯一”的常见解法(条件唯一索引、版本列)是什么?

A 软删除行不影响唯一约束
B 软删除后历史行仍占用唯一值,可用部分(过滤)唯一索引(PG/SQL Server)或生成列技巧(MySQL)只对未删除行强制唯一,也可用业务键+版本列联合唯一 ✓ 正确答案
C 唯一约束会忽略软删除行
D MySQL 8.0 原生支持部分索引
#

17. 唯一约束在多列(联合唯一)下的 NULL 处理,两列均为 NULL 时是否违反?部分列为 NULL 时如何?

A (NULL, NULL) 行重复时违反联合唯一
B (1, NULL) 与 (1, NULL) 会被判为重复
C 联合唯一键中任一列为 NULL 就不与任何行构成重复(全 NULL、部分 NULL 均放行),PostgreSQL 15+ 可用 NULLS NOT DISTINCT 或 COALESCE 归一实现 NULL 参与唯一 ✓ 正确答案
D 联合唯一对部分 NULL 的行强制唯一
#

18. 域(DOMAIN)与类型(TYPE)的差异,自定义类型如何携带 CHECK 约束?PostgreSQL 的 CREATE DOMAIN 用法与限制是什么?

A DOMAIN 是全新的数据类型,需要 IO 函数
B DOMAIN 可以跨表引用其他列
C DOMAIN 是基于现有类型附加 CHECK/DEFAULT/NOT NULL 规则的轻量包装,规则一处定义多处复用;TYPE 定义新数据表示,域的 CHECK 只能引用单值表达式 ✓ 正确答案
D DOMAIN 与底层类型在函数匹配上完全等价
#

19. 外键列上是否会自动创建索引?MySQL InnoDB 的处理是怎样的?为何 PostgreSQL 不自动创建?

A 所有数据库都自动为外键列建索引
B PostgreSQL 会自动创建外键索引
C InnoDB 定义外键时自动创建索引(无则强制补建),PostgreSQL 出于职责分离与性能透明不自动建,漏建会导致父表删除时全表扫描子表 ✓ 正确答案
D 外键列索引对性能无影响
#

20. 外键约束在自引用(parent_id)场景下的设计陷阱有哪些?为什么无限层级的树需要额外的层级深度校验?

A 外键约束能自动防止树中环路
B ON DELETE CASCADE 对树安全无风险
C 自引用外键只保证引用存在,不防环路与无限嵌套,需在写入时做环检测与深度上限校验,查询侧用终止条件或物化路径规避递归失控 ✓ 正确答案
D 递归 CTE 不需要终止条件
#

21. 如何在 PostgreSQL 中查询违反约束的具体数据行?请给出违反信息的查询模式(pg_constraint、触发器报错回溯)。

A 可从报错提取约束名,用 pg_constraint 与 pg_get_constraintdef 还原定义,再按类型扫描:唯一冲突用 GROUP BY HAVING、外键悬空用 LEFT JOIN IS NULL、CHECK 违反用取反表达式 ✓ 正确答案
B 违反约束的数据不可能存在于表中
C pg_constraint 不包含约束定义
D 唯一冲突无法用 SQL 查出
#

22. 完整性约束的性能开销如何评估?CHECK、NOT NULL、UNIQUE 在写入路径上的代价排序是怎样的?

A 写入代价排序约为 NOT NULL < CHECK < UNIQUE/主键 < 外键,外键因跨表读父表索引与子表扫描最贵,评估可用 EXPLAIN 与压测 ✓ 正确答案
B 外键约束检查只在本表进行,开销最低
C UNIQUE 检查无需索引查找
D CHECK 约束总是零开销
#

23. 延迟约束在批量数据导入(COPY、INSERT ... SELECT)场景下的优势是什么?为何在 OLTP 高频写入场景应避免使用?

A 延迟约束适合所有场景
B OLTP 场景延迟约束能提升错误定位速度
C 延迟约束不检查数据
D 批量导入用延迟约束可把逐行检查合并到提交前一次完成并允许任意写入顺序,但 OLTP 高频场景会因提交期检查峰值、错误推迟与锁放大而应避免 ✓ 正确答案
#

24. 约束的级联删除(CASCADE)在多层级外键(祖→父→子)下的传递行为是怎样的?递归删除的终止条件与死循环如何检测?

A CASCADE 只删除直接子行
B 级联删除跨事务执行
C 环形外键级联删除总能正确终止且不会报错
D 多层级 CASCADE 会沿外键链递归删除整棵引用子树,靠"无引用自然终止"与"行去重(已处理集合)"结束(无固定层数上限),SQL Server 限制同一表在级联链中只能出现一次 ✓ 正确答案
#

25. 触发器与约束的执行先后顺序如何?BEFORE INSERT 触发器能否修改 NEW.col 以满足后续 CHECK 约束?

A 约束检查先于 BEFORE 触发器执行
B AFTER 触发器先于约束执行
C BEFORE 触发器不能修改 NEW
D 执行顺序为 BEFORE 触发器 → 约束检查 → AFTER 触发器,BEFORE 触发器可修改 NEW 值使后续 CHECK 对清洗后的数据校验 ✓ 正确答案
#

26. CHECK 约束的典型用法示例(CHECK (age >= 0 AND age <= 150))?

A CHECK 可校验数值范围、枚举、跨列逻辑关系,但 NULL 返回 UNKNOWN 放行、表达式需确定,枚举小集合也常用 ENUM 或字典表替代 ✓ 正确答案
B CHECK (age >= 0 AND age <= 150) 会拒绝 NULL
C CHECK 约束可以调用 now() 函数
D CHECK 只能约束单列
#

27. MySQL 中如何查询某张表上所有的约束信息?请给出 INFORMATION_SCHEMA 查询。

A 只能通过 SHOW CREATE TABLE 查看约束
B MySQL 8.0 没有 CHECK_CONSTRAINTS 视图
C INFORMATION_SCHEMA 不含外键信息
D 用 TABLE_CONSTRAINTS 查约束类型、KEY_COLUMN_USAGE 关联列与引用表、REFERENTIAL_CONSTRAINTS 查级联动作、CHECK_CONSTRAINTS(8.0.16+)查 CHECK 文本 ✓ 正确答案
#

28. 为什么 NOT NULL 约束在数据迁移时经常被遗漏?请给出两种检测方法。

A NOT NULL 是列属性而非独立约束对象、文档常缺可空性标注、测试数据无 NULL 掩盖问题,检测可用 information_schema.is_nullable 对比或 NULL 数据扫描/NOT VALID 校验 ✓ 正确答案
B NOT NULL 迁移不可能被遗漏
C 所有导出工具都完整包含 NOT NULL
D is_nullable 字段不存在于 information_schema
#

29. 主键约束的 SQL 写法,在 CREATE TABLE 与 ALTER TABLE 中分别如何声明?

A ALTER TABLE 加主键无需检查存量数据
B 主键只能建表时声明
C 主键可在 CREATE TABLE 列级/表级声明,也可 ALTER TABLE ADD PRIMARY KEY 追加,追加前需保证数据非空唯一,且主键自动创建唯一索引 ✓ 正确答案
D 主键列允许 NULL
#

30. 外键约束声明 ON DELETE CASCADE 的含义是什么?请用一个父子表举例说明。

A CASCADE 使父行删除时子行自动保留
B CASCADE 只影响一行
C 父行删除时引用它的子行自动级联删除(同事务完成),适合生命周期一致的父子表;隐式连锁删除影响面大,删除前应预估影响行数 ✓ 正确答案
D 级联删除会产生逐行应用日志
#

31. CASE WHEN 表达式与 COALESCE、NULLIF 的等价转换规则是什么?搜索式 CASE 与简单式 CASE 的差异如何?

A NULLIF(a,b) 等价于 CASE WHEN a = b THEN 0 ELSE a END
B CASE WHEN 不能处理 NULL 判断
C 简单式 CASE 支持范围条件
D COALESCE(a,b) 等价于 CASE WHEN a IS NOT NULL THEN a ELSE b END,NULLIF 等价于相等时返回 NULL 的 CASE;简单式 CASE 只做等值分派且 WHEN NULL 恒不命中 ✓ 正确答案
#

32. DISTINCT 与 GROUP BY 的等价关系是什么?两者在执行计划与性能上的差异如何?

A DISTINCT 与任何 GROUP BY 都等价
B 无聚集函数的 GROUP BY 与 DISTINCT 结果等价(都是去重),执行上可能都采用排序或哈希聚合,带聚集时必须用 GROUP BY ✓ 正确答案
C GROUP BY 不能去重
D DISTINCT 的性能总是优于 GROUP BY
#

33. GROUP BY 的扩展语法(GROUPING SETS、ROLLUP、CUBE)在 PostgreSQL 与 SQL Server 中的支持差异如何?请给出多维聚合的等价写法。

A MySQL 8.0 原生支持 GROUPING SETS 与 CUBE
B CUBE 与 ROLLUP 完全相同
C ROLLUP 只产生总计一行
D PostgreSQL 与 SQL Server 原生支持 GROUPING SETS/ROLLUP/CUBE,MySQL 8.0 仅支持 WITH ROLLUP,可用 UNION ALL 分段拼接等价实现 ✓ 正确答案
#

34. LIMIT/OFFSET 的分页语义与 OFFSET 性能问题,大表 OFFSET 1000000 的代价如何?

A OFFSET 越大,数据库仍能立即定位
B OFFSET 需要扫描并丢弃前 m 行(无法提前终止),深分页线性变慢;键集分页(WHERE 排序键 > 上页末值)利用索引使代价与页深无关 ✓ 正确答案
C LIMIT 可以跳过前 m 行
D 深分页性能与偏移量无关
#

35. ORDER BY 子句的稳定性(Stable Sort)保证,相同排序键值的元组在多次执行中顺序是否一致?PostgreSQL 与 MySQL 的实现差异?

A SQL 标准允许相同键行任意乱序
B 相同键行顺序一定随机
C 标准要求稳定排序:相同键行相对顺序保持一致;PostgreSQL 确定性较强,MySQL 早期 filesort 对相同键不保证,工程上应在 ORDER BY 追加唯一列决胜 ✓ 正确答案
D 两库实现完全一致
#

36. SELECT 语句的完整逻辑执行顺序(FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT)与书写顺序的差异如何影响查询理解?

A 逻辑顺序为 FROM→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT,因此别名在 WHERE 中不可见而在 ORDER BY 中可见,WHERE 中不能使用聚集函数 ✓ 正确答案
B WHERE 中可以使用 SELECT 定义的别名
C SELECT 最先执行
D HAVING 先于 WHERE 执行
#

37. SQL 中标量子查询(Scalar Subquery)的使用限制(单值、单列)是什么?返回多行或多列时各报什么错误?

A 标量子查询可以返回任意多行
B 标量子查询可返回多列用于任意位置
C 零行结果报错
D 标量子查询必须单行单列:多行报错(PG/MySQL/Oracle 各有报错信息)、多列报错(行构造器除外),零行结果返回 NULL ✓ 正确答案
#

38. SQL 子句的执行阶段如何影响列别名可见性?为什么 SELECT 定义的别名在 WHERE 中不可用但在 ORDER BY 中可用?

A WHERE 中可以使用 SELECT 别名
B ORDER BY 中也不能用别名
C SELECT 别名在 WHERE/GROUP BY 阶段尚未生成故不可用,在 ORDER BY 阶段已生成故可用;MySQL 对 GROUP BY/HAVING 使用别名较宽松而 PostgreSQL 严格拒绝 ✓ 正确答案
D 别名在 FROM 阶段不可用
#

39. EXISTS 与 IN 在处理 NULL 时的差异如何?请用三值逻辑分析 NOT IN 包含 NULL 时的语义陷阱。

A NOT IN 与 NOT EXISTS 含 NULL 时行为相同
B NULL 对 IN 无任何影响
C IN 子查询含 NULL 恒返回空
D EXISTS 只判行存在性不受 NULL 影响,IN 是逐值比较;NOT IN 子查询含 NULL 时"<> NULL"恒为 UNKNOWN 且需全 TRUE 才保留,结果恒为空,应改 NOT EXISTS 或过滤 NULL ✓ 正确答案
#

40. FROM 子句中的派生表(Derived Table)与 CTE 的语义差异如何?派生表能否引用自身?CTE 的 MATERIALIZED 关键字的作用是什么?

A 派生表支持递归引用自身
B CTE 可命名、复用、互相引用并支持递归,派生表仅内嵌于单条语句且不可自引用;PostgreSQL 的 MATERIALIZED 可强制物化、NOT MATERIALIZED 强制内联 ✓ 正确答案
C CTE 与派生表完全等价
D MATERIALIZED 是所有数据库共有的关键字
#

41. GROUP BY 中使用别名(按 SELECT 别名分组)在 MySQL 中的允许性与 PostgreSQL 的严格性差异如何?

A PostgreSQL 允许 GROUP BY 使用别名
B 所有数据库都拒绝别名分组
C 别名分组没有任何歧义
D MySQL(及 SQL Server)允许 GROUP BY/HAVING 引用 SELECT 别名,PostgreSQL 按逻辑顺序严格拒绝,跨库应写完整表达式分组 ✓ 正确答案
#

42. IN 与 = ANY 与 EXISTS 的等价条件与性能差异,在大子查询场景下各自的最优选择是什么?

A IN 与 = ANY 语法等价,现代优化器会把它们与相关 EXISTS 统一改写为半连接算子;外层行少用相关 EXISTS、子查询小用 IN/ANY,最终以 EXPLAIN 为准 ✓ 正确答案
B 三者执行计划永远不同
C EXISTS 无法改写为半连接
D IN 的性能永远优于 EXISTS
#

43. JOIN 子句中 ON 与 WHERE 的差异,ON 在连接前过滤,WHERE 在连接后过滤。请用 LEFT JOIN 举例说明误用 WHERE 导致 INNER JOIN 化的陷阱。

A 外连接中 ON 与 WHERE 完全等价
B ON 在连接配对阶段过滤、WHERE 在连接后过滤,内连接两者等价;外连接中 WHERE 过滤补 NULL 行会使 LEFT JOIN 退化为 INNER JOIN,配对条件应放 ON ✓ 正确答案
C 内连接中 ON 与 WHERE 也语义不等价
D WHERE 条件不影响外连接结果
#

44. WHERE 子句中 AND、OR、NOT 的优先级规则是怎样的?括号缺失时的常见陷阱有哪些?

A OR 优先级高于 AND
B NOT 优先级最低
C 优先级为 NOT > AND > OR,OR 与 AND 混用、NOT 作用范围是常见陷阱,条件组合应显式加括号 ✓ 正确答案
D 括号只影响性能不影响语义
#

45. HAVING 子句能否单独使用而不带 GROUP BY?请举例说明。

A HAVING 必须与 GROUP BY 同时出现
B 无 GROUP BY 时 HAVING 报语法错误
C HAVING 与 WHERE 完全等价
D 无 GROUP BY 时全表视为单个隐式分组,HAVING 可对全表聚合结果过滤,但 SELECT 列表只能输出聚集或常量 ✓ 正确答案
#

46. LIMIT 10 OFFSET 20 表示跳过多少行、取多少行?

A LIMIT 10 OFFSET 20 取第 1-10 行
B OFFSET 表示取多少行
C LIMIT 10 OFFSET 20 跳过 20 行取最多 10 行(第 21-30 行),页码换算为 OFFSET=(N-1)*size,且分页必须配 ORDER BY ✓ 正确答案
D 分页无需 ORDER BY 也稳定
#

47. SELECT DISTINCT 与 SELECT 的差异如何?

A SELECT DISTINCT 与 SELECT 完全等价
B DISTINCT 不处理 NULL
C DISTINCT 保留所有重复行
D DISTINCT 对选中列完全相同的行去重(NULL 归并为一个),等价于无聚集的 GROUP BY,需排序或哈希实现、有额外代价 ✓ 正确答案
#

48. WHERE col IN (1, 2, 3) 与 WHERE col = 1 OR col = 2 OR col = 3 是否等价?

A IN 与 OR 语义不等价
B col IN (1,2,3) 与 col=1 OR col=2 OR col=3 语义等价且优化器常等价改写(IN 列表大时甚至更优),NULL 行为一致,字面量列表应优先用 IN ✓ 正确答案
C IN 遇到 NULL 恒为真
D OR 版本性能总是优于 IN
#

49. CTE(Common Table Expressions)在 SQL:1999 引入,递归 CTE 的标准语法与各数据库方言的差异?

A 所有数据库都不支持递归 CTE
B 标准语法为 WITH RECURSIVE + 锚点查询 UNION [ALL] 递归查询;各库差异在 RECURSIVE 关键字、递归深度上限(SQL Server 默认 100、MySQL 默认 1000)与 Oracle 的 CONNECT BY 替代 ✓ 正确答案
C 递归 CTE 不需要终止条件
D MySQL 8.0 不支持递归 CTE
#

50. MERGE 语句在 SQL:2003 标准化,Oracle 早已支持,PostgreSQL 15 之前不支持、SQL Server 长期支持、MySQL 8.0 不支持的现状如何?

A 四库都原生支持 MERGE
B Oracle 最早支持、SQL Server 长期支持、PostgreSQL 15 才正式支持(此前用 ON CONFLICT)、MySQL 8.0 不支持(用 ON DUPLICATE KEY UPDATE 替代) ✓ 正确答案
C PostgreSQL 从不支持 UPSERT
D MySQL 的 ON DUPLICATE KEY UPDATE 可精确指定冲突目标
#

51. PostgreSQL 对 SQL 标准的支持度(高度兼容)与 MySQL(弱兼容)的具体差异在哪些子句上体现?

A MySQL 与 PostgreSQL 的标准支持度完全一致
B PostgreSQL 标准特性齐全且行为严格(窗口函数、递归 CTE、布尔、CHECK、GROUP BY 分组列强制),MySQL 弱兼容(TINYINT(1) 模拟布尔、分组宽松、部分特性 8.0 才补齐) ✓ 正确答案
C PostgreSQL 不支持窗口函数
D MySQL 的 CHECK 一直生效
#

52. SQL/PSM(Persistent Stored Modules)与 SQL/CLI(Call Level Interface)在存储过程与客户端 API 标准化上的差异是什么?

A PSM 定义客户端 API
B 各库存储过程语言完全可移植
C CLI 定义过程语言语法
D SQL/PSM 标准化服务器端存储过程语言(各库实现为 PL/SQL、T-SQL、PL/pgSQL 等互不兼容),SQL/CLI 标准化客户端调用接口(落地为 ODBC/JDBC 风格 API) ✓ 正确答案
#

53. 三大主流数据库方言(PostgreSQL、MySQL、SQL Server、Oracle)在分页、字符串函数、日期函数、自增字段、布尔类型上的差异矩阵是什么?

A 分页(LIMIT vs OFFSET/FETCH vs ROWNUM)、字符串拼接(|| vs CONCAT vs +)、日期函数(NOW/GETDATE/SYSDATE)、自增(SERIAL/AUTO_INCREMENT/IDENTITY)、布尔(BOOLEAN/TINYINT/BIT/NUMBER)在四库差异显著,迁移需按矩阵映射并注意语义细节 ✓ 正确答案
B 四库分页语法完全一致
C 布尔类型四库都原生支持
D Oracle 无 FETCH 分页
#

54. 布尔类型(BOOLEAN)在 PostgreSQL 原生支持、SQL Server 用 BIT、MySQL 用 TINYINT(1)、Oracle 用 NUMBER(1) 的差异如何影响跨方言迁移?

A 四库都原生支持 BOOLEAN
B PostgreSQL 原生 BOOLEAN(三值、可直接作谓词),SQL Server BIT、MySQL TINYINT(1)、Oracle NUMBER(1) 均非原生;迁移需 DDL 类型映射、WHERE 改写为 =1 并注意 NULL 与驱动取值差异 ✓ 正确答案
C MySQL 的 TINYINT(1) 与布尔完全等价
D Oracle SQL 层有原生布尔类型
#

55. 窗口函数(Window Functions)在 SQL:2003 中标准化,PostgreSQL 与 MySQL 8.0 的实现差异(命名、语法、聚合函数支持)是什么?

A MySQL 8.0 与 PostgreSQL 的窗口函数支持完全相同
B MySQL 8.0 没有窗口函数
C PostgreSQL 支持完整标准(FILTER、WINDOW 复用、GROUPS 框架),MySQL 8.0 支持核心函数但不支持 FILTER/GROUPS/WINDOW 子句,迁移需改写 ✓ 正确答案
D ROW_NUMBER 在 MySQL 中不可用
#

56. MySQL 的 LIMIT、PostgreSQL 的 LIMIT/OFFSET、SQL Server 的 TOP、Oracle 的 ROWNUM 与 FETCH FIRST 四种分页方言的等价写法?

A 四库分页写法完全一致
B ROWNUM 在排序前已按全局顺序赋值
C SQL Server 的 TOP 直接支持 OFFSET
D MySQL/PG 用 LIMIT/OFFSET,SQL Server 与 Oracle 12c+ 用 OFFSET/FETCH,Oracle 老版本用 ROWNUM 三层嵌套(先排序再限上限再滤下限),且 ROWNUM 过滤前赋值导致 ROWNUM > 20 恒空 ✓ 正确答案
#

57. PostgreSQL 的 :: 类型转换、MySQL 的 CONVERT/CAST、Oracle 的 TO_CHAR/TO_DATE 函数差异如何统一为标准 CAST AS?

A Oracle 的 CAST 可转换任意类型且无格式要求
B PostgreSQL 用 :: 或 CAST、MySQL 用 CAST/CONVERT、Oracle 的字符串与日期转换依赖 TO_CHAR/TO_DATE 格式模型;跨库统一用标准 CAST 加 ISO 格式字符串 ✓ 正确答案
C MySQL 不支持 CAST
D 四库隐式转换行为完全一致
#

58. 方言检测方法,通过 INFORMATION_SCHEMA、版本函数(VERSION()、@@version)识别数据库类型的策略?

A 只能通过连接字符串判断数据库类型
B @@version 在所有数据库都可用
C 可用版本函数(version()/@@version/v$version)、元数据特性(information_schema 差异、pg_catalog)与能力探测(试执行特性语句)三层策略识别厂商与版本,并缓存探测结果 ✓ 正确答案
D 能力探测无法区分版本
#

59. 日期/时间函数 NOW()、CURRENT_TIMESTAMP、GETDATE()、SYSDATE 在四家数据库中的差异如何?

A NOW() 在四库语义完全相同
B CURRENT_TIMESTAMP 只在 PostgreSQL 可用
C Oracle 的 SYSDATE 精度为微秒
D 当前时间函数各有不同(PG NOW 为事务时间、MySQL NOW 为语句时间、SQL Server GETDATE、Oracle SYSDATE 秒级),标准 CURRENT_TIMESTAMP 四库可用,差异在语义、精度与时区绑定 ✓ 正确答案
#

60. MySQL 与 PostgreSQL 在字符串拼接运算符上的差异是什么?

A MySQL 与 PostgreSQL 的 || 语义相同
B PostgreSQL 的 || 拼接且 NULL 传播,MySQL 默认 || 是逻辑或(需 CONCAT 或 PIPES_AS_CONCAT),且两库 CONCAT 对 NULL 的处理不同,可移植写法用 CONCAT/CONCAT_WS 并显式处理 NULL ✓ 正确答案
C MySQL 的 CONCAT 忽略 NULL
D PostgreSQL 的 concat() 传播 NULL
#

61. Oracle 中如何实现 PostgreSQL 的 LIMIT/OFFSET 分页?

A Oracle 所有版本都支持 LIMIT 语法
B Oracle 12c+ 用 OFFSET/FETCH(等价 LIMIT/OFFSET),老版本用 ROWNUM 三层嵌套,且 ROWNUM 在排序前赋值导致 WHERE ROWNUM > 20 恒为空 ✓ 正确答案
C ROWNUM 在 ORDER BY 后赋值
D WHERE ROWNUM > 20 可以正常分页
#

62. PostgreSQL 中的 RETURNING 子句源自哪个 SQL 标准扩展?

A RETURNING 是 MySQL 8.0 的原生功能
B Oracle 的 RETURNING INTO 可直接返回结果集
C PostgreSQL 的 RETURNING 是其扩展特性(文档明确标注非 SQL 标准,对标 SQL Server OUTPUT、Oracle RETURNING INTO),用于 DML 返回受影响行,可配合 CTE 构建修改后管道 ✓ 正确答案
D RETURNING 只能用于 SELECT
#

63. SQL Server 的 TOP n 与 PostgreSQL 的 LIMIT n 语法差异如何?

A TOP 写在查询末尾
B TOP 可以直接实现 OFFSET
C LIMIT 支持 PERCENT
D SQL Server 的 TOP n 写在 SELECT 之后、PostgreSQL 的 LIMIT 写在末尾,二者取前 n 等价;SQL Server 分页用 OFFSET/FETCH,TOP 还支持 PERCENT 与 WITH TIES ✓ 正确答案
#

64. SQL 方言迁移(MySQL → PostgreSQL)的常见语法替换清单有哪些?

A 迁移只需替换语法,无行为差异
B UPDATE ... LIMIT 在 PostgreSQL 中支持
C MySQL 的 GROUP BY 宽松行为 PG 同样支持
D 典型映射包括 AUTO_INCREMENT→IDENTITY、IFNULL→COALESCE、GROUP_CONCAT→string_agg、ON DUPLICATE→ON CONFLICT、反引号→双引号;还需注意 GROUP BY 严格性、NULL/空串、事务 DDL 等行为差异 ✓ 正确答案
#

65. 如何在 MySQL 中实现 PostgreSQL 的 ILIKE(大小写不敏感匹配)?

A MySQL 原生支持 ILIKE
B MySQL 可用 LOWER(name) LIKE(配表达式索引)或列排序规则 ci(比较层大小写不敏感、索引友好)实现 ILIKE 语义,且 LIKE 大小写敏感性由排序规则决定 ✓ 正确答案
C LOWER 改写永远无法走索引
D 排序规则只影响排序不影响比较
#

66. 保留关键字(Reserved Words)与非保留关键字的差异,使用保留关键字作为标识符时的引号转义方法(""、``、[])在三种方言中如何?

A 保留关键字不能直接作标识符:PostgreSQL/标准用双引号、MySQL 用反引号、SQL Server 用方括号,且转义后大小写敏感,工程上应避免保留字命名 ✓ 正确答案
B 保留关键字可以直接作列名
C 双引号在 MySQL 默认表示标识符
D 转义标识符在所有数据库都不区分大小写
#

67. 命名空间(Schema、Database、Catalog)的三层结构在 PostgreSQL(Catalog/Schema/Table)、MySQL(Database/Table)、SQL Server(Database/Schema/Table)的差异?

A 三库都是完全相同的三层结构
B 标准为 Catalog→Schema→对象:PostgreSQL 是实例→Database→Schema(Database 隔离强),MySQL 是 Database 即 Schema 的两层(可跨库引用),SQL Server 是实例→Database→Schema(dbo) ✓ 正确答案
C MySQL 有独立的 Schema 层
D PostgreSQL 可以跨 Database JOIN
#

68. 标识符(表名、列名、函数名)在 PostgreSQL、MySQL、SQL Server 中的最大长度限制与字符集支持差异是什么?

A 三库标识符长度限制完全一致
B PostgreSQL 按字符计数
C PostgreSQL 标识符最长 63 字节(超长静默截断)、MySQL 64 字符、SQL Server 128 字符;未加引号标识符字符集有限,跨库应统一 ASCII 命名 ✓ 正确答案
D SQL Server 支持无限长标识符
#

69. MySQL 的 lower_case_table_names 参数(0/1/2)对跨平台迁移的影响是什么?为何在 Linux 默认 0、Windows 默认 1?

A 该参数可随时修改且不影响现有表
B 0 区分大小写(Linux 文件系统原生区分)、1 一律小写(Windows 不区分大小写故默认)、2 存储原样比较小写;8.0 起初始化后不可改且主从必须一致,跨平台应统一全小写表名 ✓ 正确答案
C Windows 默认 0
D 该参数影响列名大小写
#

70. PostgreSQL 中标识符大小写折叠(Case Folding)规则,未加引号的标识符自动转为小写,加双引号保留原大小写。请举例说明查询时的陷阱。

A 未加引号与加引号的标识符等价
B 加双引号也折叠为小写
C 未加引号的标识符折叠为小写(任意大小写写法可命中),加双引号保留大小写且引用必须一致,大小写混合标识符是常见报错来源,工程上应统一小写不带引号 ✓ 正确答案
D CREATE TABLE Users 创建大写的 Users 表
#

71. 对象名长度限制,PostgreSQL 默认 63 字节、MySQL 64 字符、Oracle 30 字节、SQL Server 128 字符的差异对业务命名的影响?

A PostgreSQL 63 字节(超长静默截断)、MySQL 64 字符、Oracle 30 字节(12.2+ 可扩)、SQL Server 128 字符,自动拼接的约束/索引名易超限,需统一长度预算与截断策略 ✓ 正确答案
B 四库上限一致且都按字符计数
C Oracle 允许任意长度
D 超长命名在所有数据库都报错
#

72. MySQL 中反引号 ` 与 PostgreSQL 中双引号 " 的转义用途差异如何?

A 双引号在所有数据库都表示标识符
B MySQL 中单引号表示标识符
C MySQL 的 ` 与 PG 的 " 完全等价
D PostgreSQL 双引号恒为标识符(单引号是字符串),MySQL 默认用反引号转义标识符而双引号表示字符串(ANSI_QUOTES 可切换),跨库代码应避免依赖双引号语义 ✓ 正确答案
#

73. PostgreSQL 中查询当前 Schema 的 search_path 默认值是什么?

A 默认 search_path 为空
B 默认 search_path 为 "$user", public($user 同名 schema 不存在则落点 public),可用 SHOW search_path 与 current_schema() 查看,pg_catalog 隐式优先 ✓ 正确答案
C search_path 不影响对象解析
D current_schemas(true) 返回当前连接串
#

74. 如何在已有表上添加唯一约束?请给出 ALTER TABLE ADD CONSTRAINT 语法。

A 添加唯一约束不检查存量数据
B ALTER TABLE ADD CONSTRAINT ... UNIQUE (col) 会校验存量重复数据(有重复则失败)并自动创建唯一索引,大表可用 CONCURRENTLY 建索引减少锁影响 ✓ 正确答案
C 唯一约束不能是复合的
D 添加约束不需要考虑 NULL 处理
#

75. UNION、UNION ALL、INTERSECT、EXCEPT 的语义差异与去重代价如何?

A UNION ALL 也去重
B INTERSECT 不去重
C UNION/INTERSECT/EXCEPT 都去重(排序或哈希实现),UNION ALL 不去重直接拼接,无需去重时应优先 UNION ALL,EXCEPT 可改写为 NOT EXISTS 以利用索引 ✓ 正确答案
D 集合运算两侧列数可以不同
#

76. BETWEEN ... AND ... 是闭区间还是开区间?包含边界值吗?

A BETWEEN ... AND ... 是闭区间(col BETWEEN 10 AND 20 等价于 col>=10 AND col<=20 且包含边界),日期时间场景注意边界为当日零点、NULL 参与返回 UNKNOWN ✓ 正确答案
B BETWEEN 是开区间
C NOT BETWEEN 包含边界值
D BETWEEN 边界为 NULL 时返回 TRUE
#

77. CASE WHEN 表达式的两种写法(搜索式、简单式)语法差异是什么?

A 简单式(CASE expr WHEN 值)只做等值分派且 WHEN NULL 恒不命中,搜索式(CASE WHEN 条件)支持任意布尔条件与 IS NULL,WHEN 自上而下短路求值、无命中且无 ELSE 时返回 NULL ✓ 正确答案
B 简单式 CASE 支持范围条件
C 两种写法完全等价可互换
D CASE 只能用于 SELECT
#

78. ORDER BY 1 与 ORDER BY column_name 的差异如何?数字 1 表示什么?

A ORDER BY 1 按常量 1 排序
B ORDER BY 1 与列名写法永远等价
C ORDER BY 1 在所有数据库都禁用
D ORDER BY 1 按 SELECT 列表第 1 列排序(位置序号),列顺序变化会静默改变排序,且无自描述性,工程上应使用列名或别名 ✓ 正确答案
#

79. SQL 子句中能否使用列别名(alias)?在哪些子句中可用、哪些不可用?

A WHERE 中可以使用 SELECT 别名
B ORDER BY 不能引用别名
C 所有子句都可用别名
D 列别名在 SELECT 投影阶段才生成,故 WHERE/ON 不可用、ORDER BY 与外层子查询可用,GROUP BY/HAVING 的可用性因库而异(MySQL 宽松、PostgreSQL 严格) ✓ 正确答案
#

80. 方言兼容性策略,跨数据库应用应避免使用哪些方言特定特性?请给出可移植 SQL 的编码规范清单。

A 跨库应用可以放心使用各库扩展语法
B 可移植策略是只用标准语法与函数(CURRENT_TIMESTAMP、CAST、COALESCE、CTE),避免分页/拼接/布尔/自增等方言特性,格式化输出放应用层,DDL 由 ORM/迁移工具生成并在 CI 中做多库回归 ✓ 正确答案
C LIMIT 是标准语法可跨库使用
D 方言差异不影响查询正确性
#

81. 多字节字符(中文、日文、Emoji)作为表名或列名时的兼容性如何?UTF-8 编码下字节长度与字符长度的差异?

A 所有数据库都按字符计算标识符长度
B PostgreSQL 标识符长度按字符计
C 主流库在 UTF-8 下支持中文标识符,但长度计量不同:PostgreSQL 63 字节(约 21 个中文)、MySQL 64 字符;多字节名叠加自动拼接名极易超限,工程上建议 ASCII 命名 ✓ 正确答案
D Emoji 在所有数据库标识符中都完全兼容
#

82. SQL 标准中双引号表示什么?单引号又表示什么?

A 标准中双引号表示字符串
B 单引号用于标识符
C 所有数据库的双引号都表示字符串
D 标准规定双引号是标识符、单引号是字符串字面量;PostgreSQL 遵循标准,MySQL 默认双引号表示字符串(标识符用反引号,ANSI_QUOTES 可切换),SQL Server 由 QUOTED_IDENTIFIER 控制 ✓ 正确答案
#

83. 标识符命名中的下划线命名法(snake_case)与驼峰命名法(camelCase)哪种更符合 SQL 惯例?

A camelCase 在 PostgreSQL 中无需引号即可稳定使用
B 命名风格不影响跨库兼容性
C 驼峰命名是 SQL 标准要求
D snake_case(小写+下划线)更符合 SQL 惯例:兼容各库大小写折叠(PostgreSQL 未引号标识符折叠小写)、可读性好、ORM/迁移工具默认生成,驼峰命名跨库易出问题 ✓ 正确答案
#

84. ISO/IEC 9075 标准的五部分结构(框架、基础、调用级接口、持久存储模块、对象语言绑定)分别定义了什么?

A 9075-2 定义客户端调用接口
B 9075-4 定义核心 SQL 语法
C ISO/IEC 9075 分框架(9075-1)、基础/核心 SQL(9075-2)、调用级接口 CLI(9075-3)、持久存储模块 PSM(9075-4)、主机语言绑定(9075-5),SQL:1999 起拆分多部分 ✓ 正确答案
D 标准至今仍是单一文档
#

85. SQL 标准的发展历程(SQL-86、SQL-89、SQL-92、SQL:1999、SQL:2003、SQL:2006、SQL:2008、SQL:2011、SQL:2016、SQL:2019、SQL:2023)每个版本引入了哪些核心特性?

A SQL-92 引入递归 CTE
B 厂商实现总是与标准同步
C 窗口函数在 SQL-86 已有
D SQL-92 奠定现代 SQL(外连接、CASE、JOIN 语法),SQL:1999 引入递归 CTE 与对象特性,SQL:2003 引入窗口函数与 MERGE,SQL:2016 起转向 JSON、SQL:2023 引入 SQL/PGQ 图查询 ✓ 正确答案
#

86. SQL-92 标准是 ANSI 还是 ISO 标准化组织的产物?请给出标准号。

A SQL-92 只是 ANSI 标准
B SQL-92 由 ANSI 与 ISO 联合发布:ANSI X3.135-1992 与 ISO/IEC 9075:1992,后续版本统一为 ISO/IEC 9075 多部分系列 ✓ 正确答案
C SQL-92 只是 ISO 标准
D SQL-92 没有标准号