PostgreSQL 的 DISTINCT ON 如何按指定排序取每组第一条,和标准 DISTINCT 有何不同?
围绕“PostgreSQL 的 DISTINCT ON 如何按指定排序取每组第一条,和标准 DISTINCT 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 DISTINCT ON 与 ORDER BY 前缀必须匹配的规则及其与窗口函数方案的取舍。
数据库面试题第 2 页,显示第 51–100 题,共找到 134 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“PostgreSQL 的 DISTINCT ON 如何按指定排序取每组第一条,和标准 DISTINCT 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 DISTINCT ON 与 ORDER BY 前缀必须匹配的规则及其与窗口函数方案的取舍。
围绕“只做去重时 DISTINCT 和 GROUP BY 语义是否完全等价,优化器如何看待它们”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确无聚合时二者语义等价及 PostgreSQL 优化器常按同一路径处理的事实。
围绕“PostgreSQL 聚合函数的 FILTER (WHERE ...) 子句相比 CASE WHEN 条件聚合有什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 FILTER 只对满足条件的行做聚合的表达力与可读性差异,不比较执行性能基准。
围绕“如何用窗口函数把连续签到日期合并成连续区间(gaps and islands)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确日期减行号生成岛标识再分组聚合的经典解法逻辑。
围绕“SQL 中 WHERE 和 HAVING 的过滤顺序是什么,各自能引用什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 HAVING 作用于聚合后分组、WHERE 作用于聚合前行,且 WHERE 不能用聚合函数。
围绕“为什么 MySQL 旧模式允许而 PostgreSQL 拒绝 SELECT 中未聚合也未分组的列”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确结果不确定性的语义原因及 PostgreSQL 对功能依赖主键列的例外,不比较两家全部方言差异。
围绕“ROLLUP、CUBE 和 GROUPING SETS 分别生成哪些分组层级,结果里的 NULL 如何区分”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确三者生成维度子集的差异及 GROUPING() 区分真实 NULL 与汇总临时标记 NULL。
围绕“子查询结果含 NULL 时 NOT IN 返回空结果而 NOT EXISTS 正常,原因是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 NOT IN 展开为 <> ALL 遇 NULL 得 UNKNOWN 的三值逻辑推导。
围绕“INTERSECT 和 EXCEPT 如何处理重复行,EXCEPT 的左右顺序为什么重要”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确两者默认去重、EXCEPT 非对称的语义及 ALL 变体保留重复的行为。
围绕“LEFT JOIN 的过滤条件写在 ON 里和写在 WHERE 里结果为什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 ON 在连接前过滤、WHERE 在连接后过滤导致 NULL 行被剔除的语义差异。
围绕“多对多连接时 SQL JOIN 为什么会产生重复行,如何诊断并消除”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确连接键非唯一导致的行膨胀机制及 DISTINCT/预聚合两种修复的取舍,不讲索引优化。
围绕“为什么 SQL 中 INNER JOIN 换成 LEFT JOIN 后结果行数可能变多也可能不变”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确连接匹配失败时左表行的保留规则及行数变化条件。
围绕“LAG/LEAD 在首行或末行返回 NULL,如何给出默认值并避免类型转换错误”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确第三参数默认值与表达式求值范围,以及默认值类型需与列匹配的注意点。
围绕“PostgreSQL 的 LATERAL 连接如何简化「每组取最新一条」的查询”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 LATERAL 允许子查询引用左表列从而逐组求 top-N 的机制。
围绕“为什么只写 LIMIT 不写 ORDER BY 的查询结果不可依赖,即使多次执行看起来一样”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确无 ORDER BY 时行序由执行计划与存储决定、无语义保证的原因。
围绕“SQL SELECT 的逻辑执行顺序是什么,为什么 SELECT 里起的别名不能在同层 WHERE 用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 FROM→WHERE→GROUP→HAVING→SELECT→ORDER BY 的顺序及别名作用域推论。
围绕“PostgreSQL 的 MVCC 下,同一事务里两次相同的 SELECT 在什么隔离级别下结果可能不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 READ COMMITTED 每条语句取新快照而 REPEATABLE READ 用事务级快照的差异。
围绕“为什么生产代码中通常不建议使用 NATURAL JOIN”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确按同名列自动匹配在表结构变更时的脆弱性。
围绕“NTILE 和 PERCENT_RANK 都表达相对位置,分桶结果在什么数据下差异明显”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 NTILE 均分行数而 PERCENT_RANK 按秩归一化的计算差异及并列处理。
围绕“为什么 NULL = NULL 不成立,SQL 的三值逻辑如何让 WHERE 条件「静默丢行」”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 TRUE/FALSE/UNKNOWN 的传播规则及 UNKNOWN 被 WHERE 视为不通过的后果。
围绕“聚合函数遇到 NULL 列时各自如何处理,AVG 的分母是否包含 NULL 行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确除 COUNT(*) 外聚合忽略 NULL 的规则及 AVG 分母只计非 NULL 行。
围绕“PostgreSQL 排序时 NULL 默认排在哪,NULLS FIRST/LAST 如何影响分页”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 ASC 默认 NULLS LAST、DESC 默认 NULLS FIRST 及显式指定对稳定分页的影响。
围绕“如何用 PostgreSQL 递归 CTE 查询组织架构下某节点的所有下级并防止环”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确锚成员+递归成员的求值过程及路径数组防环写法。
围绕“ROW_NUMBER、RANK、DENSE_RANK 在并列值时分别返回什么名次”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确三者对并列和后续名次的编号规则差异。
围绕“用 SUM() OVER 算累计和时,默认窗口帧为什么会在排序值重复时算错”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确默认 RANGE UNBOUNDED PRECEDING 把同值行并入同帧的语义及改 ROWS 的修复。
围绕“标量子查询返回多行时报错,而返回零行时得到 NULL,这一语义如何使用和防御”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确标量子查询 0/1/N 行三种结果的语义及用 LIMIT 或聚合防御。
围绕“如何用 SQL 自连接查询员工及其直属上级的姓名”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确同表两次取别名并按外键连接的写法与 NULL 上级的处理。
围绕“集合运算对两侧 SELECT 的列有什么要求,结果列名和数据类型如何确定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确列数相等、对应类型可隐式统一到公共类型、列名取第一个查询的规则。
围绕“用子查询改写 JOIN 时为什么有时必须加 DISTINCT 才能保证结果一致”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确一对多连接导致主表行重复而 IN/EXISTS 半连接不重复的语义差别。
围绕“如何用窗口函数实现「每个部门工资最高的两名员工」,并处理并列工资”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 PARTITION BY + ROW_NUMBER/RANK 子查询过滤模式及并列时选 RANK 还是加决胜排序键的决策。
围绕“UNION 和 UNION ALL 结果何时相同,为什么能确定无重复时应优先用 UNION ALL”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 UNION 隐式去重排序的开销及等价条件判断。
围绕“SELECT 里同时有 GROUP BY 和窗口函数时,窗口函数能看到哪些行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确窗口在分组聚合之后、基于聚合结果行求值的逻辑顺序。
围绕“窗口帧的 ROWS BETWEEN 和 RANGE BETWEEN 在分组对等行处理上有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 RANGE 按值、ROWS 按物理行、GROUPS 按对等组的纳入规则。
围绕“为什么窗口函数不能写在 WHERE 里,想要过滤窗口结果该怎么办”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 WHERE 在窗口求值之前执行的顺序原因及外层子查询/CTE 过滤的写法。
围绕“窗口函数和 GROUP BY 都按分组计算,结果集结构上有什么本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确窗口函数不折叠行、在每行上附加组级计算的结构差异,不列举所有窗口函数。
围绕“PostgreSQL 显式事务中一条语句报错后,为什么后续语句都报 current transaction is a”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释事务进入失败状态必须回滚或用保存点恢复的设计理由。
围绕“数据库事务的 ACID 四个属性分别保证什么,哪些属性在并发下会打折扣”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求区分原子性、持久性等由日志与锁各自承担的部分。
围绕“PostgreSQL 咨询锁(advisory lock)与行锁的本质区别是什么,适合哪些应用场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕强调其不绑定具体行、按应用语义取锁的特性与典型用途,不列出全部咨询锁函数。
围绕“PostgreSQL 会话级与事务级咨询锁在释放时机上有什么区别,选错会导致什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答连接复用(连接池)下会话级锁泄漏的风险。
围绕“定位到阻塞其他会话的长事务后,pg_cancel_backend 与 pg_terminate_backend 该如”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较取消当前语句与断开整个连接的影响面及回滚代价。
围绕“先 SELECT 判断余额再 UPDATE 扣款为什么在高并发下可能超扣,有哪几种修复方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较条件 UPDATE(WHERE balance>=n)、行锁与隔离级别三种修复的强弱。
围绕“为什么给 PostgreSQL 大表加列默认值或建普通索引可能长时间锁表,有什么低影响的替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 ACCESS EXCLUSIVE 锁的阻塞效果与 CONCURRENTLY 等低锁方案的取舍。
围绕“PostgreSQL 如何检测死锁,deadlock_timeout 参数控制的是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答等待超时后做环检测并选牺牲事务中止的机制与参数含义。
围绕“数据库死锁形成需要哪些条件,两个事务更新两张表的什么顺序会触发死锁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用 AB/BA 顺序交叉加锁的经典例子回答四个必要条件。
围绕“拿到 PostgreSQL 死锁日志后,如何从中还原出是哪些语句按什么顺序持锁造成的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求会读日志中的进程、等待关系与涉及语句,给出固定加锁顺序的预防结论。
围绕“事务因死锁被选为牺牲者中止后,应用层的重试逻辑应该怎么写才安全”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确错误码 40P01 的识别、整事务重试与幂等性要求。
围绕“PostgreSQL 中把隔离级别设为 Read Uncommitted 会发生什么,脏读真的存在吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要指出 PostgreSQL 将其映射为 Read Committed 的实现决策。
围绕“为什么 PostgreSQL 提供 FOR NO KEY UPDATE 这种行锁,它比 FOR UPDATE 弱在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要指出不修改键列的更新可用更弱锁从而减少与外键检查的冲突。
围绕“SELECT FOR UPDATE NOWAIT 与 SKIP LOCKED 在拿不到锁时行为有何不同,各自适合什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖分别用立即报错抢锁与跳过已锁行做任务队列的例子回答。
围绕“SELECT FOR UPDATE 与 FOR SHARE 锁住的行分别允许其他事务做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较两种行锁强度及与 NO KEY UPDATE、KEY SHARE 的冲突关系。