最新标准SQL:2023新特性预览

这篇具有很好参考价值的文章主要介绍了最新标准SQL:2023新特性预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SQL 标准每隔几年就会发布一次,最新的 SQL:2023 已经编写完成,预计很快就会发布。

本文给大家简单介绍一下最新标准中的型特性,主要分为以下三大类别:

  1. 已有 SQL 语言的增强;
  2. JSON 相关的新特性;
  3. 新增的属性图查询语言。

该版本新增功能都属于可选特性。

SQL 增强

UNIQUE 约束中的空值(F292)

这个功能用于定义唯一约束中是否允许多个空值。例如:

CREATE TABLE t1 (
    a int,
    b int,
    c int,
    UNIQUE (a, b, c)
);

INSERT INTO t1 VALUES (1, NULL, NULL);
INSERT INTO t1 VALUES (1, NULL, NULL);  -- ?

问题在于第二个插入语句是否会违法唯一约束。

显然,已有的标准没有明确的定义。为了解决这个问题,新标准增加了一个选项。例如:

CREATE TABLE t2 (
    a int,
    b int,
    c int,
    UNIQUE NULLS DISTINCT (a, b, c)
);

INSERT INTO t2 VALUES (1, NULL, NULL);
INSERT INTO t2 VALUES (1, NULL, NULL);  -- 正确

同时,

CREATE TABLE t3 (
    a int,
    b int,
    c int,
    UNIQUE NULLS NOT DISTINCT (a, b, c)
);

INSERT INTO t3 VALUES (1, NULL, NULL);
INSERT INTO t3 VALUES (1, NULL, NULL);  -- 错误

NULLS DISTINCT 选项将多个空值看作不同的数据,因此不会违反唯一约束;NULLS NOT DISTINCT 选项将多个空值看作相同的数据,因此违反了唯一约束。

该选项的默认值取决于数据库产品的具体实现,这样可以兼容已有的行为。

分组表中的 ORDER BY(F868)

我们来看一个示例:

CREATE TABLE product (
    product_id int PRIMARY KEY,
    product_name varchar,
    product_code varchar UNIQUE
);

CREATE TABLE product_part (
    product_id int,
    part_id int,
    num int,
    PRIMARY KEY (product_id, part_id)
);

SELECT product.product_id, sum(product_part.num)
FROM product JOIN product_part ON product.product_id = product_part.product_id
GROUP BY product.product_id
ORDER BY product.product_code;

以上示例在大多数 SQL 实现中都能正常工作,但是标准却不允许这种查询方式。也就是说,SQL 标准不允许使用没有出现在 SELECT 列表中的分组表字段(product.product_code)进行排序。新标准则允许 SQL 实现明确支持这种行为。

作为用户,我们并不需要关心这个问题。

GREATEST 和 LEAST 函数(T054)

这个功能增加了两个新的标量函数:GREATEST(最大值)以及 LEAST(最小值)。它们不是聚合函数 MAX 和 MIN,而是返回一组参数中的最大值和最小值。实际上很多数据库已经实现了这两个函数:

SELECT greatest(1, 2);  --> 2
SELECT least(1, 2);     --> 1

SELECT greatest(1, 2, 3);  --> 3
SELECT least(1, 2, 3);     --> 1

字符串填充函数(T055)

这个功能增加了两个新的字符串函数:LPAD(左侧填充)以及 RPAD(右侧填充)。这两个函数同样在很多数据库中已经有了实现:

SELECT lpad(cast(12345.67 as varchar), 12, '*');

****12345.67

默认使用的填充字符为空格。

多字符 TRIM 函数(T056)

已有的单字符截断函数(TRIM({LEADING|TRAILING|BOTH} ‘x’ FROM val))只能指定要截断的单个字符,新函数则可以指定多个需要截断的字符,而且语法更加简洁。例如:

SELECT ltrim('****12345.67', '*');

可选的字符串类型最大长度(T081)

这个功能允许不指定 VARCHAR 类型的最大长度。在此之前,我们经常会看到为了支持任意长度而指定一个很大的长度值:

CREATE TABLE t1 (
    a VARCHAR(1000),
    b VARCHAR(4000),
	...
);

现在可以简单的指定数据类型:

CREATE TABLE t1 (
    a VARCHAR,
    b VARCHAR,
	...
);

这种情况下,字段的最大长度取决于数据库实现。

增强的递归循环标识(T133)

CYCLE 子句是鲜为人知的一个递归查询功能,可以用于检测循环递归:

WITH RECURSIVE ... (
    SELECT ...
      UNION ALL
    SELECT ...
)
CYCLE id SET is_cycle TO 'Y' DEFAULT 'N' USING path;

这种方式可以基于 id 字段检测是否出现循环递归,并且将 is_cycle 字段设置为指定值。

