投影与筛选与聚合与分组

共 46 题
#

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 ✓ 正确答案