网易首页 > 网易号 > 正文 申请入驻

微信为什么使用 SQLite 保存聊天记录?

0
分享至

SQLite 是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上,SQLite 是一个非常可靠的数据库,它可以处理 TB 级的数据,但它没有网络层。接下来,本文将与大家共同探讨 SQLite 在过去一年中最新的 SQL 功能。

SQLite “只是”一个库,它不是传统意义上的服务器。因此,在某些场合下,它确实不合适。但是,在相当多的其他场合,它却是最合适的选择。SQLite 号称是部署和使用最广泛的数据库引擎。我认为这很有可能,因为 SQLite 没有版权的限制。无论何时,只要开发者想使用 SQL 在文件中存储结构化的数据,SQLite 应是首选方案。

SQLite 的 SQL 方言也非常强大。它比 MySQL 早四年就开始支持 with 语句。最近,它还实现了对于窗口函数的支持,这仅仅比 MySQL 晚五个月。

接下来,本文将介绍 SQLite 在 2018 年新增加的 SQL 功能,也就是 SQLite 从版本 3.22.0 到 3.26.0 所新增加的 SQL 功能。

具体内容包括:

  1. 布尔字面量和判断

  2. 窗口函数

  3. Filter子句

  4. Insert … on conflict (“Upsert”)

  5. 重命名列

  6. 在Modern-SQL.com上接下来

布尔变量和判断

SQLite支持“假”布尔值:它接受Boolean作为类型的名称,但它将其当作整数看待(这一点非常类似于)。真值true和false分别由数值1和0表示(这一点和C语言一样)。

从版本3.23.0开始,SQLite将关键字true和false分别用数字1和0表示,并支持is [not] true | false的判断语句。现在,它不再支持关键字unknown。开发者可以使用空值null来代替,因为unknown和null的布尔值是一样的。

在INSERT和UPDATE语句中,字面量true和false可以大大提高values和set子句的可读性。

is [not] true | false这个判断语句很有用,它与比较操作的含义不一样:

我们来比较一下

WHERE c <> FALSE

WHERE c IS NOT FALSE

在上面的例子中,如果c是null, 那么c <> false的结果是unknown.

这是因为WHERE子句只接受结果为true的值,它会过滤掉结果为false或unknown的值。这样,它就会把对应的行从结果中去掉。

与此相对应,如果c是null,那么,c is not false的判断结果是true。因此,第二个WHERE子句也将包含c是null的行。

要达到同样的效果,您可以采用的另外一种方法是增加单独处理null值的子句。也就是使用语句:

WHERE c <> FALSE
OR c IS NULL

这种形式的语句更长并且有一些冗余语句(c被使用了两次)。长话短说,可以使用is not false判断来替代这个or…is-null的语句。更详细的内容,请参考“Binary Decisions Based on Three-Valued Results”。

SQLite中对布尔字面量和布尔判断的支持现在和其他开源数据库接近,唯一的差距是SQLite不支持is[not] unknown(你可以使用is [not] null来代替)。有趣的是,这些功能在下面提到的商用产品中还不可用。


0: 只支持true,false.不支持notknown,如果需要,用null代替;

1:不支持is [not] unknown,如果需要,用is [not] null代替。

窗口函数

SQLite 3.25.0引入了窗口函数。如果你知道窗口函数,那么也知道这是一件大事。如果你不了解窗口功能,请你自己学习如何使用。这篇文章不会具体解释窗口函数,但请相信:它是最重要的“现代”。

SQLite对over子句的支持与其他数据库非常接近。唯一值得注意的限制是range语句不支持数字或间隔距离(仅支持current row和unbounded preceding|following)。在发布sqlite 3.25.0时,和PostgreSQL具有同样的限制。PostgreSQL 11消除了这一限制。

0:没有变化

1:Range范围定义不支持datetime类型

2:Range范围不接受 关键字 (只支持unbounded和current row)

SQLite对于窗口函数的支持在业界是领先的。它不支持的功能在其他一些主要产品中也同样不支持(在聚合中语句中的distinct,width_bucket, respect|ignore nulls和from first|last等语句)。

0:同样没有ORDER BY 语句

1:不允许负偏移量,nulls的特定处理:lead( , 'IGNORE NULLS'),这里是字符串参数

2:没有缺省值(第三个参数),不支持respect|ignore nulls语句

3:不允许负偏移量,不支持ignore nulls语句

4:不允许负偏移量

5:不支持respect|ignore nulls语句

6:不允许负偏移量,不支持respect|ignore nulls语句

7:nulls的特定处理:first_value( , 1, null, 'IGNORE NULLS') ,这里是字符串参数。