当 SQL 标准增加递归循环时,还没有布尔类型,因此使用了一个字符串。如今 SQL 标准提供了布尔类型,因此上面的查询可以改进为:

WITH RECURSIVE ... (
    SELECT ...
      UNION ALL
    SELECT ...
)
CYCLE id SET is_cycle USING path;

ANY_VALUE 函数(T626)

这个新的聚合函数可以从一组数据中返回任意一个非空值。例如:

CREATE TABLE t1 (
    a int,
    b int
);

INSERT INTO t1 VALUES (1, 11), (1, 22), (1, 33);

SELECT a, any_value(b) 
FROM t1 
GROUP BY a;

以上查询可能会返回(1 | 11)、(1 | 22)或者(1 | 33)。

非十进制的整数常量(T661)

这个新功能支持十六进制、八进制以及二进制的整数常量。

SELECT 0xFFFF, 0o755, 0b11001111;

数字常量中的下划线(T662)

这个功能允许在数字常量中使用下划线,提高可读性。

SELECT ... WHERE a > 1_000_000;
UPDATE ... SET x = 0x_FFFF_FFFF ...

JSON 新功能

JSON 数据类型(T801)

新标准增加了 JSON 数据类型。许多数据库产品实际上已经提供了这个类型。

SQL:2016 只是支持了 JSON 数据的操作,数据仍然使用字符串存储。新的功能同时还增加了一些 JSON 相关的函数,例如 JSON_SERIALIZE、JSON_SCALAR 以及 IS JSON。

增强的 JSON 数据类型(T802)

这个功能可以为 JSON 类型指定额外的选项。具体来说,可以指定一个唯一键检测,例如 JSON(‘…text…’ WITH UNIQUE KEYS)。

基于字符串的 JSON(T803)

这个功能代表了 SQL:2016 中的字符串 JSON。数据库提供的 JSON 函数(例如 JSON_OBJECT、JSON_OBJECTAGG、JSON_TABLE 等)可以选择支持字符串格式的 JSON 数据还是原生的 JSON 数据类型,也可以支持两者。

SQL/JSON 路径中的十六进制整数常量(T840)

这个功能允许在 SQL/JSON 路径语言中使用十六进制整数常量。

虽然不属于这个功能,但是 SQL 标准现在允许以扩展插件的形式支持 JavaScript(ECMAScript),因此不需要每次 ECMAScript 更新时更新 SQL 标准。所以 SQL/JSON 路径现在也可以支持最新 ECMAScript 中的其他数字常量,例如二进制整数和下划线分隔符。

SQL/JSON 简化访问符(T860-T864)

“简化访问符”功能允许使用点号和数组语法访问 JSON 数据中的复合类型和数组类型。例如,假设字段 j 是一个 JSON 类型,包含以下数据:

{"foo": {"bar": [100, 200, 300]}, ...}

我们可以使用简化访问符获取字段中的信息:

SELECT t.j.foo.bar[2], ... 
FROM tbl t ...

SQL/JSON 元素方法(T865-T878)

SQL/JSON 元素方法或者函数可以在 SQL/JSON 路径表达式中使用,对元素值进行处理。SQL:2016 已经定义了一些这类方法,例如 abs()、floor()、size()。新增的方法主要用于数据类型转换:

  • T865: SQL/JSON item method: bigint()
  • T866: SQL/JSON item method: boolean()
  • T867: SQL/JSON item method: date()
  • T868: SQL/JSON item method: decimal()
  • T869: SQL/JSON item method: decimal() with precision and scale
  • T870: SQL/JSON item method: integer()
  • T871: SQL/JSON item method: number()
  • T872: SQL/JSON item method: string()
  • T873: SQL/JSON item method: time()
  • T874: SQL/JSON item method: time_tz()
  • T875: SQL/JSON item method: time precision
  • T876: SQL/JSON item method: timestamp()
  • T877: SQL/JSON item method: timestamp_tz()
  • T878: SQL/JSON item method: timestamp precision

JSON 数据比较功能(T879-T882)

这个功能允许针对 JSON 数据类型的比较、排序以及分组操作。

属性图查询语言

这是 SQL 标准中增加的一个全新部分:Property Graph Queries (SQL/PGQ)。这个新功能支持使用图数据库的方式查询表中的数据。

完整的属性图查询语言比较复杂,以下是一个简单的示例:

CREATE TABLE person (...);
CREATE TABLE company (...);
CREATE TABLE ownerof (...);
CREATE TABLE transaction (...);
CREATE TABLE account (...);

CREATE PROPERTY GRAPH financial_transactions
    VERTEX TABLES (person, company, account)
    EDGE TABLES (ownerof, transaction);

SELECT owner_name,
       SUM(amount) AS total_transacted
