SQLite 3.39.0 发布,支持右外连接和全外连接

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite 3.39.0 发布,支持右外连接和全外连接相关的知识,希望对你有一定的参考价值。

大家好,我是只谈技术不剪发的 Tony 老师。

SQLite 开发团队于 2022 年 06 月 25 日发布了 SQLite 3.39.0 版本。该版本最大的更新就是支持 RIGHT OUTER JOIN 和 FULL OUTER JOIN,本文给大家逐一进行分析。

如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

右外连接和全外连接

一直以来,SQLite 都不支持右外连接和全外连接,SQLite 3.39.0 终于弥补上了这个缺陷。至此,SQLite 提供了 SQL 标准中所有的 JOIN 方式,mysql 需要加油了。


来看一个简单的示例:

sqlite> select sqlite_version();
3.39.0
sqlite> create table t1(id int);
sqlite> insert into t1 values(1),(2),(3);
sqlite> create table t2(id int, name text);
sqlite> insert into t2 values(1, 'one'),(4, 'four');
sqlite> select * from t1 left join t2 on t1.id=t2.id;
1|1|one
2||
3||
sqlite> select * from t2 right join t1 on t1.id=t2.id;
1|one|1
||2
||3
sqlite> select * from t1 full join t2 on t1.id=t2.id;
1|1|one
2||
3||
|4|four

IS [NOT] DISTINCT FROM

SQLite 3.39.0 还增加了两个新的二进制比较运算符:IS NOT DISTINCT FROMIS DISTINCT FROM

IS NOT DISTINCT FROM 等价于 IS 运算符,它们都和 = 运算符类似,但是支持 NULL 值的比较。例如:

sqlite> select 1=1, 1 IS 1, 1 IS NOT DISTINCT FROM 1;
1|1|1
sqlite> select NULL=NULL, NULL IS NULL, NULL IS NOT DISTINCT FROM NULL;
|1|1

与此类似,IS DISTINCT FROM 等价于 IS NOT 运算符。

新增的两个运算符和 SQL 标准以及 PostgreSQL 实现兼容。

C 接口增强

接口 sqlite3_vtab_distinct() 新增了一个返回码(3),表示查询同时使用了 DISTINCT 以及 ORDER BY 子句。

增加了一个新的接口 sqlite3_db_name(),用于返回数据库连接中的数据库名。

其他增强

UNIX 操作系统接口会在文件打开之前解析文件名中的所有符号链接,从而为数据库创建一个标准名称。

延迟视图的物化操作,直到真正需要时才物化,从而避免不必要的工作。

任何聚合查询中都可以使用 HAVING 子句,即使查询中没有 GROUP BY 子句。在之前的版本中,HAVING 子句必须和 GROUP BY 子句配套使用,不能单独出现。

大量微优化使得 CPU 周期整体减少了约 2.3%。

以上是关于SQLite 3.39.0 发布,支持右外连接和全外连接的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 3.39.0 发布,支持右外连接和全外连接

将具有右外连接的访问​​查询转换为 sqlite 查询

sqlite3 支持的关联查询

数据库连接

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)

2020.03.14 内连接与外连接的区别