数据与数据库 面试题库

收录真实面试常见问题,答案长度适合口头表达;拿不准时可返回相关主题复习。

4个问题 初级 高级
全部难度 初级 中级 高级
逐题查看 显示全部答案
报告错误

分析型 SQL

2个问题
01 窗口聚合与 GROUP BY 有什么区别? 中级 常见 查看答案 ▾ 收起 ▴

GROUP BY 会改变结果粒度:每个分组通常合并成一条输出行,除非后续操作再次展开。窗口聚合保留输入粒度,并为每条行附加一个基于分区计算的值,因此适合组内占比、累计值和相邻行比较。使用时仍需明确分区、窗口顺序,通常还要写出框架。窗口顺序只控制计算,不保证最终展示顺序;展示必须稳定时,外层查询还需要自己的 ORDER BY。

延伸阅读 高级 SQL
讲清楚了吗?
02 为什么 ROWS 与 RANGE 会产生不同的累计值? 高级 常见 查看答案 ▾ 收起 ▴

ROWS 按排序后行序列中的位置移动框架边界;RANGE 根据排序值确定边界,通常会把排序值相等的行视为同值行。两条记录具有相同时间或金额时,默认 RANGE 框架可能让两行的累计值都包含彼此,而看似相同的 ROWS 框架会按物理行逐条增长。各数据库的 RANGE 语法与时间间隔支持不同。我会显式写出框架,在边界放入重复值,并在生产方言上验证结果。

延伸阅读 高级 SQL
讲清楚了吗?

递归查询

1个问题
03 怎样让处理层次数据的递归 CTE 更安全? 高级 偶尔 查看答案 ▾ 收起 ▴

先分别定义锚集合与一步可达关系,再证明每一轮递归如何向终止状态推进。即使数据按树设计,也可能存在脏数据,因此要携带已访问标识集合或带分隔符的路径,并定义节点重复时如何处理。深度、行数或语句超时上限只是资源保护,不能充当正确性证明。多租户系统还必须在锚成员与递归成员中都保留租户和权限条件。最后测试环、多个父节点、孤儿节点、空锚集合与最大合法深度。

延伸阅读 高级 SQL
讲清楚了吗?

查询语义

1个问题
04 什么情况下 NOT EXISTS 比 NOT IN 更安全? 中级 常见 查看答案 ▾ 收起 ▴

用于排除时,如果子查询列可能包含 NULL,NOT EXISTS 更安全。NOT IN 按 SQL 三值逻辑把外层值与右侧每个值比较;没有相等项但存在 NULL 时,条件可能得到 UNKNOWN,WHERE 会删除该行。相关 NOT EXISTS 只检查等值匹配是否存在,因此无关的空值不会污染结果。我仍会定义外层键为空时的行为,测试空集合与重复值,并查看目标数据库计划,而不是假定某种写法永远更快。

延伸阅读 高级 SQL
讲清楚了吗?