为什么 MySQL 旧模式允许而 PostgreSQL 拒绝 SELECT 中未聚合也未分组的列?
围绕“为什么 MySQL 旧模式允许而 PostgreSQL 拒绝 SELECT 中未聚合也未分组的列”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确结果不确定性的语义原因及 PostgreSQL 对功能依赖主键列的例外,不比较两家全部方言差异。
数据库 · 表单面试题第 1 页,显示第 1–10 题,共找到 10 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“为什么 MySQL 旧模式允许而 PostgreSQL 拒绝 SELECT 中未聚合也未分组的列”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确结果不确定性的语义原因及 PostgreSQL 对功能依赖主键列的例外,不比较两家全部方言差异。
围绕“SQL SELECT 的逻辑执行顺序是什么,为什么 SELECT 里起的别名不能在同层 WHERE 用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 FROM→WHERE→GROUP→HAVING→SELECT→ORDER BY 的顺序及别名作用域推论。
围绕“PostgreSQL 的 MVCC 下,同一事务里两次相同的 SELECT 在什么隔离级别下结果可能不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 READ COMMITTED 每条语句取新快照而 REPEATABLE READ 用事务级快照的差异。
围绕“集合运算对两侧 SELECT 的列有什么要求,结果列名和数据类型如何确定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确列数相等、对应类型可隐式统一到公共类型、列名取第一个查询的规则。
围绕“SELECT 里同时有 GROUP BY 和窗口函数时,窗口函数能看到哪些行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确窗口在分组聚合之后、基于聚合结果行求值的逻辑顺序。
围绕“先 SELECT 判断余额再 UPDATE 扣款为什么在高并发下可能超扣,有哪几种修复方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较条件 UPDATE(WHERE balance>=n)、行锁与隔离级别三种修复的强弱。
围绕“SELECT FOR UPDATE NOWAIT 与 SKIP LOCKED 在拿不到锁时行为有何不同,各自适合什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖分别用立即报错抢锁与跳过已锁行做任务队列的例子回答。
围绕“SELECT FOR UPDATE 与 FOR SHARE 锁住的行分别允许其他事务做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较两种行锁强度及与 NO KEY UPDATE、KEY SHARE 的冲突关系。
围绕“乐观锁与悲观锁在数据库并发控制中的区别是什么,分别适合什么冲突频率的场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖用版本号校验对比 SELECT FOR UPDATE,按冲突概率与重试成本给选型判断。
围绕“用 SELECT FOR UPDATE SKIP LOCKED 实现数据库任务队列时如何保证同一任务不被两个 wor”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答领取-处理-提交的事务边界与锁配合。