集合、子查询与字符串处理

共 73 题
#

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
#

11. PostgreSQL 中 ARRAY() 子查询的用法?

A 子查询必须返回多列
B 它把数组转成行
C 它把子查询结果转成数组 ✓ 正确答案
D 它用于删除
#

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 子查询支持递归
#

15. 子查询能否作为 UPDATE 的赋值表达式?

A 不允许
B 只能用非相关子查询
C SET 子句可用相关标量子查询赋值,但子查询必须返回单行单列 ✓ 正确答案
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,常用于防除零 ✓ 正确答案
#

21. 嵌套 CASE WHEN 的可读性优化技巧?

A 平铺条件、合并逻辑、提取公共逻辑到 CTE/函数可提升可读性 ✓ 正确答案
B 嵌套越多越好
C 只能保持嵌套
D 不能用逻辑组合
#

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 只能用于字符串
#

30. PostgreSQL 中 GREATEST(1, 2, 3) 的返回值?

A 返回 1
B 报错
C 返回 NULL
D 返回 3 ✓ 正确答案
#

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 为不同值赋排序键,实现自定义优先级排序 ✓ 正确答案
#

52. COALESCE 的参数是否要求类型一致?

A 参数必须完全一致
B 类型无所谓
C 参数需兼容,数据库会隐式转换统一为公共类型,不兼容则报错 ✓ 正确答案
D 返回类型总是第一个参数
#

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 表示存在一个满足
#

66. LATERAL 子查询的关键字是什么?

A 关键字是 LATERAL,放在 FROM 子句子查询前 ✓ 正确答案
B 关键字是 AS
C 关键字是 WITH
D 无需关键字
#

67. VALUES 子句的用法?

A 只能构造一行
B 只能用于 SELECT
C VALUES 构造多行字面量,可用于 INSERT 批量插入、派生表等 ✓ 正确答案
D 不能加括号
#

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) 结果报错
#

71. REPLACE 函数的语义?

A REPLACE 是字符映射
B REPLACE 只替换第一个
C REPLACE 替换所有出现的子串 ✓ 正确答案
D REPLACE 不能替换
#

72. REVERSE 函数对中文的处理?

A REVERSE 不支持中文
B 中文永不反转
C 总是按字节反转
D 现代数据库 REVERSE 通常按字符反转,中文安全,但旧版本可能按字节反转导致乱码 ✓ 正确答案
#

73. LEFT/SUBSTRING 按字符截断与按字节截断(多字节)的差异与业务影响

A 按字节截断多字节字符安全
B 两者等价
C 按字符截断安全,按字节截断可能拆坏 UTF-8 多字节字符产生乱码,需注意字符/字节语义 ✓ 正确答案
D 中文无反例