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

概要

 

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作为类型的名称,但它将其当作整数看待(这一点非常类似于MySQL)。真值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 <> FALSEOR 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来代替)。有趣的是,这些功能在下面提到的商用产品中还不可用。

99d5ce7985b340c6b9322b293f1aa65a.jpeg

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

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

窗口函数

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

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

4fe64fc290744d10be2e6cf552a3690b.jpeg

 0:没有变化

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

2:Range范围不接受关键字 (只支持unbounded和current row) SQLite对于窗口函数的支持在业界是领先的。它不支持的功能在其他一些主要产品中也同样不支持(在聚合中语句中的distinct,width_bucket, respect|ignore nulls和from first|last等语句)。

87378179d1e24de4abe2afb889168647.jpeg

 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 revenueEND) 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在这一点上能尽快做到。

9ad4e644355c47479be0ea2a8399e16e.jpeg

 Insert … on conflict (“Upsert”)

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

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

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

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

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

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

584900d841aa4d8eb457ac4a021a3823.jpeg

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

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

重命名列

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

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

ALTER TABLE … RENAME COLUMN … TO

95071a92bbb94d108340994e33a56c54.jpg

0:请查阅 sp_rename.

其他消息

在2018年,SQLite除了在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:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。

 

 

欢迎点赞收藏转发,感谢🙏

 
              -End-

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24750.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux找回用户密码

Linux中有两种用户模式&#xff0c;root用户和普通用户&#xff0c;这两种方法找回密码的方式各不相同&#xff0c;我们来分别在两种用户模式下完成找回密码的任务。 一.root用户找回密码 Linux拥有7个运行级别&#xff08;0&#xff1a;关机、1&#xff1a;单用户、2&#xf…

Postgresql忘记密码,如何重置密码

一、前言 系统&#xff1a;windows系统 64位 Postgresql 版本&#xff1a;Postgresql 14 今天想测试一个PostgresSQL语法的 SQL&#xff0c;但是打开PostgresSQL之后沉默了。密码是什么&#xff1f; 想来当初知识安装随便玩一下&#xff0c;也没有太留意记一下密码&#xff0c;…

Centos8忘记密码了怎么办?Centos8修改密码超详细超实用方法

1. 重启Centos8&#xff0c;出现以下内容时赶紧按几下“上下方向键PgUp和PgDn”&#xff08;首先要确保鼠标在界面内&#xff09;&#xff0c;使其停留在这个界面&#xff0c;然后选中第一行。 2. 按键盘上的“e”&#xff0c;进入编辑模式&#xff08;edit select item&#…

Linux忘记密码的找回方法

(1)在登录前的界面按下“e”编辑&#xff0c;如图&#xff1a; &#xff08;2&#xff09;找到linux16所在的那一行的下面一行&#xff1a;&#xff08;如果没找到linux16就按着键盘向下的箭头就能看见了&#xff09; &#xff08;3&#xff09;在UTF-8后面按下空格后加上这句话…

打开PPT的密码忘记了,如何找回?

PPT文件设置了打开密码&#xff0c;在打开PPT文件之后就会有提示框&#xff0c;需要输入PPT密码才能够打开PPT文件&#xff0c;但是我们如果忘记了PPT密码的话&#xff0c;那就没办法打开PPT文件了。 PPT文件如果设置了加密&#xff0c;一旦忘记密码&#xff0c;也只能通过找回…

PostgreSQL忘记密码

一、如果你忘记密码&#xff0c;而你曾经登录时保存过密码&#xff0c;按C:\Users\Terry Computer\AppData\Roaming\postgresql打开&#xff0c;其中Terry Computer是你的电脑名&#xff0c;AppData一般为隐藏项目。用记事本打开pgpass.conf就可以看到你保存过的用户名和密码。…

Linux(CentOS7)找回Root密码

1.开机之前&#xff0c;在这个界面按e&#xff0c;进入编辑模式(要快一点&#xff0c;不然就错过了) 2.然后进入这个界面后&#xff1a; 3.往下找到 以linux16开头的一段&#xff1a; 4.在UTF-8后面输入 init/bin/sh 输入完成后&#xff0c;直接按快捷键: Ctrlx 进入单用户模式…

Linux找回密码

Linux找回密码 1.开启的时候要尽快点击键盘上下键&#xff0c;选中上面一个&#xff0c;然后输入 e 2.然后点击键盘上下键&#xff0c;找到linux16开头这一行&#xff0c;在行的最后输入&#xff1a;init/bin/sh 3.接着&#xff0c;输入完成后&#xff0c;直接按快捷键&#…

第二届开源云原生开发者日招募令发布!(内含福利)

