SQL 中的 CTE(公用表表达式)详解:从基础语法到递归实战

写复杂查询的时候,你有没有经历过这些瞬间:一个查询里套了三层子查询,括号一层套一层,改一个条件要数半天括号;同一个中间结果在一条 SQL 里要用两次,只能复制粘贴两遍;想表达"先取 A,再基于 A 算 B,最后基于 B 出结果",却不得不把它们全部硬挤进一个 SELECT 里。 ...

2026年9月8日 · 7 分钟 · 3497 字

sqlite删除记录后数据库文件大小不变

最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M; 原因是: sqlite采用的是变长纪录存储,当你从Sqlite删除数据后,未使用的磁盘空间被添加到一个内在的”空闲列表”中用于存储你下次插入的数据,用于提高效率,磁盘空间并没有丢失,但也不向操作系统返回磁盘空间,这就导致删除数据乃至清空整个数据库后,数据文件大小还是没有任何变化,还是很大 ...

2025年7月19日 · 3 分钟 · 1115 字

sqlite获取插入id的几种方式

SQLite 中,表设置自增列后,可通过如下几种方式获取插入记录的 ID sqlite_sequence insert into TbTest(Name, Age) values('usr', 20); select seq from sqlite_sequence where name='TbTest'; rowid --表设置了自增列,会生成 rowid 的隐藏列,需要显式查询语句才可以查询出 select rowid from TbTest; --但是,表没有设置自增列,上面的语句无法查出任何值 --特殊的,表无论是否设置了自增列,但都可以使用聚合函数查询出 rowid insert into TbTest(Name, Age) values('usr', 20); select max(rowid) from TbTest; ID列 insert into TbTest(Name, Age) values('usr', 20); select max(ID) from TbTest; last_insert_rowid insert into TbTest(Name, Age) values('usr', 20); --注意!若此行处有插入临时表的操作,下面的语句获取到的是插入临时表的 rowid select last_insert_rowid() from TbTest LIMIT 1;

2025年7月19日 · 1 分钟 · 209 字