FROM financial_transactions GRAPH_TABLE (
  MATCH (p:person WHERE p.name = 'Alice')
        -[:ownerof]-> (:account)
        -[t:transaction]- (:account)
        <-[:ownerof]- (owner:person|company)
  COLUMNS (owner.name AS owner_name, t.amount AS amount)
) AS ft
GROUP BY owner_name;

以上示例中,表之间还需要定义外键,这样属性图定义才能确定它们之间的联系;或者也可以在属性图定义时指定表之间的联系。文章来源地址https://www.toymoban.com/news/detail-439071.html

到了这里,关于最新标准SQL:2023新特性预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin 1.9 新特性预览:data object (数据单例)

    data object (数据单例) 是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。启动预览需要在 gradle 中升级 KotlinCompileVersion: 接下来让我们看看它有哪些特点。 data object 相对于普通 object ,在调用 toString() 的时候,前者的可读性更好,输出类名,不再携带 HashC

    2024年02月12日
    浏览(38)
  • springboot 最新版本 及特性

    截至2024年2月23日,Spring Boot的最新版本是3.2.x系列,具体到3.2.0这个版本。以下是Spring Boot 3.2.0中的一些新特性和改进点: 系统要求 :Spring Boot 3.2.0要求Java 17或更高版本,并且兼容Java 21。 自动配置改进 :该版本对Spring Boot的核心功能——自动配置进行了增强,使其更加灵活和

    2024年04月23日
    浏览(24)
  • 最新WiFi标准—WiFi 7

    2022年11月,TP-Link发布了全球首款WiFi7路由器,虽然WiFi7噱头十足,但售价偏高,也让消费者处于观望态度,对于这款产品小编没什么好说的,毕竟它只是未来众多WiFi7路由器的一个,但是WiFi7还是值得说一说的。 WiFi 7 于2019 年初立项,协议组现命名为IEEE 802.11 EHT(Extreme HighTh

    2024年02月05日
    浏览(31)
  • 避坑宝典|win11升级最新预览体验版bug梳理

    如果看到这篇文章你的系统还没升级,不妨先看看已升级Win11的用户反馈和我本人遇到的坑,少走弯路,减少NG时间。 一、亲测win11升级的前世今生。 本次测试升级途径: 加入“windows预览体验计划”,通过dev通道升级; 本次测试升级过程: 加入“用户预览体验计划”后,

    2024年02月10日
    浏览(57)
  • 简单解决win11预览体验计划空白,升级最新版本Canary频道

    最近突然发现win11的预览计划打开什么都没有了,如下图所示: 在网上找了许多方法,很多并不能完全生效。 下面的是我认为比较简单有效的种解决办法:  准备文件蓝奏云  Win11预览计划Canary频道.zip - 蓝奏云 文件大小:184.5 K| https://wwga.lanzoum.com/iMmI00psncqf 1、打开开始菜单

    2023年04月25日
    浏览(60)
  • 深入了解5G终端射频标准中的频谱发射与互调特性

    前面的频谱发射我们已经学习了占用带宽、带外发射和杂散发射,今天是频谱发射的最后一部分内容: 互调 。在很多的标准规范中,都有互调测试的相关内容,但测试条件、测试要求和测试方法都不尽相同。我们可以不必纠结互调是否有某种固定的说法,而是关注和了解它

    2024年01月25日
    浏览(52)
  • SQL Server全套教程(基于SQL语句----预览版)

    数据库创建语法 数据库创建实例示范 解说: 按上图SQL语法即可以创建名为 Mi 的数据库,数据主文件 Mi_data.mdf ,以及数据日志文件 Mi_log.ldf 等 拓展(三种文件类型): .mdf 主数据文件 .ndf 次数据文件 .ndf 日志文件 数据库查看语法 数据库修改语法 解说: 查看数据库可以看到

    2023年04月08日
    浏览(35)
  • Java 21:最新特性、性能改进和语言发展

    🎉欢迎来到Java学习路线专栏~Java 21:最新特性、性能改进和语言发展 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有

    2024年02月05日
    浏览(40)
  • Flutter最新稳定版3.16 新特性介绍

    Flutter 3.16 默认采用 Material 3 主题,Android 平台预览 Impeller,DevTools 扩展等等 欢迎回到每季度一次的 Flutter 稳定版本发布,这次是 Flutter 3.16。这个版本将 Material 3 设为新的默认主题,为 Android 带来 Impeller 预览,支持为 DevTools 添加扩展等等!与此同时,我们还看到了Flutter Cas

    2024年02月04日
    浏览(40)
  • 走近JDK 17,探索最新Java特性,拥抱未来编程!

    大家好,我是小米,一个热爱技术分享的程序员。今天,我将为大家介绍一下JDK 17的新特性。JDK 17是Java开发工具包的一个重要版本,其中包含了许多令人激动的新功能和改进。在这篇文章中,我将详细介绍JDK 17中的各项特性,并说明它们在电商应用场景中的应用。 密封类(

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包