# 1. IN、NOT IN、= ANY、<> ALL、SOME 与子查询的等价关系? A NOT IN 等价于 = ANY B ANY 与 ALL 等价 C IN 等价于 <> ALL D IN 等价于 = ANY,NOT IN 等价于 <> ALL,SOME 等价于 ANY ✓ 正确答案
# 2. NOT IN 遇到 NULL 时的陷阱与等价改写? A NOT IN 遇 NULL 无影响 B IN 比 NOT IN 更易空 C 子查询含 NULL 时 NOT IN 因三值逻辑可能返回空结果,应改用 NOT EXISTS 或显式排除 NULL ✓ 正确答案 D NOT EXISTS 也含同样陷阱
# 3. 子查询与连接(JOIN)的等价转换规则?哪些子查询必须改写为 JOIN? A 子查询不能改写为 JOIN B IN/EXISTS 子查询可改写为 JOIN,但需注意子查询重复行会导致结果放大,必要时应去重 ✓ 正确答案 C 改写一定改变结果 D JOIN 不能替代子查询
# 4. 子查询优化(Subquery Unnesting、Pull-up、Decorrelation)的实现细节? A Subquery Unnesting 把子查询转成连接,Decorrelation 消除相关依赖,Pull-up 上拉谓词,均保证语义等价 ✓ 正确答案 B 子查询从不优化 C 去相关会增加依赖 D 展开会改变结果
# 5. 子查询(Subquery)的分类,标量、行、列、表子查询的执行语义? A 标量子查询返回多行多列 B 标量返回单值、行返回单行多列、列返回单列多行、表子查询用于 FROM 充当派生表 ✓ 正确答案 C 只有列子查询存在 D 表子查询不能用于 FROM
# 6. 横向子查询(LATERAL)的语义,相关子查询的 FROM 子句版本? A LATERAL 不能引用外层列 B LATERAL 只能返回单行 C LATERAL 子查询可引用左侧表列、对每行执行,是 FROM 中的相关子查询 ✓ 正确答案 D LATERAL 与普通子查询等价
# 7. 派生表(Derived Table)与内联视图(Inline View)的等价? A 派生表与内联视图是同一概念,都是 FROM 中的子查询,需有别名 ✓ 正确答案 B 两者不同概念 C 派生表不能有别名 D 内联视图只用于 WHERE
# 8. 相关子查询(Correlated Subquery)与非相关子查询(Non-Correlated Subquery)的执行方式差异? A 非相关子查询逐行执行 B 非相关子查询执行一次,相关子查询对外层每行执行,性能差,优化器可去相关为连接 ✓ 正确答案 C 两者执行次数相同 D 相关子查询更快
# 9. INTERSECT 与 INNER JOIN 的等价性? A 两者完全等价 B INNER JOIN 去重 C INTERSECT 保留重复 D INTERSECT 去重求交集,INNER JOIN 保留匹配行,有重复行时结果不同 ✓ 正确答案
# 10. OFFSET 子查询(分页)的优化技巧? A OFFSET 深度分页很快 B 深度 OFFSET 需扫描丢弃行,keyset 分页(WHERE 游标 + LIMIT)用索引避免扫描更高效 ✓ 正确答案 C 无法优化 D OFFSET 不需要 ORDER BY
# 12. PostgreSQL 中数组子查询 ANY(array[]) 的用法? A x = ANY(array) 表示 x 等于数组任一元素 ✓ 正确答案 B x = ANY(array) 表示 x 不等于任何元素 C 它只能用于删除 D 它不能与数组配合
# 13. SELECT (SELECT max(salary) FROM emp) 的标量子查询语义? A 它是标量子查询返回单值,非相关时优化为 InitPlan 执行一次 ✓ 正确答案 B 它返回多行 C 它返回错误 D 它不能用于 SELECT
# 14. 子查询与 CTE 在可读性上的取舍? A 子查询更可读 B CTE 先定义后引用、逻辑分层清晰,复杂或递归查询更可读;简单场景子查询更紧凑 ✓ 正确答案 C CTE 不能复用 D 子查询支持递归
# 16. CASE WHEN 的两种语法,搜索式(CASE WHEN ... THEN ...)与简单式(CASE col WHEN val THEN ...)的语义差异? A 简单式支持任意条件 B 两者等价 C 搜索式支持任意布尔条件,简单式只做等值比较(expr = value),两者都短路求值 ✓ 正确答案 D 搜索式只能等值
# 17. COALESCE 与 CASE WHEN x IS NOT NULL THEN x ELSE ... END 的等价关系? A COALESCE 返回第一个非 NULL 参数,等价于 CASE WHEN x IS NOT NULL 的嵌套,且短路求值 ✓ 正确答案 B 两者不等价 C COALESCE 返回最后一个非 NULL D COALESCE 不短路
# 18. GREATEST 与 LEAST 在 PostgreSQL 中的多值选取语义? A 它们忽略 NULL ✓ 正确答案 B 它们返回 NULL 当任一参数为 NULL(PostgreSQL) C 它们与聚合 MAX 等价 D 它们只接受两个参数
# 19. IS DISTINCT FROM 与 <> 在 NULL 上的语义差异? A 两者等价 B 两者都不处理 NULL C IS DISTINCT FROM 遇 NULL 返回 NULL D <> 遇 NULL 返回 UNKNOWN,IS DISTINCT FROM 对 NULL 也返回 TRUE 或 FALSE,是空安全比较 ✓ 正确答案
# 20. NULLIF 的语义与陷阱,NULLIF(a, b) 在 a=b 时返回 NULL 的副作用? A NULLIF(a,b) 在 a=b 时返回 a B NULLIF(a,b) 总是返回 NULL C NULLIF 忽略 NULL D NULLIF(a,b) 在 a=b 时返回 NULL,否则返回 a,常用于防除零 ✓ 正确答案
# 22. CASE WHEN col>0 THEN 'positive' WHEN col<0 THEN 'negative' ELSE 'zero' END 的语义? A col=0 时返回 NULL B col>0 返回 positive,col<0 返回 negative,否则(含 0 和 NULL)返回 zero ✓ 正确答案 C col 为 NULL 时返回 NULL D 它总是返回 positive
# 23. CASE WHEN 在 GROUP BY 中的使用? A GROUP BY 不能用 CASE B 只能用于 WHERE C CASE 可作为 GROUP BY 表达式按条件分组,需与 SELECT 中表达式一致 ✓ 正确答案 D CASE 不能参与聚合
# 24. COALESCE(NULL, NULL, 'default') 的返回值? A 返回 'default',因为它是第一个非 NULL 参数 ✓ 正确答案 B 返回 NULL C 返回空字符串 D 报错
# 25. GREATEST 与 LEAST 在 NULL 上的处理? A 两者从不返回 NULL B PostgreSQL 中 GREATEST/LEAST 忽略 NULL,仅全部参数为 NULL 时才返回 NULL(MySQL 遇任一 NULL 返回 NULL) ✓ 正确答案 C PostgreSQL 中任一参数 NULL 则返回 NULL(NULL 传播) D 只在 LEAST 传播
# 26. IF 函数(MySQL)的语法差异? A IF(expr, v1, v2) 是函数,expr 为真返回 v1 否则 v2,等价于 CASE WHEN,是 MySQL 特有 ✓ 正确答案 B IF 是流程控制语句 C IF 与 IFNULL 等价 D PostgreSQL 也有 IF 函数
# 27. IIF 函数(SQL Server)的语法差异? A IIF 与 CASE 不等价 B IIF 只能处理 NULL C IIF(cond, t, f) 等价于 CASE WHEN cond THEN t ELSE f,是 SQL Server 的便捷简写 ✓ 正确答案 D PostgreSQL 也有 IIF
# 28. NULLIF 在 INSERT ON CONFLICT 中的应用? A NULLIF 可把特定值转 NULL 后插入,配合 ON CONFLICT 处理约束或冲突更新 ✓ 正确答案 B NULLIF 不能用于 INSERT C NULLIF 只用于 SELECT D NULLIF 与 ON CONFLICT 无关
# 29. PostgreSQL 中 ARRAY_REMOVE、ARRAY_REPLACE 的用法? A ARRAY_REMOVE 修改原数组 B ARRAY_REMOVE 删除指定元素、ARRAY_REPLACE 替换指定元素,均返回新数组 ✓ 正确答案 C 两者等价 D 只能用于字符串
# 31. PostgreSQL 中数组的 COALESCE 用法? A COALESCE 不能用于数组 B 空数组就是 NULL C 它总是返回 NULL D COALESCE(arr, '{}') 在 arr 为 NULL 时返回空数组,NULL 数组与空数组不同 ✓ 正确答案
# 32. LIKE、ILIKE、SIMILAR TO、正则表达式(POSIX、Perl、PCRE)在 PostgreSQL 中的支持差异? A ~ 支持完整 PCRE B LIKE 用通配符、ILIKE 忽略大小写、SIMILAR TO 混合通配符与正则、~ 是 POSIX 正则(非完整 PCRE) ✓ 正确答案 C SIMILAR TO 与 LIKE 完全相同 D 正则不支持忽略大小写
# 33. UNNEST 与数组展开(多列 unnest)在行转列/长表转宽表中的应用 A UNNEST 把数组展开为多行,多列 UNNEST 可同时展开多个数组,用于宽表转长表 ✓ 正确答案 B UNNEST 把行转成数组 C UNNEST 只能压缩 D UNNEST 不能用于 FROM
# 34. LPAD、RPAD 填充函数的边界处理? A LPAD/RPAD 填充到指定长度,超过长度则截断,fill 默认空格 ✓ 正确答案 B LPAD 填充右侧 C 填充永不截断 D 只能填充数字
# 35. REPEAT、REVERSE、TRANSLATE 字符操作函数的语义? A TRANSLATE 做子串替换 B 三者等价 C REPEAT 反转 D REPEAT 重复、REVERSE 反转、TRANSLATE 做字符级映射替换 ✓ 正确答案
# 36. 字符串函数 SUBSTRING、CHAR_LENGTH、POSITION、OVERLAY 在三大数据库中的差异? A 所有数据库函数完全一致 B CHAR_LENGTH 返回字节 C SUBSTRING/POSITION/OVERLAY 有方言差异,CHAR_LENGTH 返回字符数(MySQL 中 LENGTH 返回字节) ✓ 正确答案 D OVERLAY 所有数据库都支持
# 37. 字符串大小写转换 LOWER、UPPER、INITCAP 的差异? A LOWER 全小写、UPPER 全大写、INITCAP 单词首字母大写(PostgreSQL/Oracle 特有) ✓ 正确答案 B INITCAP 全大写 C LOWER 全大写 D UPPER 全小写
# 38. 字符串拼接 NULL 的处理,CONCAT 忽略 NULL、|| 返回 NULL? A || 忽略 NULL B 两者都传播 NULL C MySQL 的 CONCAT 遇任一 NULL 返回 NULL(NULL 传播),PostgreSQL 的 || 同样传播 NULL,而 PG 的 concat() 把 NULL 当空串 ✓ 正确答案 D 两者都忽略 NULL
# 39. 字符串拼接的方言差异,PostgreSQL/Oracle 用 ||,MySQL 用 CONCAT,SQL Server 用 +? A PostgreSQL/Oracle 用 ||,MySQL 用 CONCAT,SQL Server 用 +,NULL 处理也不同 ✓ 正确答案 B 所有数据库用 || C SQL Server 用 || D MySQL 用 +
# 40. 正则表达式函数(REGEXP_REPLACE、REGEXP_MATCHES、REGEXP_LIKE)的语法与性能? A 正则匹配总能走索引 B 正则只能用于数字 C 正则函数性能无忧 D REGEXP_REPLACE/MATCHES/LIKE 做正则处理,通常不能走索引需全表扫描,性能成本高 ✓ 正确答案
# 41. 模糊匹配索引(pg_trgm)的使用与索引选择? A pg_trgm 用 trigram 支持模糊匹配,配 GIN/GiST 索引加速 LIKE '%x%' 与相似度查询 ✓ 正确答案 B pg_trgm 只能做精确匹配 C pg_trgm 不能建索引 D pg_trgm 只用于数字
# 42. LIKE '%abc%' 的索引使用情况? A 前导通配符使普通 B-Tree 索引失效,需 pg_trgm 或全文检索加速 ✓ 正确答案 B 可走普通 B-Tree 索引 C 与 LIKE 'abc%' 相同 D 总能走索引
# 43. MySQL 中 REGEXP 的方言差异? A MySQL 与 PostgreSQL 正则完全一致 B MySQL 无正则 C MySQL REGEXP 是操作符,MySQL 8 提供 REGEXP_LIKE 等函数,使用 ICU 引擎,与 PostgreSQL 语法有差异 ✓ 正确答案 D MySQL 正则返回数组
# 44. PostgreSQL 中 quote_literal/quote_ident 的用途? A quote_ident 引用字符串 B 两者相同 C quote_literal 安全引用字符串字面量、quote_ident 安全引用标识符,用于动态 SQL 防注入 ✓ 正确答案 D 只用于排序
# 45. PostgreSQL 中 ~、~*、!~、!~* 的正则操作符语义? A ~ 匹配、~* 忽略大小写匹配、!~ 不匹配、!~* 忽略大小写不匹配 ✓ 正确答案 B ~* 是大小写敏感匹配 C !~ 是灵活匹配 D 只有 ~ 存在
# 46. EXISTS 与 IN 的等价条件与性能差异? A 无 NULL 时等价,EXISTS 是半连接找到即停通常更快,含 NULL 时 EXISTS 更安全 ✓ 正确答案 B EXISTS 与 IN 总是等价 C IN 总是更快 D EXISTS 遇 NULL 出错
# 47. 集合操作(UNION、INTERSECT、EXCEPT)的列数与类型兼容性规则? A 两侧列数可不同 B 类型必须完全一致 C 集合操作要求列数相同、类型兼容,UNION 去重而 UNION ALL 不去重 ✓ 正确答案 D 结果列名取第二个查询
# 48. APPLY(CROSS APPLY、OUTER APPLY)在 SQL Server 中的 LATERAL 等价? A CROSS APPLY 等价于 LEFT JOIN LATERAL B CROSS APPLY 等同 INNER JOIN LATERAL,OUTER APPLY 等同 LEFT JOIN LATERAL ✓ 正确答案 C APPLY 与 LATERAL 无关 D OUTER APPLY 是 INNER JOIN
# 49. EXCEPT 与 NOT EXISTS 的等价关系? A 语义等价(差集),但 EXCEPT 自动去重、NOT EXISTS 保留重复行,需列对应 ✓ 正确答案 B 两者完全等价且行为相同 C EXCEPT 保留重复 D NOT EXISTS 去重
# 50. CASE WHEN 与 DECODE(Oracle)的对比? A DECODE 支持任意条件 B CASE WHEN 是标准、支持任意条件、可移植;DECODE 是 Oracle 特有、只能等值匹配 ✓ 正确答案 C 两者等价 D CASE 是 Oracle 特有
# 51. CASE 在 ORDER BY 中实现自定义排序? A 只能按字典序 B 它只做升序 C CASE 不能用于 ORDER BY D ORDER BY CASE 为不同值赋排序键,实现自定义优先级排序 ✓ 正确答案
# 53. 简单 CASE 与搜索 CASE 的性能差异? A 简单 CASE 总是更快 B 搜索 CASE 总是更快 C 两者性能通常无显著差异,都短路求值,差异取决于条件本身 ✓ 正确答案 D 简单 CASE 不短路
# 54. TRIM、LTRIM、RTRIM、BTRIM 的方言差异? A TRIM/LTRIM/RTRIM 标准,BTRIM 是 PostgreSQL 特有(去除两端空白) ✓ 正确答案 B BTRIM 是标准函数 C 所有数据库都有 BTRIM D LTRIM 去除两端
# 55. SOUNDEX、LEVENSHTEIN、FUZZY MATCH 的应用场景? A SOUNDEX 计算编辑距离 B SOUNDEX 发音匹配、LEVENSHTEIN 编辑距离、pg_trgm 相似度,用于数据清洗与近似匹配 ✓ 正确答案 C LEVENSHTEIN 发音匹配 D 三者等价
# 56. CHAR_LENGTH 与 LENGTH 的差异(多字节字符)? A 两者总是相同 B 两者都返回字符数 C 两者都返回字节数 D MySQL 中 CHAR_LENGTH 返回字符数、LENGTH 返回字节数,多字节字符下不同 ✓ 正确答案
# 57. CONCAT_WS(带分隔符的拼接)的用法? A CONCAT_WS(sep, a, b, ...) 用分隔符拼接并忽略 NULL 参数 ✓ 正确答案 B 分隔符放最后 C 它不忽略 NULL D 它等同 CONCAT
# 58. LIKE '_abc' 与 LIKE '%abc' 的差异? A 两者等价 B _ 匹配任意长度 C % 匹配单个字符 D _ 匹配单个字符,% 匹配任意长度(含 0),两者匹配范围不同 ✓ 正确答案
# 59. REGEXP_REPLACE 的 replace 参数含义? A replace 是匹配模式 B replace 是替换文本,支持反向引用(\1 捕获组),可指定全局替换 ✓ 正确答案 C replace 是列名 D replace 只能为空
# 60. SIMILAR TO 与 LIKE 的差异? A 两者等价 B LIKE 支持正则 C SIMILAR TO 只支持通配符 D SIMILAR TO 融合 LIKE 通配符与正则元素,比 LIKE 更丰富但性能/可读性不如 LIKE 或正则 ✓ 正确答案
# 61. SUBSTRING('hello world' FROM 1 FOR 5) 的返回值? A 返回 'world' B 返回 'hello world' C 返回 'hello' ✓ 正确答案 D 返回错误
# 62. STRING_AGG/GROUP_CONCAT 的分隔符、排序与去重(DISTINCT)语义差异 A 都做组内拼接并支持排序/去重,但分隔符与排序语法不同(STRING_AGG 用参数,GROUP_CONCAT 用 SEPARATOR) ✓ 正确答案 B 两者语法完全相同 C 两者都不支持排序 D 两者都不忽略 NULL
# 63. 字符串按分隔符拆分的方言差异(split_part/SUBSTRING_INDEX/STRING_SPLIT) A split_part 返回多行 B 三者相同 C PostgreSQL split_part 取第 n 段、MySQL SUBSTRING_INDEX 取前 n 段、SQL Server STRING_SPLIT 返回多行 ✓ 正确答案 D STRING_SPLIT 取第 n 段
# 64. 字符串排序规则(COLLATION)的处理? A 只影响排序顺序 B 不同 collation 总能兼容 C 不影响索引 D COLLATION 决定大小写/重音敏感性与字符顺序,影响比较、排序、DISTINCT 与索引,跨 collation 可能冲突 ✓ 正确答案
# 65. ANY 与 ALL 的语义差异? A 两者等价 B ANY 表示存在一个满足(如 x > ANY 大于最小值),ALL 表示全部满足(大于最大值) ✓ 正确答案 C ANY 表示全部满足 D ALL 表示存在一个满足
# 68. 子查询能否使用 ORDER BY? A 子查询不能使用 ORDER BY B 派生表 ORDER BY 总是生效 C 子查询可用 ORDER BY,但无 LIMIT 时顺序通常不保证,配合 LIMIT 才有意义 ✓ 正确答案 D 子查询 ORDER BY 必报错
# 69. CASE 表达式是否走短路求值? A CASE 不求值 B CASE 短路求值,返回第一个满足分支后不再求值后续,可防除零等错误 ✓ 正确答案 C CASE 计算所有分支 D 短路求值导致错误
# 70. NULLIF 的常见用法(防止除零)? A NULLIF 不能防除零 B NULLIF(b, 0) 返回 0 C NULLIF(b, 0) 把 0 转 NULL,使除法结果为 NULL 而非除零错误 ✓ 正确答案 D NULLIF(b,0) 结果报错
# 72. REVERSE 函数对中文的处理? A REVERSE 不支持中文 B 中文永不反转 C 总是按字节反转 D 现代数据库 REVERSE 通常按字符反转,中文安全,但旧版本可能按字节反转导致乱码 ✓ 正确答案
# 73. LEFT/SUBSTRING 按字符截断与按字节截断(多字节)的差异与业务影响 A 按字节截断多字节字符安全 B 两者等价 C 按字符截断安全,按字节截断可能拆坏 UTF-8 多字节字符产生乱码,需注意字符/字节语义 ✓ 正确答案 D 中文无反例