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 功能。
具体内容包括:
-
布尔字面量和判断 -
窗口函数 -
Filter子句 -
Insert … on conflict (“Upsert”) -
重命名列 -
在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这个判断语句很有用,它与比较操作的含义不一样:
我们来比较一下
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语句来分隔。
重命名列
SQLite引入的另一个特有功能是重命名基准数据库表中的列1。标准的SQL不支持此类功能2。
SQLite遵循其他产品常用的语法来重命名列:
ALTER TABLE … RENAME COLUMN … TO

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:据我所知,也许可以通过可更新视图或派生的列来模拟该功能。
原文:https://modern-sql.com/blog/2019-01/sqlite-in-2018
作者简介:Markus Winand 提供高效的 SQL 培训。他出版的著作《SQL Performance Explained》已经成为开发人员的标准读物。
本篇文章来源于微信公众号:程序IT圈
原创文章,作者:software,如若转载,请注明出处:https://www.sldh123.com/3106.html