# 1. ER 模型(Entity-Relationship Model)中的实体、属性、联系、标识符在 Chen 记法与 Crow's Foot 记法中的表示差异是什么? A 两种记法都用菱形表示联系 B Crow's Foot 用菱形表示联系 C Chen 记法用矩形/椭圆/菱形表示实体/属性/联系(下划线标键),Crow's Foot 把属性内嵌矩形、用连线上的鸡爪符号表达基数,更贴近物理表设计 ✓ 正确答案 D Chen 记法不支持 1:N 基数
# 2. 基数(Cardinality)的三种语义(min-max、look-here、look-across)在 ER 工具(PowerDesigner、ER/Studio、dbdiagram.io)中的实现差异如何? A 基数有 min-max、look-here、look-across 三种读法,PowerDesigner、ER/Studio、dbdiagram.io 的默认语义不同,跨工具导出可能翻转,应显式 min-max 标注并以生成的 DDL 为准 ✓ 正确答案 B 所有 ER 工具的基数语义完全一致 C look-across 与 look-here 语义相同 D 基数与工具实现无关
# 3. 金融金额场景为什么必须用 DECIMAL/NUMERIC 而非 FLOAT/DOUBLE?二者在存储代价、运算性能与聚合精度累积误差上有何差异? A FLOAT 能精确表示所有十进制小数 B 金额可以用 DOUBLE 安全存储 C 浮点数的 SUM 与 DECIMAL 一样精确 D 二进制浮点无法精确表示 0.1 等十进制小数且误差随聚合累积,金融金额必须用 DECIMAL/NUMERIC(十进制精确、相等比较可靠),代价是存储略大、运算较慢 ✓ 正确答案
# 4. VARCHAR(n) 与 TEXT 在 PostgreSQL 中是否真的完全等价(存储、TOAST、索引)?在 MySQL 中有何差异(行大小 65535 字节限制、索引需指定前缀长度、默认值限制)? A 两库中 VARCHAR 与 TEXT 完全等价 B MySQL 中 TEXT 可全列索引 C PostgreSQL 的 TEXT 不能建索引 D PostgreSQL 中 VARCHAR/TEXT 底层等价(varlena 存储与 TOAST 相同,仅长度约束差异);MySQL 中 TEXT 不占主行 65535 字节、必须前缀索引、旧版无默认值,差异显著 ✓ 正确答案
# 5. SMALLINT/INT/BIGINT 的选择依据是什么?存储对齐与填充(alignment padding)如何影响复合行与数组的实际占用? A 选型按范围与增长(SMALLINT 2 字节/INT 4 字节/BIGINT 8 字节),字段顺序不当会产生对齐填充空洞影响行宽,类型选择间接影响页内行数与缓存效率 ✓ 正确答案 B INT 可以安全容纳任意数值 C 对齐填充只影响数组不影响行 D 所有整数类型都占 4 字节
# 6. DATE/TIMESTAMP/TIMESTAMPTZ 的选择矩阵是怎样的?为什么跨时区业务应存 TIMESTAMPTZ 而“日历日期”用 DATE? A TIMESTAMP 与 TIMESTAMPTZ 存储完全一样 B 所有时间列都应存 TIMESTAMP C TIMESTAMPTZ 无法处理夏令时 D DATE 只存日历日期,TIMESTAMP 存无时区墙上时间,TIMESTAMPTZ 内部存 UTC 瞬时时刻;跨时区事件时刻应存 TIMESTAMPTZ(比较与换算正确),日历日期用 DATE 避免时区漂移 ✓ 正确答案
# 7. 数据类型选择如何影响缓冲缓存效率与 I/O 放大(宽表挤占缓存页、TOAST 外存、行迁移)?建模时应如何权衡? A 行越宽页内行数越少、缓存命中率越低、扫描 I/O 放大;大字段走 TOAST/溢出页(按列访问才读)、行变长可致行迁移,建模应冷热列分离并最小化类型 ✓ 正确答案 B 行宽不影响缓存效率 C TOAST 表永远随主行读取 D 宽表对 OLTP 热列访问无影响
# 8. CHAR(n) 定长类型在现代数据库中是否仍有价值(如定长哈希值、状态码)?它与 VARCHAR 在尾随空格处理与比较语义上有何不同? A CHAR 在现代数据库中仍能省空间 B CHAR 与 VARCHAR 存储完全相同 C 所有库的 CHAR 比较都保留尾随空格 D 现代库中 CHAR 的空间优势已消失,价值在于表达定长语义(哈希值、状态码);尾随空格比较各库不同(MySQL CHAR/VARCHAR 都忽略,PG VARCHAR 不忽略),跨库字符串比较需注意 ✓ 正确答案
# 9. NUMERIC(p,s) 的精度与标度如何选择?超出精度插入时各数据库是报错还是舍入?聚合 SUM 的精度如何扩展? A 所有数据库超精度都自动舍入 B SUM 的精度与单列相同 C 小数位超限一定报错 D NUMERIC(p,s) 中整数位超限各库报错或截断(MySQL 非严格模式截断),小数位超 s 多舍入;SUM 聚合精度会扩展(SQL Server 上限 38 位),聚合前需预估总量 ✓ 正确答案
# 10. ORM/驱动与数据库的类型映射有哪些常见坑(Java int 映射 int4 溢出、LocalDateTime 映射 timestamp 还是 timestamptz、Boolean 映射)? A Java int 可以安全映射任意整数列 B LocalDateTime 与 timestamptz 天然匹配 C 常见坑包括 int 映射 int4/bigint 溢出(雪花 ID 用 long)、LocalDateTime 应映射 timestamp 而 Instant 映射 timestamptz(乱配产生时区偏移)、Boolean 各库表示不同;应显式声明列类型并用边界值测试 ✓ 正确答案 D MySQL TIMESTAMP 无 2038 问题
# 11. 整数溢出在 PostgreSQL(报错)与 MySQL(严格模式报错、非严格模式行为)中的差异是什么?无符号类型能否解决? A MySQL 非严格模式下超范围值会报错 B UNSIGNED 可以解决所有溢出 C PostgreSQL 溢出一律报错,MySQL 严格模式报错、非严格模式静默钳制到边界值;UNSIGNED 只是移动范围仍会溢出且引入转换陷阱,正解是选对类型宽度并开启严格模式 ✓ 正确答案 D 非严格模式的行为与严格模式相同
# 12. BYTEA/BLOB 二进制类型与 Base64 文本存储在空间、索引与查询函数上的差异? A BYTEA/BLOB 直接存字节(省空间),Base64 膨胀约 33% 且压缩失效;二进制字节查询用 bytea 函数,Base64 需解码且函数包裹列影响索引,原生二进制应存 BYTEA/BLOB ✓ 正确答案 B Base64 存储与二进制存储空间相同 C Base64 文本可以按字节精确建索引 D 二进制无法存储图片
# 13. 为什么用字符串存 IP/MAC 是反模式?PostgreSQL 的 INET/CIDR 与 MySQL 的 INET_ATON/INET6_ATON 如何替代并支持范围查询? A 字符串存 IP 支持正确的字典序范围查询 B MySQL 原生支持 INET 类型 C 字符串是 IP 的最佳存储 D 字符串存 IP 排序错误、无法表达网段与高效范围查询,PostgreSQL 应用 INET/CIDR(网络运算+索引),MySQL 用 INET_ATON/INET6_ATON 整数化 ✓ 正确答案
# 14. CREATE TABLE AS 与 SELECT INTO 在 PostgreSQL 与 MySQL 中的功能差异,CTAS 是否复制约束、索引、默认值? A CTAS 会复制主键与外键 B CTAS 只复制列结构与数据,不复制约束/索引/默认值;PostgreSQL 的 SELECT INTO 是旧式等价写法,MySQL 不支持 SELECT INTO 建表,完整结构复制需 LIKE 或重建约束 ✓ 正确答案 C MySQL 支持 SELECT INTO 建表 D CTAS 保留默认值
# 15. CREATE TABLE LIKE 与 CREATE TABLE AS 在复制表结构时的差异,LIKE 复制列定义与约束,CTAS 复制数据但不复制索引与约束。 A LIKE 复制数据但不复制结构 B LIKE 复制存储参数与分区定义 C CTAS 复制索引 D LIKE 复制列定义并可含约束/索引(INCLUDING ALL),CTAS 复制数据与列类型但不复制约束/索引/默认值;需要完整结构+数据时用 LIKE 加 INSERT SELECT 组合 ✓ 正确答案
# 16. CREATE TABLE 的完整语法选项(列定义、约束、表选项、存储参数)在 PostgreSQL、MySQL、SQL Server 中的方言差异是什么? A 列定义与标准约束三库兼容,但引擎/字符集(MySQL)、存储参数/声明式分区/继承(PostgreSQL)、文件组/IDENTITY(SQL Server)等表选项差异显著,自增与分区语法是迁移高频差异 ✓ 正确答案 B 三库 CREATE TABLE 语法完全一致 C MySQL 支持 INHERITS 继承 D SQL Server 没有 IDENTITY
# 17. IF NOT EXISTS / IF EXISTS 在 CREATE TABLE / DROP TABLE 中的幂等性保证与潜在陷阱? A IF NOT EXISTS 会校验表结构是否一致 B IF EXISTS 会报错提示表不存在 C 并发创建一定不会报错 D IF NOT EXISTS 存在即静默跳过(不校验结构),重复执行不报错;陷阱是结构不一致被掩盖、并发竞态仍可能报错,生产应靠迁移工具管理版本 ✓ 正确答案
# 18. Schema(模式)的语义与作用,PostgreSQL 的 CREATE SCHEMA 与 MySQL 的 Database 在命名空间上的等价与差异? A Schema 是对象分组与权限边界:PostgreSQL 用 CREATE SCHEMA + search_path 解析,MySQL 的 CREATE DATABASE 与 CREATE SCHEMA 同义(Database 即命名空间),PG 的实例→Database→Schema 三层与 MySQL 的两层结构不同 ✓ 正确答案 B MySQL 有独立的 Schema 层 C PostgreSQL 的 Schema 不能隔离权限 D 跨库引用在 MySQL 中必须禁用
# 19. 临时表(TEMP TABLE)与永久表的差异,会话级、事务级、跨连接的可见性规则如何在三种方言中实现? A 临时表可以被其他会话访问 B 临时表数据永久保存 C 临时表会话级可见、会话结束自动删除、不参与主数据复制;PG 用 pg_temp+ON COMMIT 控制、MySQL 用 TEMPORARY、SQL Server 用 #/##(tempdb),连接池场景需注意残留清理 ✓ 正确答案 D 临时表不能建索引
# 20. 分区表(Partitioned Table)的声明语法(PARTITION BY RANGE/LIST/HASH)在 PostgreSQL 10+、MySQL 8.0、Oracle 上的差异是什么? A 三库分区语法完全一致 B PostgreSQL 用 PARTITION OF 子表声明且支持子分区与默认分区,MySQL 8.0 内联 VALUES LESS THAN 且唯一键须含分区键、无默认分区,Oracle 功能最全(间隔分区、全局索引);分区键函数包裹会削弱裁剪 ✓ 正确答案 C MySQL 支持全局唯一索引 D 分区裁剪与分区键无关
# 21. 列存表(Column-Oriented)与行存表的声明差异(ClickHouse MergeTree、PostgreSQL 列存扩展、SQL Server 内存列存)的取舍场景是什么? A 行存按行连续存储适合 OLTP 点查更新,列存按列存储、高压缩、扫描只读所需列适合 OLAP;ClickHouse 用 MergeTree 引擎、SQL Server 加列存索引、PostgreSQL 靠扩展实现 ✓ 正确答案 B 列存适合高频点查与更新 C 行存压缩率更高 D MySQL 8.0 原生支持列存表
# 22. 外键引用同表(自引用)、跨 Schema、跨数据库时的语法差异与限制? A 外键可以跨不同数据库实例 B 外键可引用任意非唯一列 C MySQL 外键跨库引用需不同引擎 D 自引用与跨 Schema 外键各库支持;同实例跨库外键 MySQL/SQL Server 可行而 PostgreSQL 不可(数据库物理隔离),跨实例无原生外键,跨库引用应视为反模式 ✓ 正确答案
# 23. 表的物理属性(fillfactor、toast_tuple_target、autovacuum 相关参数)在 PostgreSQL 中的含义与调优场景是什么? A fillfactor 只影响索引不影响堆表 B fillfactor 预留页内空间减少页分裂与 HOT 压力(高频更新表设 70-80),toast_tuple_target 控制大字段何时溢出 TOAST,autovacuum 参数族控制清理触发频率与 I/O 成本,三者按表读写模式调优 ✓ 正确答案 C toast_tuple_target 越大主表越瘦 D autovacuum 参数不能表级覆盖
# 24. 表空间(Tablespace)在 PostgreSQL、Oracle、MySQL 中的实现差异,逻辑表空间如何映射到物理文件系统? A 三库的表空间实现完全一致 B Oracle 表空间不含数据文件 C MySQL 没有表空间概念 D 表空间是逻辑存储与物理路径的映射:PostgreSQL 是目录别名(1GB 段文件)、Oracle 是含数据文件与区块管理的容器、MySQL 默认每表一个 .ibd 文件(8.0 支持通用表空间),用于磁盘分层与备份粒度控制 ✓ 正确答案
# 25. INHERITS(PostgreSQL 继承表)的语义、限制与现代替代方案(分区表)是什么? A 继承表支持跨表唯一约束 B 声明式分区不能替代继承 C 外键可以引用继承父表 D INHERITS 提供列继承与父表扫描含子行,但唯一约束/外键受限且语义易错;PostgreSQL 10+ 的声明式分区(约束传播、DML 路由、分区裁剪)是推荐替代 ✓ 正确答案
# 26. UNLOGGED TABLE(PostgreSQL)的使用场景与崩溃恢复行为是什么? A UNLOGGED 表不写 WAL:写入更快但崩溃后数据被清空、不参与流复制,适合可重建的中间数据与缓存,重要业务数据不能用 ✓ 正确答案 B UNLOGGED 表崩溃后数据仍然保留 C UNLOGGED 表参与流复制 D UNLOGGED 表不受事务控制
# 27. 为什么 PostgreSQL 默认会创建一个 schema 名为 public?删除 public schema 的后果与最佳实践是什么? A public schema 只能删除不能加固 B public 中没有权限风险 C public 由 initdb 默认创建作为 search_path 落点,PostgreSQL 15 前默认 PUBLIC 可 CREATE(有 search_path 攻击风险);实践上用业务 schema 隔离并回收 public 的 CREATE 权限,删除 public 需同步调整 search_path ✓ 正确答案 D 删除 public 不影响对象解析
# 28. 表的列数与单行最大长度限制(PostgreSQL 1600 列、MySQL 4096 列、SQL Server 1024 列)背后的存储原理是什么? A 列数限制来自磁盘容量 B 单行可以无限大 C 列数上限由页结构与行内列偏移表示决定(PG 1600、InnoDB 4096、SQL Server 1024),行宽受页大小约束但大字段可行外存储(TOAST/溢出页),超宽表应垂直拆分而非堆列 ✓ 正确答案 D TOAST 可以让列数突破上限
# 29. ALTER TABLE ... RENAME TO 与 ALTER TABLE ... RENAME COLUMN 的语法差异? A 三库都用 ALTER TABLE RENAME 语句 B SQL Server 支持 ALTER TABLE RENAME C PostgreSQL 用 ALTER TABLE ... RENAME TO / RENAME COLUMN,MySQL 用 RENAME TABLE(8.0 的 ALTER RENAME COLUMN),SQL Server 用 sp_rename 过程;重命名会联动视图/外键依赖而约束名不自动跟随 ✓ 正确答案 D 重命名不影响物化视图
# 30. PostgreSQL 中查询当前数据库所有表的命令是什么? A \dt 能列出其他数据库的表 B information_schema 查询性能最优 C 可用 psql 的 \dt、information_schema.tables(可移植)或 pg_catalog(relkind 过滤,含大小/owner 等细节)查询当前数据库的表,跨数据库需切换连接 ✓ 正确答案 D pg_class 不含 schema 信息
# 31. UNLOGGED 表与 HEAP 表的差异(PostgreSQL 特有)? A UNLOGGED 表崩溃后数据保留 B 两者都参与流复制 C UNLOGGED 表无 MVCC D UNLOGGED 表不写 WAL(写入更快、WAL 更小)但崩溃后清空、不参与流复制;MVCC 与索引行为与 HEAP 相同,适合可重建的中间数据 ✓ 正确答案
# 32. 如何在 MySQL 中查看表的 DDL?SHOW CREATE TABLE t 的输出包含哪些信息? A SHOW CREATE TABLE t 输出可重放的完整建表语句(列、索引与约束、ENGINE、字符集、分区、注释),information_schema 提供属性字段,mysqldump --no-data 可生成更完整的 DDL ✓ 正确答案 B SHOW CREATE TABLE 只显示列名 C SHOW CREATE TABLE 不含索引 D information_schema 能输出完整 DDL
# 33. 如何在 PostgreSQL 中查询指定 schema 下所有表? A 可用 \dt schema.*、information_schema.tables 按 table_schema 过滤、pg_catalog 按 nspname+relkind 过滤(可带大小/行数/owner),脚本建议 pg_catalog ✓ 正确答案 B information_schema 是最权威的方式 C pg_catalog 无法按 schema 过滤 D \dt 不能指定 schema
# 34. 表名 schema.table 在 PostgreSQL 中的简写规则是什么? A 未限定名在所有 schema 中查找并自动合并 B search_path 不影响未限定名解析 C 全限定名直接解析,未限定名按 search_path 顺序取第一个命中(默认 "$user", public),pg_temp 与 pg_catalog 隐式优先于 search_path ✓ 正确答案 D 未限定建表总是落在 public
# 35. 表的 owner 概念在 PostgreSQL 中的语义是什么? A owner 隐式拥有表全部权限并可执行 DDL 与授权,其他角色需显式 GRANT;ALTER TABLE ... OWNER TO 转移属主后旧 owner 失去自动权限 ✓ 正确答案 B owner 之外的任意角色默认也有全部权限 C 变更 owner 不影响任何权限 D owner 与超级用户是同一概念
# 36. PostgreSQL 物化视图的 REFRESH MATERIALIZED VIEW CONCURRENTLY 需要满足的索引要求是什么? A 并发刷新不需要任何索引 B 并发刷新永远比普通刷新快 C 普通刷新也支持并发读 D CONCURRENTLY 刷新要求物化视图有唯一索引(用于增量定位变化行),刷新期间不阻塞读;普通 REFRESH 全量重建但短暂阻塞查询,按可用性需求选择 ✓ 正确答案
# 37. WITH CHECK OPTION 子句在可更新视图中的作用,防止插入或更新到视图不可见的行。 A 默认情况下视图可以插入不可见的行 B WITH CHECK OPTION 影响 DELETE C WITH CHECK OPTION 强制 INSERT/UPDATE 后的新行必须满足视图定义条件(防止幽灵行),LOCAL 只查本视图、CASCADED 递归查整条视图链(默认 CASCADED) ✓ 正确答案 D CHECK OPTION 与视图可更新性无关
# 38. 可更新视图(Updatable View)的判定规则,哪些视图允许 INSERT/UPDATE/DELETE?PostgreSQL 的 INSTEAD OF 触发器如何扩展? A 任何视图都可以直接写入 B INSTEAD OF 触发器只用于普通表 C 含 JOIN 的视图可直接更新 D 只有单表简单查询(无聚合/去重/分组/窗口/集合运算、列可映射)的视图可直接更新;复杂视图可用 INSTEAD OF 触发器重定向写入逻辑 ✓ 正确答案
# 39. 物化视图(Materialized View)的刷新策略(ON DEMAND、ON COMMIT、FULL、FAST、FORCE)的差异与适用场景? A PostgreSQL 支持 ON COMMIT 物化视图 B 触发时机分 ON DEMAND(显式刷新、滞后可控)与 ON COMMIT(提交自动、实时但写放大);刷新方法分 FULL/FAST(需物化日志)/FORCE;Oracle 全支持、PostgreSQL 仅全量刷新(可 CONCURRENTLY) ✓ 正确答案 C MySQL 原生支持物化视图 D FAST 刷新不需要任何前置条件
# 40. 级联视图(View on View)的查询优化,内层视图是否会被合并(View Merging)?优化器何时选择不合并? A 视图嵌套越多性能一定越差 B 优化器从不合并视图 C 优化器默认把视图内联合并(级联视图等价于展开的手写查询),但含聚合/DISTINCT/LIMIT/窗口/集合运算的视图成为物化边界而不合并,谓词无法下推 ✓ 正确答案 D 聚合视图可以任意下推谓词
# 41. 视图的依赖追踪,被引用表结构变更后视图如何处理?PostgreSQL 的 VIEW 自动失效与重建机制? A 基表列改名后 PostgreSQL 视图自动失效 B 视图与基表无依赖关系 C PostgreSQL 视图依赖解析树(OID/列编号),基表重命名自动跟随,破坏性变更(删列/删表)触发依赖检查或 CASCADE;MySQL 视图存文本定义、结构变更后需 CREATE OR REPLACE 重建 ✓ 正确答案 D DROP COLUMN 不会影响引用它的视图
# 42. 视图(View)的本质是什么?它是存储查询还是存储数据?PostgreSQL 与 MySQL 的 view implementation rule(可更新视图判定)如何? A 视图存储数据的副本 B 视图是存储的查询定义(不存数据),查询时展开执行;可更新性要求单表简单查询(无聚合/去重/分组/集合运算),PG 存查询树、MySQL 存定义文本 ✓ 正确答案 C 视图查询一定物化临时表 D 任何视图都能直接更新
# 43. 为何 OLTP 系统不推荐使用复杂视图?视图嵌套的查询优化难度如何? A 复杂视图每次查询都重新计算且嵌套形成物化边界、谓词无法下推,OLTP 应只用简单封装视图,复杂分析用物化视图/CTE 或分析引擎 ✓ 正确答案 B 复杂视图在 OLTP 中性能与手写完全一致 C 聚合视图可以任意下推谓词 D 视图嵌套不影响优化器
# 44. 视图与 CTE 的语义差异,CTE 是语句级,视图是 schema 级对象。 A CTE 可以跨语句复用 B 视图可以定义递归 C CTE 是语句级(单条 SQL 内复用、不持久、无独立权限),视图是 schema 级持久对象(跨语句复用、有 owner 与权限、可更新);公共逻辑用视图、单语句分层用 CTE ✓ 正确答案 D CTE 有独立的 GRANT 权限
# 45. PostgreSQL 中刷新物化视图的命令是什么? A 两种刷新方式没有区别 B 刷新失败会留下半新数据 C CONCURRENTLY 不需要唯一索引 D REFRESH MATERIALIZED VIEW 全量重建且刷新期间阻塞读(事务性),CONCURRENTLY 不阻塞读但要求视图有唯一索引且刷新较慢,7x24 报表用 CONCURRENTLY ✓ 正确答案
# 46. SQL Server 的 indexed view 与 PostgreSQL 的 materialized view 区别? A 两者都需手动刷新 B 索引视图不需要聚集索引 C PostgreSQL 物化视图自动实时更新 D SQL Server 索引视图(SCHEMABINDING+唯一聚集索引)由基表 DML 自动增量维护且优化器选择性匹配使用;PostgreSQL 物化视图手动 REFRESH(快照、延迟可容忍),创建无严格约束 ✓ 正确答案
# 47. WITH LOCAL CHECK OPTION 与 WITH CASCADED CHECK OPTION 的差异? A LOCAL 只检查本视图(下层需自己声明 CHECK OPTION),CASCADED 递归检查本视图及所有底层视图条件,默认 CASCADED ✓ 正确答案 B LOCAL 检查整条视图链 C 默认 LOCAL D 两者无差异
# 48. 如何删除一个视图?DROP VIEW 还是 DROP MATERIALIZED VIEW? A DROP VIEW 可以删除物化视图 B 删除视图会删除基表数据 C 普通视图用 DROP VIEW、物化视图用 DROP MATERIALIZED VIEW(不能混用),默认 RESTRICT 有依赖报错、CASCADE 级联删除依赖对象,IF EXISTS 保证幂等 ✓ 正确答案 D 物化视图删除前必须先刷新
# 49. 物化视图的 REFRESH FAST 选项需要哪些前置条件? A FAST 刷新不需要任何前置条件 B FAST 增量刷新需要基表物化视图日志(记录变化行)与主键/rowid,且仅支持可增量维护的视图形态(简单/可增量聚合);条件不足时 FORCE 自动降级为 FULL ✓ 正确答案 C 任意 SQL 都支持 FAST 刷新 D 物化视图日志只用于 FULL 刷新
# 50. 视图与函数(FUNCTION)在数据封装上的取舍? A 函数封装可以被优化器改写下推 B 视图是声明式关系封装(可被优化器展开与谓词下推、可作 JOIN 源),函数是程序式封装(参数化、可含过程逻辑但优化器黑盒);能视图化优先视图,参数化/过程需求用函数 ✓ 正确答案 C 视图可以带参数 D 函数结果可继续参与关系优化
# 51. PL/pgSQL(PostgreSQL)与 T-SQL(SQL Server)的语法差异,变量声明、循环、异常处理、游标使用的对比。 A 两种语言语法完全一致 B 变量(:= 与 @)、循环(LOOP 系列与 WHILE)、异常(EXCEPTION WHEN 块捕获与 TRY/CATCH)、游标(FETCH 与 @@FETCH_STATUS)语法差异大,过程语言需重写迁移,且都应优先集合查询而非游标 ✓ 正确答案 C T-SQL 支持 FOR 数值循环 D PL/pgSQL 用 TRY/CATCH 处理异常
# 52. 函数体内调用函数的开销与优化,函数内联(Function Inlining)在 PostgreSQL 中的实现条件? A PL/pgSQL 函数默认内联 B 内联与函数体复杂度无关 C VOLATILE 函数也内联 D PostgreSQL 内联条件是 LANGUAGE SQL + IMMUTABLE/STABLE + 简单无副作用函数体;内联后消除调用开销并允许表达式参与索引优化,VOLATILE 与含 DML 的函数不内联 ✓ 正确答案
# 53. 函数的安全定义者(SECURITY DEFINER)与调用者(INVOKER)权限模式的差异与权限滥用风险。 A SECURITY DEFINER 以调用者权限执行 B 两种模式执行权限相同 C SECURITY DEFINER 以定义者身份权限执行(受控提权入口),风险是提权漏洞与 search_path 劫持,需固定函数内 search_path、定义者用低权专用角色并最小授权 ✓ 正确答案 D SECURITY DEFINER 不涉及权限提升
# 54. 存储过程的参数模式(IN、OUT、INOUT、DEFAULT)与返回值的语义差异? A IN 参数可以在过程内修改并返回 B IN 只读传入、OUT 传出、INOUT 双向传入传出、DEFAULT 提供默认值可省略;RETURN 返回单值/状态,OUT 参数提供多值返回通道,两者可并用 ✓ 正确答案 C OUT 参数调用时必须传值 D 存储过程都有返回值
# 55. 存储过程的执行计划缓存(Plan Caching)与参数嗅探(Parameter Sniffing)问题如何影响性能? A 缓存计划对所有参数值都最优 B 参数嗅探只影响编译时间不影响执行 C 计划缓存按首次参数值优化并复用,参数分布变化时复用的计划可能次优(参数嗅探问题);对策有 OPTION (RECOMPILE)/OPTIMIZE FOR(SQL Server)与 PG 的 plan_cache_mode/动态 SQL ✓ 正确答案 D PostgreSQL 没有计划缓存机制
# 56. 存储过程(Stored Procedure)与函数(Function)的本质差异,过程无返回值可执行 DDL,函数必须有返回值不可执行 DDL。 A 函数必须返回一个值且保持表达式语义(不可执行 DDL/事务控制、可在 SELECT 中调用),过程无返回值要求、可执行 DDL 与事务控制,用 CALL/EXEC 调用 ✓ 正确答案 B 函数可以执行 DDL C 过程可以当表达式用 D 两者语义完全相同
# 57. 标量函数、内联表值函数(ITVF)、多语句表值函数(MSTVF)的执行计划差异与性能影响? A MSTVF 可以内联下推谓词 B 标量函数性能最优 C 内联表值函数(单 SELECT)可被优化器展开、谓词下推与索引利用;标量函数逐行调用开销大(2019+ 可内联);多语句表值函数强制物化且基数估算固定,计划质量最差 ✓ 正确答案 D 三类函数执行计划相同
# 58. 确定性函数(Deterministic Function)与不确定函数(Non-deterministic Function)在查询优化器中的处理差异,例如 GETDATE()、RAND()。 A 不确定函数可以用于表达式索引 B GETDATE() 是确定性函数 C 确定性(IMMUTABLE/STABLE)允许常量折叠、表达式索引、物化视图与计划缓存;RAND()/GETDATE() 等非确定性函数不能用于索引与索引视图,自定义函数稳定性标注错误会导致索引/物化数据错误 ✓ 正确答案 D 优化器对不确定函数也做常量折叠
# 59. 自定义聚合函数(User-Defined Aggregate)的实现步骤(sfunc、finalfunc、initcond、combinefunc)在 PostgreSQL 中的 CREATE AGGREGATE 语法。 A 聚合函数只需要 finalfunc B CREATE AGGREGATE 由 sfunc(状态转移)、initcond(初始状态)、finalfunc(收尾输出)组成,combinefunc 支持并行聚合时合并部分状态,还需正确处理 NULL 与空集边界 ✓ 正确答案 C sfunc 只在最后执行一次 D combinefunc 与并行无关
# 60. 触发器函数(Trigger Function)的 NEW、OLD、TG_OP、TG_TABLE_NAME 等特殊变量的使用场景? A OLD 在 INSERT 触发器中可用 B NEW 表示新行(BEFORE 触发器可修改)、OLD 表示旧行(UPDATE/DELETE 只读)、TG_OP 区分操作分支、TG_TABLE_NAME 标识触发表,是清洗、审计与多表通用触发器的基础 ✓ 正确答案 C BEFORE 触发器不能修改 NEW D TG_OP 在 TRUNCATE 中返回 'DELETE'
# 61. SQL 函数(LANGUAGE SQL)与 PL/pgSQL 函数(LANGUAGE plpgsql)的性能差异与选择依据? A LANGUAGE SQL 简单函数可被优化器内联(调用开销小、可下推索引),PL/pgSQL 解释执行适合复杂过程逻辑;高频调用场景优先可内联的 SQL 函数 ✓ 正确答案 B PL/pgSQL 函数可以内联 C 两种语言函数性能相同 D SQL 函数不能返回表
# 62. 如何在 PostgreSQL 中调试 PL/pgSQL 过程?请说明 RAISE NOTICE/EXCEPTION 的用法与断点调试工具。 A RAISE EXCEPTION 不会中止事务 B RAISE NOTICE/LOG/DEBUG 输出日志(% 占位)、RAISE EXCEPTION 抛错并可带 ERRCODE/HINT(中止事务),复杂函数可用 pldebugger 断点单步调试 ✓ 正确答案 C RAISE 只能输出到客户端 D pldebugger 只能调试 C 函数
# 63. 存储过程是否支持事务控制语句(COMMIT/ROLLBACK)?PostgreSQL 函数中 BEGIN ... EXCEPTION 的事务边界如何? A 函数运行在外层事务内不可显式 COMMIT/ROLLBACK,过程(PROCEDURE)可控制事务;PG 函数内 BEGIN...EXCEPTION 是子事务(异常只回滚块内变更,类似保存点) ✓ 正确答案 B PostgreSQL 函数内可以 COMMIT C 函数内 BEGIN...EXCEPTION 会回滚整个事务 D MySQL 函数允许显式事务语句
# 64. CREATE FUNCTION 的基本语法(参数、返回类型、函数体语言)示例? A 函数体只能用 plpgsql 语言 B 函数不能返回表 C CREATE FUNCTION 由参数、RETURNS 返回类型、函数体与 LANGUAGE 组成(可选稳定性标记与 SECURITY 模式),SQL 语言简单可内联、plpgsql 支持过程逻辑,重载按参数签名区分 ✓ 正确答案 D OR REPLACE 可替换不同签名的函数
# 65. PostgreSQL 中函数能否返回多行结果集?请给出 RETURNS TABLE 与 SETOF 两种语法。 A 函数只能返回标量 B 返回集合的函数不能与表 JOIN C RETURNS TABLE 与 SETOF 不可互换 D 集合返回函数可用 RETURNS TABLE(RETURN QUERY/NEXT 填充)或 RETURNS SETOF(表类型/标量类型),可在 FROM 中作派生表使用,SQL 语言函数体即查询 ✓ 正确答案
# 66. 什么是窗口函数(Window Function)?它与聚合函数的区别? A 窗口函数会归约行数 B 窗口函数只能用于 GROUP BY 后 C ROW_NUMBER 是聚合函数 D 窗口函数用 OVER 定义窗口、每行输出一行(保留行),聚合函数按 GROUP BY 每组输出一行(归约行);聚合函数可作为窗口函数使用,WHERE 中不能用窗口函数 ✓ 正确答案
# 67. 函数体内能否使用动态 SQL(EXECUTE)? A 动态 SQL 没有注入风险 B 函数内可用动态 SQL(PG 的 EXECUTE...USING、SQL Server 的 sp_executesql、Oracle 的 EXECUTE IMMEDIATE),必须参数化防注入,且动态 SQL 往往无法复用执行计划、应优先静态 SQL ✓ 正确答案 C 动态表名可以参数化绑定 D PostgreSQL 动态 SQL 与静态 SQL 计划缓存相同
# 68. 函数对查询优化的影响(IMMUTABLE 内联、VOLATILE 阻止缓存)? A VOLATILE 函数可以建表达式索引 B IMMUTABLE 允许常量折叠、表达式索引、SQL 函数内联与物化视图;VOLATILE 阻止这些优化并禁止用于索引,把 volatile 误标为 immutable 会导致索引/物化数据错误 ✓ 正确答案 C STABLE 函数不能用于索引 D 稳定性标记不影响优化器行为
# 69. 函数式编程风格的 SQL(如函数管道)可行吗? A SQL 完全没有函数式特征 B SQL 天然具备 filter/map/reduce 对应(WHERE/SELECT/GROUP BY)与 CTE/窗口/JSON 函数管道等函数式表达,但无一等函数与惰性求值、DML 有副作用,是声明式语言而非完整函数式范式 ✓ 正确答案 C SQL 支持把函数作为参数传递 D 函数管道一定会导致性能问题
# 70. 函数能否修改表数据(INSERT/UPDATE/DELETE)? A PostgreSQL/MySQL/Oracle 函数内可执行 DML(同外层事务、不能事务控制),SQL Server 的 UDF 禁止 DML(用存储过程);在 SELECT 中调用有副作用的函数是反模式 ✓ 正确答案 B SQL Server 的 UDF 可以执行 DML C 所有数据库函数都禁止 DML D 函数内 DML 独立于外层事务
# 71. 存储过程(PROCEDURE)与函数(FUNCTION)在调用语法上的差异?CALL vs SELECT? A 过程可以在表达式中调用 B 函数在表达式/表位置调用(SELECT f()、FROM 表函数),过程用 CALL(PG 11+/MySQL)或 EXEC(SQL Server)执行,CALL 是独立语句不返回行集、数据经 OUT 参数传递 ✓ 正确答案 C CALL 可以嵌套在 SELECT 中 D 函数的返回值不能参与表达式
# 72. 递归函数(RECURSIVE)的实现原理是什么? A 递归 CTE 依赖调用栈展开 B 递归查询无法表达树遍历 C 递归 CTE 没有终止条件 D 递归 = 基线 + 递推;递归 CTE 用锚点查询 + 递归项 + 工作队列迭代至不动点执行,UNION 去重可防环、UNION ALL 需深度上限,深递归与环形数据是主要陷阱 ✓ 正确答案
# 73. 强实体(Strong Entity)与弱实体(Weak Entity)的区别,弱实体的标识符依赖父实体的部分键如何建模? A 弱实体有独立的主键 B 弱实体存在依赖父实体,标识由"父实体主键+部分键"构成(复合主键建模,如订单明细 order_id+line_no),父删除时通常级联删除 ✓ 正确答案 C 弱实体可以独立存在 D 部分键在全局范围内唯一
# 74. ISA 继承关系(Is-A Hierarchy)的三种实现策略(单表、类表、具体表)各自的取舍是什么? A 单表继承的约束最强 B 类表继承无 NULL 冗余问题 C 单表(类型列、查询简单但列冗余)、类表(父表+子表 JOIN、约束清晰但查询多 JOIN)、具体表(每类独立表、单表快但父类聚合需 UNION ALL)按共享查询频率与子类差异度取舍 ✓ 正确答案 D 具体表继承适合父类统一查询
# 75. 多值属性(Multivalued Attribute)的规范化处理,为何必须拆为独立实体? A 多值属性可以直接存字符串列且支持高效查询 B 多值属性违反 1NF:字符串/数组存储无法按值查询、约束与更新;规范做法是拆为独立子表(每值一行),仅整体存取场景才考虑 JSON/数组列 ✓ 正确答案 C 数组列支持唯一约束 D 拆分多值属性会破坏数据模型
# 76. Chen 记法中菱形代表什么?椭圆代表什么?矩形代表什么? A 菱形代表实体 B 矩形代表实体、椭圆代表属性、菱形代表联系;主键加下划线、多值属性双椭圆、弱实体双矩形、派生属性虚线椭圆 ✓ 正确答案 C 椭圆代表联系 D 矩形代表属性
# 77. ER 图中 1:N、N:M、1:1 三种关系如何用图形符号区分? A M:N 关系只需在任一表加外键 B Chen 记法用连线数字(1/N/M 或 min-max)、Crow's Foot 用竖线/鸡爪/O 组合区分 1:1、1:N、M:N;实现上 1:1 加外键唯一、1:N 在 N 侧加外键、M:N 必须建连接表 ✓ 正确答案 C 1:1 关系也需要连接表 D Crow's Foot 用数字标注基数
# 78. COMMENT ON TABLE 的用途是什么? A 注释会参与约束校验 B 注释只存在于应用文档 C COMMENT ON TABLE/COLUMN 把业务文档写入元数据(数据字典、随 DDL 迁移、工具可读),PG/Oracle/MySQL 原生支持,查询可用 obj_description 或 information_schema ✓ 正确答案 D 列注释无法添加
# 79. DROP TABLE 与 TRUNCATE TABLE 的差异是什么? A DROP 删除表对象(结构+数据),TRUNCATE 只清空数据保留结构(快、日志少、不触发行级 DELETE 触发器);PG 中两者可回滚,MySQL 中 DROP 隐式提交 ✓ 正确答案 B TRUNCATE 会删除表结构 C TRUNCATE 可以带 WHERE 条件 D TRUNCATE 触发行级 DELETE 触发器
# 80. 为什么在生产环境不推荐 DROP TABLE 而推荐 ALTER TABLE RENAME? A DROP TABLE 可以随时回滚 B CASCADE 可以安全地级联删除所有依赖 C RENAME 会立即删除数据 D DROP 不可逆且依赖连锁、无灰度缓冲,生产推荐先 ALTER TABLE RENAME 归档(可快速回滚、观察依赖),确认后再真正 DROP,并提前备份与低峰执行 ✓ 正确答案
# 81. 表的存储参数(storage parameters)举例有哪些? A fillfactor 只影响存量页 B 存储参数与性能无关 C 常用存储参数有 fillfactor(页填充率)、toast_tuple_target(TOAST 阈值)、autovacuum 族(清理触发与成本)与 parallel_workers,用 ALTER TABLE ... SET 配置、reloptions 查看,按实测瓶颈调优 ✓ 正确答案 D autovacuum 参数不能表级设置
# 82. CREATE OR REPLACE VIEW 的用途是什么? A OR REPLACE 会清空视图授权 B CREATE OR REPLACE VIEW 原子替换视图定义,保留原权限与依赖对象(引用它的视图不中断),但列结构只能兼容扩展、删列改类型需 DROP+CREATE ✓ 正确答案 C OR REPLACE 不能修改过滤条件 D 物化视图支持 OR REPLACE
# 83. DROP FUNCTION 的语法与权限要求? A PostgreSQL 的 DROP FUNCTION 必须带参数签名(重载区分),需 owner 或超级用户权限,被引用时默认 RESTRICT 报错、CASCADE 级联删除,IF EXISTS 保证幂等 ✓ 正确答案 B PostgreSQL 中删除函数无需签名 C 函数不能被其他对象引用 D 删除函数不需要任何权限
# 84. PL/pgSQL 中的 %TYPE 与 %ROWTYPE 占位符的作用? A %ROWTYPE 引用单列类型 B MySQL 原生支持 %ROWTYPE C %TYPE 不跟随列类型变更 D %TYPE 引用列的类型(参数与变量自动跟随表结构变更)、%ROWTYPE 声明整行结构(SELECT INTO 整行、按字段访问),类型单一来源提升可维护性,但不带 NOT NULL 约束 ✓ 正确答案
# 85. 什么是聚合关系(Aggregation)?它与组合关系(Composition)有何区别? A 聚合与组合没有区别 B 组合关系中外键可空 C 聚合中部分不能独立存在 D 组合是强拥有(部分生命周期绑定整体、整体销毁部分随之消失),聚合是弱拥有(部分可独立存在);建模上组合用 CASCADE+非空外键,聚合用可空外键或解除引用 ✓ 正确答案
# 86. 实体(Entity)与属性(Attribute)的根本区别是什么?请举一个反例说明。 A 属性可以有独立身份 B 实体与属性的区别无关紧要 C 部门应建模为文本属性 D 实体有独立标识、可被查询与引用、独立存在,属性是依附实体的描述;按"是否有独立查询/引用/生命周期需求"判定,如部门应建模为实体而员工表用 dept_id 外键引用 ✓ 正确答案
# 87. CREATE TABLE 的最简语法示例是什么?请声明 id、name、created_at 三列。 A 时间列不需要默认值 B 三列中只有 id 需要类型 C 主键必须手工建索引 D 最简语法为 CREATE TABLE t (列名 类型 [约束] [默认值]);id 用自增/IDENTITY 主键、name 必填 NOT NULL、created_at 用 DEFAULT now()/CURRENT_TIMESTAMP 自动填充 ✓ 正确答案
# 88. CREATE VIEW 的基本语法示例是什么? A 视图会复制数据存储 B 视图创建后不能删除 C 视图必须与基表同名 D CREATE [OR REPLACE] VIEW v [(列别名)] AS SELECT ... [WITH CHECK OPTION];视图封装查询定义(不存数据)、可做权限隔离,OR REPLACE 保留权限与依赖 ✓ 正确答案
# 89. 视图能否使用 ORDER BY 子句? A 视图内 ORDER BY 保证外层查询的顺序 B 视图内禁止写 ORDER BY C MySQL 8.0 完全保留视图内排序 D 视图是逻辑上无序的关系,内层 ORDER BY 不保证外层顺序(仅配合 LIMIT 或窗口函数有意义);SQL Server 要求视图内 ORDER BY 必须有 TOP/OFFSET,需要稳定顺序应在外层写 ORDER BY ✓ 正确答案
# 90. 什么是 IMMUTABLE、STABLE、VOLATILE 函数属性? A IMMUTABLE 允许常量折叠、表达式索引与内联,STABLE 语句内稳定(可用于索引),VOLATILE 每次调用求值且不能用于索引;按真实行为标注,把 volatile 误标为 immutable 会导致索引/物化数据错误 ✓ 正确答案 B 三种属性对优化器无影响 C VOLATILE 是函数最优属性 D now() 应标为 IMMUTABLE
# 91. 什么是函数重载(Function Overloading)? A MySQL 支持函数重载 B 重载与重写是同一概念 C 重载是同名不同参数类型/数量的函数并存(PostgreSQL/Oracle 支持,MySQL/SQL Server 不支持),调用按精确匹配优先、隐式转换代价选择,歧义时报错 ✓ 正确答案 D 删除重载函数无需指定签名