8:不支持ignore nulls语句

9:不支持ignore nulls语句和from last语句

过滤语句

虽然filter语句只是语法糖——你也可以很容易地使用表达式来获得相同的结果——我认为它也是必不可少的语法糖,因为它能使人们更加容易地学习和理解SQL语句。

看看下面的select子句,您觉得哪一个更容易理解?

SELECT SUM(revenue) total_revenue
, SUM(CASE WHEN product = 1
THEN revenue
END
) prod1_revenue

SELECT SUM(revenue) total_revenue
, SUM(revenue) FILTER(WHERE product = 1) prod1_revenue

此示例很好地总结了filter子句的作用:它是聚合函数的后缀,可以在进行聚合之前根据特定条件,过滤掉相应的行。pivot技术是filter子句最常见的用例。这包括将实体属性值(EAV)模型中的属性转换为表格的列,如果想了解更多的内容,可以参考链接“filter-Selective Aggregates”(https://modern-sql.com/feature/filter)。

SQLite 从版本3.25.0开始,在使用over子句的聚合函数中支持了filter子句,但是在使用group by子句的聚合函数中还不支持。不幸的是,这意味着您仍然无法在SQLite中使用filter语句来处理上述情况。你必须像以前一样使用case表达式。我真的希望SQLite在这一点上能尽快做到。

Insert … on conflict (“Upsert”)

SQLite 从版本3.24.0开始,引入了“upsert”概念:它是一个insert语句,可以优雅地处理主键和唯一约束的冲突。您可以选择忽略这些冲突(在on conflict语句中什么都不做)或者更新当前行(在on conflict语句中执行更新操作)。

这是一个特有的SQL扩展,即它不是标准SQL的一部分,因此在下面的矩阵中是灰色的。但是,SQLite遵守与PostgreSQL相同的语法来实现此功能0。该标准提供了对merge语句的支持。

与不同,SQLite在以下语句中存在问题。

INSERT INTO target
SELECT *
FROM source
ON CONFLICT (id)
DO UPDATE SET val = excluded.val

根据说明文档,这是因为解析器无法判断关键字ON是SELECT语句的连接约束还是upsert子句的开头。你可以通过向查询中添加子句来解决,例如where true。

INSERT INTO target
SELECT *
FROM source
WHERE true
ON CONFLICT (id)
DO UPDATE SET val = excluded.val

0:同样记录insert、update、delete和merge操作的错误信息 (“DML error logging”)

1:On conflict语句不能紧挨查询的from语句,如果需要,可以添加 where true语句来分隔。

2:另外,公众 号Java精选,回复java面试,获取数据库面试资料,支持随时随地刷题。

重命名列

SQLite引入的另一个特有功能是重命名基准数据库表中的列1。标准的SQL不支持此类功能2。

SQLite遵循其他产品常用的语法来重命名列:

ALTER TABLE … RENAME COLUMN … TO
0:请查阅 sp_rename.

其他消息

在2018年,除了在SQL语法上的变化,还有一些应用程序接口(API)的变化。你可以查阅sqlite.com(https://www.sqlite.org/news.html)上的新闻部分来了解更详细的消息。

脚标

0:SQLite通常遵循PostgreSQL语法,Richard Hipp将此称为PostgreSQL会怎么做(WWPD)。

1:基准数据库表是指用Create table语句创建的数据库表。派生的数据库表(如Select语句返回的查询结果集)中的列名可以通过SELECT语句、FROM语句或WITH语句来进行改变

2:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。


原文:https://modern-sql.com/blog/2019-01/sqlite-in-2018 作者简介:Markus Winand 提供高效的 SQL 培训 他出版的著作《SQL Performance Explained》已经成为开发人员的标准读物。

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
人怎么能这么聪明!辽宁一女子产后出院遇寒风,丈夫灵机一动用大号塑料袋挡风

人怎么能这么聪明!辽宁一女子产后出院遇寒风,丈夫灵机一动用大号塑料袋挡风

小虎新车推荐员
2026-02-03 06:26:42
马斯克批评诺兰新品选择黑人饰演古希腊神话美女,引发舆论争议

马斯克批评诺兰新品选择黑人饰演古希腊神话美女,引发舆论争议

新浪财经
2026-02-05 11:02:09
秦始皇说:吕不韦于我有恩,本可不死,可是我有1000个杀他的理由

秦始皇说:吕不韦于我有恩,本可不死,可是我有1000个杀他的理由

芊芊子吟
2026-02-05 17:25:07
马斯克审美真绝!艾梅柏疯归疯,颜值上没的说,怪不得不用生孩子

马斯克审美真绝!艾梅柏疯归疯,颜值上没的说,怪不得不用生孩子

悦君兮君不知
2026-02-04 17:40:10
太打脸了!日本从海底挖出稀土,还没高兴两天,中方一句话定调

太打脸了!日本从海底挖出稀土,还没高兴两天,中方一句话定调

未来展望
2026-02-05 01:01:05
52岁李冰冰美出新高度,和李雪同框神似双胞胎,冻龄颜值引热议!

52岁李冰冰美出新高度,和李雪同框神似双胞胎,冻龄颜值引热议!

很哥
2026-02-05 19:24:22
Lisa雪地穿比基尼配14万羽绒服,壁炉旁烤火显可爱

Lisa雪地穿比基尼配14万羽绒服,壁炉旁烤火显可爱

枫尘余往逝
2026-02-04 17:32:15
黄征辉曾透露:台湾可以回归,但大陆必须答应2个条件,缺一不可

黄征辉曾透露:台湾可以回归,但大陆必须答应2个条件,缺一不可

花寒弦絮
2026-01-19 01:23:58
不要再随意猜测杨兰兰的身份了,释放的信号很明显了

不要再随意猜测杨兰兰的身份了,释放的信号很明显了

李昕言温度空间
2025-08-20 15:01:53
支奴干和黑鹰,我们为啥就是抄不动?一段被发动机卡脖子的往事

支奴干和黑鹰,我们为啥就是抄不动?一段被发动机卡脖子的往事

形上谓道
2026-01-15 21:28:57
1988年,我军在老山截获越南绝密电报,求救信息令首长大吃一惊

1988年,我军在老山截获越南绝密电报,求救信息令首长大吃一惊

南书房
2026-02-03 15:55:03
美国暗中使计,卢秀燕成最大变数,大陆一锤定音:就这事没得商量

美国暗中使计,卢秀燕成最大变数,大陆一锤定音:就这事没得商量

荷兰豆爱健康
2026-02-05 18:41:07
记者在街头采访年轻人“年薪20万属于什么水平”,得到的回答令人咋舌!

记者在街头采访年轻人“年薪20万属于什么水平”,得到的回答令人咋舌!

张晓磊
2025-10-31 09:44:39
立春:一个人转运,从叫醒自己开始

立春:一个人转运,从叫醒自己开始

洞见
2026-02-03 21:00:33
百回合赢17分,夺冠概率东部第1!骑士有多强?哈登这次真选对了

百回合赢17分,夺冠概率东部第1!骑士有多强?哈登这次真选对了

老梁体育漫谈
2026-02-04 23:10:13
危险信号!美国,惊天阴谋彻底曝光了!

危险信号!美国,惊天阴谋彻底曝光了!

大嘴说天下
2026-02-04 23:55:03
1657亿交易失控!巴拿马接管长和港口不到24小时,中方给出回应

1657亿交易失控!巴拿马接管长和港口不到24小时,中方给出回应

芯火相承
2026-02-04 14:06:49
老婆天天穿破洞丝袜,我不动声色,三天后送她一份大礼

老婆天天穿破洞丝袜,我不动声色,三天后送她一份大礼

民间精选故事汇
2026-02-05 18:03:01
纽约期金突破5030美元/盎司,日内涨1.62%

纽约期金突破5030美元/盎司,日内涨1.62%

每日经济新闻
2026-02-05 07:20:05
寒潮今夜开始袭击浙江!高山区大到暴雪,气温暴跌10℃+!最冷就在...

寒潮今夜开始袭击浙江!高山区大到暴雪,气温暴跌10℃+!最冷就在...

浙江天气
2026-02-05 17:11:24
2026-02-05 20:23:00
Java精选
Java精选
一场永远也演不完的戏
1771文章数 3859关注度
往期回顾 全部

科技要闻

美团7.17亿元收购叮咚买菜

头条要闻

普京计划上半年对中国进行访问 外交部回应

头条要闻

普京计划上半年对中国进行访问 外交部回应

体育要闻

奇才:我学生……独行侠:成交!

娱乐要闻

谢娜明年开演唱会:带老歌出来见见人

财经要闻

中美"只会有好消息" 经济冷暖看房价

汽车要闻

李想为全新L9预热 all in AI造更好的车

态度原创

教育
本地
时尚
亲子
公开课

教育要闻

阿联酋:以高等教育国际化破解人才瓶颈

本地新闻

围观了北京第一届黑色羽绒服大赛,我笑疯了

新年专场|| 你们都找我要链接的好物,这次终于补货了

亲子要闻

袋鼠妈妈陷“孕妇过敏”风波,宣称“准孕妇可用”打擦边球?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版