# 1. SELECT * 在生产环境的危害,列顺序变化、列裁剪(Column Trimming)失效、网络带宽浪费如何避免? A 它在任何情况下性能都优于显式列 B 它会触发列裁剪从而减少 IO C 它可能因列顺序变化导致结果不稳定,且无法列裁剪、浪费带宽 ✓ 正确答案 D 它只影响结果集,不影响网络传输
# 2. SELECT DISTINCT 的实现代价,去重是通过排序(Sort)还是哈希聚合(HashAggregate)? A 它既可通过排序去重,也可通过哈希聚合去重,哈希聚合在内存充足且数据量大时通常更快 ✓ 正确答案 B 它只能通过排序实现 C 它无需任何额外代价 D 它只能通过哈希聚合实现
# 3. SELECT 列表中的子查询(标量子查询)与函数调用在执行计划中的差异? A 非相关标量子查询可能被优化为 InitPlan 只执行一次,而 volatile 函数会对每行重新求值 ✓ 正确答案 B 两者都在每行求值,无区别 C 函数调用总是比子查询慢 D 标量子查询不能在 SELECT 列表中使用
# 4. SELECT 子句的执行阶段在 WHERE 之后、ORDER BY 之前,请用关系代数符号写出 select * from t where x>1 order by y 的执行树。 A 先排序再过滤 B 先投影再过滤再排序 C 先过滤(σ),再投影(π),最后排序(τ) ✓ 正确答案 D 过滤与投影同时发生,与排序无关
# 5. WHERE 子句中的常见谓词(=, <>, >, <, BETWEEN, IN, LIKE, IS NULL, EXISTS)如何映射到 B-Tree 索引?哪些谓词会导致索引失效? A LIKE '%abc' 通常也能走索引前缀匹配 B IS NULL 永远无法走索引 C =、>、<、BETWEEN、IN 一般为 SARGable,可走 B-Tree 索引;LIKE 前导通配符或对列做函数则可能失效 ✓ 正确答案 D <> 比 = 更容易走索引
# 6. TABLESAMPLE 的 SYSTEM(按数据块随机)与 BERNOULLI(按行独立随机)两种采样方法在样本均匀性、执行成本与统计信息收集上的差异是什么? A BERNOULLI 按行独立随机抽样,均匀性更好但需扫描全部数据、I/O 成本高 ✓ 正确答案 B SYSTEM 按行抽样,均匀性最好 C SYSTEM 成本高于 BERNOULLI D 两者在均匀性上完全相同
# 7. WHERE 子句中对 NULL 的处理(IS NULL、IS NOT NULL)能否走索引? A 任何数据库都能走索引 B 取决于索引是否存储 NULL:PostgreSQL 普通 B-Tree 含 NULL 可走,Oracle 默认不含 NULL 则不能直接走 ✓ 正确答案 C 任何数据库都不能走索引 D 只有组合索引才能支持 IS NULL
# 8. PostgreSQL 中 SELECT INTO 与 CREATE TABLE AS SELECT 在语义与事务行为上有何差异?二者为何都不继承源表的索引、约束与默认值? A 两者都会复制源表的索引和约束 B 两者都基于查询结果创建新表,且不继承源表的索引、约束与默认值 ✓ 正确答案 C SELECT INTO 会继承源表约束 D CTAS 不能创建新表
# 9. DISTINCT ON(PostgreSQL)的用法? A 它按表达式分组并为每组返回第一行,且需配合 ORDER BY 确定组内顺序 ✓ 正确答案 B 它对每组返回所有行 C 它等价于 GROUP BY D 它不能与其他谓词一起使用
# 10. DISTINCT 与 GROUP BY 的等价关系? A 两者永远不等价 B GROUP BY 不能去重 C DISTINCT 可以替代 GROUP BY 实现聚合 D 当 SELECT 列与 GROUP BY 列一致且无聚合时两者等价,有聚合时只能用 GROUP BY ✓ 正确答案
# 11. ILIKE 与 LIKE 的差异(PostgreSQL)? A LIKE 大小写不敏感,ILIKE 大小写敏感 B ILIKE 不支持通配符 C 两者完全等价 D ILIKE 是大小写不敏感匹配,普通 B-Tree 索引对 ILIKE 前缀匹配通常无效 ✓ 正确答案
# 12. PostgreSQL 中 SELECT 的输出行数估算(pg_stat)如何查询? A reltuples 由 ANALYZE 更新,是估算值而非精确行数 ✓ 正确答案 B reltuples 总是精确等于实际行数 C 只能通过 COUNT(*) 获取估算 D pg_stat_user_tables 不包含行数信息
# 13. PostgreSQL 中如何用 EXPLAIN 查看 SELECT 的执行路径? A EXPLAIN 会真正执行查询 B EXPLAIN 无法查看索引使用情况 C EXPLAIN 只能查看内存状态 D EXPLAIN ANALYZE 会真正执行该语句并输出实际耗时与行数 ✓ 正确答案
# 14. SELECT * 与 SELECT col1, col2, col3 在网络传输上的差异? A 两者传输量永远相同 B SELECT * 在宽表上会传输更多列的数据,浪费带宽且无法列裁剪 ✓ 正确答案 C 显式列总比 SELECT * 慢 D 网络传输只依赖行数,与列数无关
# 15. SELECT FROM WHERE 与 SELECT FROM WHERE ORDER BY 的执行顺序差异? A 先排序再过滤 B 带 ORDER BY 一定比不带慢 C ORDER BY 在 WHERE 之前执行 D 逻辑顺序为 FROM→WHERE→SELECT→ORDER BY,ORDER BY 增加排序步骤可借助索引避免显式排序 ✓ 正确答案
# 16. SELECT INTO 的两种语义(PostgreSQL 创建新表 vs SELECT 结果赋给变量)? A 它只能建表 B 它在任意上下文都建表 C 它只能给变量赋值 D 顶层用于建表,PL/pgSQL 中用于把查询结果赋给变量 ✓ 正确答案
# 17. SELECT 列表的列能否重复?SELECT col, col FROM t 含义? A 语法上不允许 B 重复列会导致语法错误 C 语法上允许,会返回多列相同值,但生产上应避免 ✓ 正确答案 D 只有 DISTINCT 时才能重复
# 18. SELECT 子句中能否使用表达式?SELECT col+1, col*2 FROM t 的执行计划如何? A SELECT 子句不允许使用表达式 B 表达式只能用于 WHERE C 表达式必然触发全表扫描 D 表达式在投影阶段对每行求值,通常不引入额外扫描节点 ✓ 正确答案
# 19. WHERE col LIKE 'abc%' 能否走索引? A 永远不能走索引 B 与 collation 无关 C 只有 % 在开头才能走索引 D 通配符不在开头时可作为前缀匹配走 B-Tree 索引,前导通配符则不能 ✓ 正确答案
# 20. WHERE 子句中表达式索引的使用条件? A 表达式索引只能用于等值查询 B 任意函数都能建表达式索引 C 查询表达式与索引表达式必须一致且函数须为 IMMUTABLE ✓ 正确答案 D 表达式索引不依赖函数稳定性
# 21. GROUP BY 的语义,分组后每组输出单行。SELECT 列表为何只能包含分组键或聚合函数? A 可以任意引用普通列 B 只能包含分组键或聚合函数,否则结果不确定或报错 ✓ 正确答案 C 必须包含所有列 D 不允许使用聚合函数
# 22. HAVING 与 WHERE 的执行顺序与语义差异,HAVING 在分组后过滤。 A WHERE 过滤行、HAVING 过滤组,聚合条件只能用 HAVING ✓ 正确答案 B WHERE 在分组后过滤,HAVING 在分组前过滤 C 两者完全等价 D WHERE 中可以使用聚合函数
# 23. PostgreSQL 中 FILTER (WHERE ...) 子句与 CASE WHEN 聚合的等价写法与性能差异? A FILTER 只能用于 COUNT B CASE WHEN 写法结果不同 C FILTER (WHERE ...) 与 CASE WHEN 条件聚合结果等价,FILTER 通常更简洁高效 ✓ 正确答案 D FILTER 不能与 GROUP BY 一起用
# 24. 假设集聚合(Hypothetical-Set Aggregate),RANK() WITHIN GROUP 的用法? A 它与窗口函数 RANK() OVER 完全等价 B 它无法使用 WITHIN GROUP C 它只能用于 ORDER BY D 它计算一个假设值插入有序集合后的排名,返回单行聚合结果 ✓ 正确答案
# 25. 有序集聚合(Ordered-Set Aggregate),PERCENTILE_CONT、PERCENTILE_DISC 与 WITHIN GROUP 子句的用法? A 两者完全等价 B DISC 是连续插值 C CONT 做线性插值可能返回非原始值,DISC 返回实际数据点 ✓ 正确答案 D 两者都不需要 WITHIN GROUP
# 26. 聚合函数中的 DISTINCT 与 ALL 修饰符,COUNT(DISTINCT col) 与 COUNT(col) 的实现差异。 A 两者实现完全相同 B DISTINCT 修饰符只能用于 COUNT C COUNT(col) 也统计 NULL D COUNT(DISTINCT col) 需先去重再计数,代价通常高于 COUNT(col) ✓ 正确答案
# 27. 聚合函数的统计相关性(CORR、COVAR_POP、REGR_SLOPE)如何在查询中使用? A CORR 返回单变量统计 B 统计函数返回 NULL 表示强相关 C 它们只能用于没有 GROUP BY 的查询 D CORR、COVAR_POP、REGR_SLOPE 用于在分组内计算两个变量的相关性与回归 ✓ 正确答案
# 28. 聚合函数(COUNT、SUM、AVG、MIN、MAX)在 NULL 上的处理规则,COUNT(*) 与 COUNT(col) 的差异。 A SUM 会把 NULL 当作 0 B COUNT(*) 统计所有行,COUNT(col) 只统计非 NULL 行,SUM/AVG 忽略 NULL ✓ 正确答案 C COUNT(*) 与 COUNT(col) 结果相同 D 空集时 SUM 返回 0
# 29. 聚合函数(sum/avg)的精度与溢出,整数聚合溢出如何处理?DECIMAL 与 NUMERIC 类型聚合? A 整数 SUM 永远不会溢出 B DECIMAL 聚合不受精度限制 C sum(int) 常被提升为 bigint 但大数仍可能溢出,可显式 CAST 为 numeric 规避 ✓ 正确答案 D AVG 对整数返回整数
# 30. SELECT col, COUNT(*) FROM t 的合法性,col 不在 GROUP BY 时报错? A 在任何数据库都合法 B 它等价于 GROUP BY col C 它返回所有行 D 标准模式会报错,因为 col 既非分组键也非聚合;MySQL 宽松模式可能返回不确定值 ✓ 正确答案
# 31. GROUP BY 与 DISTINCT 的执行计划差异? A 两者永远不同 B 无聚合时两者语义等价,计划常被统一处理,都用排序或哈希分组/去重 ✓ 正确答案 C GROUP BY 一定比 DISTINCT 快 D DISTINCT 不需要排序或哈希
# 32. GROUPING() 函数与 ROLLUP 的配合用法? A ROLLUP 不生成小计行 B GROUPING(col) 返回 1 表示该列被 ROLLUP 聚合(小计行),用于识别小计/总计 ✓ 正确答案 C GROUPING 只能用于 DISTINCT D 两者不能配合使用
# 33. PostgreSQL 中 percentile_cont(0.5) WITHIN GROUP (ORDER BY col) 的含义? A 它返回 col 的最大值 B 它只返回原始数据中的值 C 它计算第 50 百分位(中位数),采用连续插值可能返回非原始值 ✓ 正确答案 D 它等价于 MIN(col)
# 34. PostgreSQL 中 stddev_pop 与 stddev_samp 的差异? A 两者完全等价 B 两者都返回 NULL C samp 用 n 作分母 D pop 用 n 作分母(总体),samp 用 n-1 作分母(样本),样本标准差通常略大 ✓ 正确答案
# 35. SQL_MODE=ONLY_FULL_GROUP_BY 的作用(MySQL)? A 它关闭后更严格 B 开启后禁止 SELECT 非分组键且非聚合的列,使行为符合标准 SQL,MySQL 5.7+ 默认开启 ✓ 正确答案 C 它只影响排序 D 它禁止使用聚合函数
# 36. STRING_AGG、ARRAY_AGG、JSON_AGG 的用法差异? A 三者返回类型完全相同 B 只有 STRING_AGG 支持聚合 C 分别返回拼接字符串、数组、JSON 数组,都可用 ORDER BY 控制组内顺序 ✓ 正确答案 D 三者不能配合 GROUP BY
# 37. SUM(NULL) 的返回值?COUNT(NULL) 的返回值? A 两者都返回 NULL B SUM(NULL) 返回 NULL,COUNT(NULL) 返回 0 ✓ 正确答案 C 两者都返回 0 D SUM(NULL) 返回 0,COUNT(NULL) 返回 NULL
# 38. 位运算聚合(BIT_AND、BIT_OR、BIT_XOR)的用途? A BIT_AND 对组内值按位做与运算,某位为 1 需所有值该位都为 1 ✓ 正确答案 B BIT_OR 要求所有值该位都为 1 C 位运算聚合只能用于字符串 D 三者结果总相同
# 39. 布尔聚合函数(BOOL_AND、BOOL_OR)的用法? A 两者等价 B BOOL_AND 为 TRUE 表示组内存在 TRUE C BOOL_AND 为 TRUE 表示组内所有值均为 TRUE ✓ 正确答案 D 它们只能处理 NULL
# 40. 聚合函数的两种实现方式(HashAggregate、GroupAggregate)的适用场景? A HashAggregate 用哈希表免预排序但耗内存,GroupAggregate 要求输入有序但省内存 ✓ 正确答案 B HashAggregate 不需要分组键 C GroupAggregate 不需要排序 D 两者只在无 GROUP BY 时使用
# 41. LIKE 的通配符(%、_)能否放在开头?性能影响? A 语法非法 B 性能与在末尾相同 C 语法合法但会因前缀未知而无法使用 B-Tree 索引,需全表扫描(或用 pg_trgm) ✓ 正确答案 D 前导通配符反而更快
# 42. TABLESAMPLE 的 REPEATABLE(seed) 如何保证采样可重现?采样率估计与全表统计相比有何偏差风险? A 相同 seed 可重现相同采样,但采样本质是近似,存在聚簇与抽样偏差 ✓ 正确答案 B seed 不影响任何结果 C 采样结果与全表统计总一致 D REPEATABLE 会加大采样偏差
# 43. AVG(col) 与 SUM(col)/COUNT(col) 的等价性? A 两者永远不等价 B AVG 不忽略 NULL C 两者等价于 SUM(col)/COUNT(*) D AVG(col) 等于 SUM(col)/COUNT(col)(均忽略 NULL),但不能用 COUNT(*) 替代 ✓ 正确答案
# 44. COUNT(*) 与 COUNT(1) 是否等价? A 两者等价,都统计所有行数,性能也相当 ✓ 正确答案 B COUNT(1) 比 COUNT(*) 快 C COUNT(1) 忽略 NULL D 两者不等价
# 45. 如何统计表的总行数?COUNT(*) 还是 pg_class.reltuples? A COUNT(*) 快但近似 B reltuples 精确但慢 C 两者都精确 D COUNT(*) 精确但慢,reltuples 是 ANALYZE 更新的近似值但快 ✓ 正确答案
# 46. HAVING 子句中的典型用法? A HAVING 过滤单行 B HAVING 中不能使用聚合函数 C HAVING 只能与 WHERE 同时使用 D HAVING 用于过滤分组结果,典型包含聚合条件如 COUNT(*) > 10 ✓ 正确答案