数据与数据库面试题库
收录真实面试常见问题,答案长度适合口头表达;拿不准时可返回相关主题复习。
4个问题 初级 高级
全部难度 初级 中级 高级
逐题查看 显示全部答案
分析型SQL
2个问题 · 0 已看01 窗口聚合与GROUP BY有什么区别? 查看答案 ▾ 收起 ▴
GROUP BY会改变结果粒度:每个分组通常合并成一条输出行,除非后续操作再次展开。窗口聚合保留输入粒度,并为每条行附加一个基于分区计算的值,因此适合组内占比、累计值和相邻行比较。使用时仍需明确分区、窗口顺序,通常还要写出框架。窗口顺序只控制计算,不保证最终展示顺序;展示必须稳定时,外层查询还需要自己的ORDER BY。
延伸阅读 高级SQL
讲清楚了吗? 02 为什么ROWS与RANGE会产生不同的累计值? 查看答案 ▾ 收起 ▴
ROWS按排序后行序列中的位置移动框架边界;RANGE根据排序值确定边界,通常会把排序值相等的行视为同值行。两条记录具有相同时间或金额时,默认RANGE框架可能让两行的累计值都包含彼此,而看似相同的ROWS框架会按物理行逐条增长。各数据库的RANGE语法与时间间隔支持不同。我会显式写出框架,在边界放入重复值,并在生产方言上验证结果。
延伸阅读 高级SQL
讲清楚了吗? 递归查询
1个问题 · 0 已看03 怎样让处理层次数据的递归CTE更安全? 查看答案 ▾ 收起 ▴
先分别定义锚集合与一步可达关系,再证明每一轮递归如何向终止状态推进。即使数据按树设计,也可能存在脏数据,因此要携带已访问标识集合或带分隔符的路径,并定义节点重复时如何处理。深度、行数或语句超时上限只是资源保护,不能充当正确性证明。多租户系统还必须在锚成员与递归成员中都保留租户和权限条件。最后测试环、多个父节点、孤儿节点、空锚集合与最大合法深度。
延伸阅读 高级SQL
讲清楚了吗? 查询语义
1个问题 · 0 已看04 什么情况下NOT EXISTS比NOT IN更安全? 查看答案 ▾ 收起 ▴
用于排除时,如果子查询列可能包含NULL,NOT EXISTS更安全。NOT IN按SQL三值逻辑把外层值与右侧每个值比较;没有相等项但存在NULL时,条件可能得到UNKNOWN,WHERE会删除该行。相关NOT EXISTS只检查等值匹配是否存在,因此无关的空值不会污染结果。我仍会定义外层键为空时的行为,测试空集合与重复值,并查看目标数据库计划,而不是假定某种写法永远更快。
延伸阅读 高级SQL
讲清楚了吗? 没有符合筛选条件的问题。