SQLite 整数除法:算完再转小数,为什么已经丢掉了半个 一张完成率表把一半算成了零统计任务完成率时,完成数是一,计划数是二。查询能运行,得到的比率却是零,给结果乘一百之后仍然是零。问题通常出在两项都是整数,除法已经执行了整数运算;显示层多保留几位小数,只会把零写得更长,不... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
SQLite EXCEPT 做差集:缺少的编号与缺少的明细不能用同一种比较 核对两份导出清单时,常会问“左边有哪些右边没有的内容”。这句话看起来明确,实际却至少有两种意思:缺少哪些编号,或缺少哪些编号与状态的组合。EXCEPT 比较的是查询输出的整行,选择哪些列,本身就在定义什么算同一条。它... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
SQLite UNION 合并结果:两笔内容相同的记录,为什么只剩下一笔 先确定重复行是否代表同一件事把两个站点的库存动作放到一份报表里,看起来只需要拼接查询。可是两笔独立动作可能恰好具有相同商品和数量。如果查询只投影这两列,再用 UNION 合并,它们就可能被压成一行。报表仍能正常生成,... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
SQLite 累计窗口:时间相同的两条记录,ROWS 和 RANGE 为什么算得不同 同一时刻的记录要不要一起算进去库存流水里,同一时刻可能有两笔入库。一张逐笔明细希望第一笔之后就显示余额,另一张看板却希望同一时刻的所有记录都显示该时刻结束后的余额。两种累计都合理,但计算口径不同。只写“按时间求累计和... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
SQLite 递归 CTE 遍历层级:把访问路径带上,显式挡住循环 层级数据也可能混进一条回头边分类菜单看起来是一棵树,但导入数据时可能把某个子分类重新指向祖先。递归查询若只不断连接下一层,就会在环里重复行。另一个容易误判的情况是共享分类:两个上级都引用同一节点,这并不等于循环。要保... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
SQLite UPSERT 实战:更新已有记录时,别把 REPLACE 当成 UPDATE 导入库存时,“存在就更新,不存在就新增”很常见。把语句写成 INSERT OR REPLACE 看似省事,却可能让原有备注恢复成默认值。原因在于 REPLACE 的冲突处理与对原行执行 UPDATE 不同。下面用 P... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
SQL 窗口排名并列处理:row_number、rank 和 dense_rank 怎么选 “取每组前三名”不是一个足够完整的查询需求:是最多三条记录,还是所有占据前三个名次的人,或者前三档不同分数?只要存在并列,三种答案就可能不同。本文以 PostgreSQL 18 为语义基准,使用只读 VALUES 样... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
SQL NULL 三值逻辑:为什么“不等于”会漏掉空值 想找出“状态不是已完成”的记录,写了 status 不等于 done,却发现未知状态的行没有出现。这不是数据库随机漏数据,而是 NULL 参与比较时会产生未知结果。本文使用 PostgreSQL 18 的普通标量表达... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
SQL 键集分页:用稳定游标替代不断增长的 OFFSET 列表越往后翻,OFFSET 越大,数据库需要处理的跳过部分可能越来越多。对于“继续加载下一页”的场景,可以改成从上一页最后一条记录之后继续查,这通常称为键集分页。本文使用 PostgreSQL 18 语法,假定 po... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
PostgreSQL EXPLAIN 入门:先找估算偏差,再决定要不要建索引 一条查询变慢,最容易冲动的做法是立刻给条件列加索引。但慢查询可能来自数据分布变化、返回结果过多、错误的行数估计,甚至应用网络与序列化。执行计划的价值,是把“感觉数据库慢”变成可检验的假设。本文以 PostgreSQL... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读