随着云技术的日渐成熟 云原生逐渐从“概念”层面转变为落地“应用” 开发者从传统繁复的代码工作中解放出来 从信息化执行转向数字创新 用技术视野更新业务模式 本届开源云原生开发者日&#xff08;Open Source Cloud Native Developer Day&#xff09;是微软 与 英特尔 联合发…

操作系统复习

这里写目录标题 操作系统复习一,引论1.3 os的基本特征&#x1f36a;并发共享虚拟异步之间的关系 1.4 操作系统运行环境硬件支持操作系统内核支撑功能资源管理功能 中断与异常 1.5 操作系统的主要功能&#x1f31d;处理机管理存储器管理设备管理文件管理接口管理用户接口程序接口…

AR智能眼镜会成未来趋势

简述 目前&#xff0c;5G时代已经开启&#xff0c;5G人工智能也给音视频产业发展带来许多新的课题。工信部电子信息司副司长乔跃山在会上表示&#xff0c;当前&#xff0c;音视频正在加快与人工智能、5G信息显示等领域的融合&#xff0c;不断催生新业态和商业模式&#xff0c;…

AR(增强现实)技术是什么,未来发展会怎样

目录 一、AR是什么&#xff1f;二、AR技术有什么用&#xff1f;三、AR技术未来的发展趋势 当代科技领域中&#xff0c;增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术正逐渐崭露头角&#xff0c;成为引领未来科技发展的一股重要力量。AR技术是一种通…

CREAL:为什么光场+HOE是AR眼镜未来

利用光场显示技术&#xff0c;CREAL曾展示出可自然变焦的3D显示效果。为了验证该技术在AR和VR场景的应用&#xff0c;该公司分别打造了两款头显原型。头显对于VR来讲比较常见&#xff0c;但对于AR来讲&#xff0c;眼镜形态才是未来的发展方向。因此&#xff0c;为了缩减AR硬件的…

增强现实(AR)智能眼镜的关键技术:标定、跟踪与交互

前言 增强现实AR智能眼镜是当前社会上比较主流的可穿戴AR设备&#xff0c;是除了手机和平板电脑之外最重要的增强现实支撑设备。前面的文章中&#xff0c;我们已经讨论过与光学透视型头戴显示器相关的标定技术&#xff0c;其实增强现实AR智能眼镜就是一种光学透视型的头戴显示…

继北极星项目后,又一款低成本AR眼镜开源方案:OpenAR

2018年的时候&#xff0c;Leap Motion&#xff08;Ultraleap前身&#xff09;曾开源了一款低成本、简易的AR头显方案&#xff1a;Project North Star&#xff08;北极星项目&#xff09;。该方案主要用来帮助爱好者、开发者们快速上手AR开发&#xff0c;而无需购买HoloLens等昂…

AR眼镜走向独立,从一个配件开始

明敏 发自 凹非寺量子位 | 公众号 QbitAI AR要走远&#xff0c;能长久依赖手机这副拐杖吗&#xff1f;还是需要独立形态&#xff0c;拥有自身的内容生态圈&#xff1f;这次&#xff0c;一个巴掌大小的配件&#xff0c;突破了人们对于AR作为移动计算平台的想象。此前是“端”&am…

wGlasses AR智能眼镜正式发布!影育科技带来端云协同、软硬件及资源零代码、一体化的AR生态科技盛宴!

3月21日14:30时&#xff0c;影育科技在中国虚拟现实与元宇宙产业峰会大会上成功举办了2023年“三品同发”新品发布会。 发布会上&#xff0c;影育科技展示了其自主研发的硬件、软件与元宇宙教育资源&#xff0c;聚焦“室内一小时”场景&#xff0c;提出了“三位一体”的解决方案…

ChatGPT如何帮助增强现实(AR)技术?

AR是一种将现实世界信息和虚拟世界信息“无缝”集成的新技术&#xff0c;它把原本在现实世界的一定旪间空间范围内很难体验到的实体信息&#xff08;视觉、听觉、味觉、触觉、嗅觉等信息&#xff09;&#xff0c;通过计算机等科学技术&#xff0c;模拟仿真后再叠加到现实世界&a…

你是否了解AR技术?AR技术就在我们身边

文章目录 专栏导读1、前言2、AR技术原理3、游戏领域应用4、教育领域应用5、医疗领域应用6、零售领域应用 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&#xff0c;本专…

【活动】AR技术在各行各业的应用

目录 写在前面 一、应用领域 1 AR技术应用于旅游领域 2 AR技术应用于教育领域 3.AR技术应用于医疗领域 4 AR技术应用于娱乐领域 5 AR技术应用于广告领域 二、我的体验 三、总结 写在前面 随着科技的不断进步和发展&#xff0c;人们对于创新科技的探索和应用也越发深…