El SQL estándar más reciente: vista previa de las nuevas características de 2023

Los estándares SQL se publican cada pocos años, y el último, SQL:2023, se ha escrito y se espera que se publique pronto.

Este artículo le brinda una breve introducción a las características de tipo en el último estándar, que se dividen principalmente en las siguientes tres categorías:

  1. Mejoras al lenguaje SQL existente;
  2. Nuevas funciones relacionadas con JSON;
  3. Se agregó el lenguaje de consulta del gráfico de propiedades.

Todas las funciones nuevas de esta versión son funciones opcionales.

mejoras de SQL

Valor nulo en restricción ÚNICA (F292)

Esta función se usa para definir si se permiten múltiples valores nulos en restricciones únicas. Por ejemplo:

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);  -- ?

La pregunta es si la segunda declaración de inserción violaría la restricción única.

Obviamente, los estándares existentes no tienen una definición clara. Para solucionar este problema, el nuevo estándar añade una opción. Por ejemplo:

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);  -- 正确

al mismo tiempo,

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);  -- 错误

La opción NULLS DISTINCT trata múltiples valores nulos como datos diferentes, por lo que no viola la restricción de unicidad; la opción NULLS NOT DISTINCT trata múltiples valores nulos como los mismos datos, por lo que viola la restricción de unicidad.

El valor predeterminado de esta opción depende de la implementación específica del producto de la base de datos, para que sea compatible con el comportamiento existente.

ORDENAR POR en una tabla agrupada (F868)

Veamos un ejemplo:

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;

El ejemplo anterior funciona bien en la mayoría de las implementaciones de SQL, pero el estándar no permite este tipo de consulta. Es decir, el estándar SQL no permite ordenar utilizando un campo de tabla de agrupación (product.product_code) que no aparece en la lista SELECT. El nuevo estándar permite que las implementaciones de SQL admitan explícitamente este comportamiento.

Como usuarios, no necesitamos preocuparnos por este problema.

Funciones MAYOR y MENOR (T054)

Esta característica agrega dos nuevas funciones escalares: MAYOR (valor máximo) y MENOR (valor mínimo). En lugar de las funciones agregadas MAX y MIN, devuelven los valores máximo y mínimo en un conjunto de parámetros. De hecho, muchas bases de datos han implementado estas dos funciones:

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

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

Función de relleno de cadenas (T055)

Esta característica agrega dos nuevas funciones de cadena: LPAD (Pad Left) y RPAD (Pad Right). Estas dos funciones también están implementadas en muchas bases de datos:

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

****12345.67

El carácter de relleno utilizado por defecto es un espacio.

Función TRIM de varios caracteres (T056)

La función de truncamiento de un solo carácter existente (TRIM({LEADING|TRAILING|BOTH} 'x' FROM val)) solo puede especificar que se trunque un solo carácter, pero la nueva función puede especificar que se trunquen varios caracteres, y la sintaxis es más conciso Por ejemplo:

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

Longitud máxima del tipo de cadena opcional (T081)

Esta característica permite no especificar la longitud máxima del tipo VARCHAR. Antes de esto, a menudo veíamos un valor de longitud grande especificado para admitir longitudes arbitrarias:

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

Los tipos de datos ahora se pueden especificar simplemente:

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

En este caso, la longitud máxima del campo depende de la implementación de la base de datos.

Identificación de bucle recursivo mejorado (T133)

La cláusula CYCLE es una función de consulta recursiva poco conocida que se puede usar para detectar recursividad cíclica:

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

Este método puede detectar si se produce una recurrencia de ciclo en función del campo id y establecer el campo is_cycle en el valor especificado.

Cuando el estándar SQL agregó bucles recursivos, todavía no había un tipo booleano, por lo que se usó una cadena. Ahora que el estándar SQL proporciona un tipo booleano, la consulta anterior se puede mejorar para:

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

Función CUALQUIER_VALOR (T626)

Esta nueva función agregada puede devolver cualquier valor no nulo de un conjunto de datos. Por ejemplo:

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;

La consulta anterior podría devolver (1 | 11), (1 | 22) o (1 | 33).

Constantes enteras que no sean decimales (T661)

Esta nueva función admite constantes enteras hexadecimales, octales y binarias.

SELECT 0xFFFF, 0o755, 0b11001111;

Guiones bajos en constantes numéricas (T662)

Esta función permite utilizar guiones bajos en constantes numéricas, lo que mejora la legibilidad.

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

Nuevas características en JSON

Tipo de datos JSON (T801)

El nuevo estándar agrega el tipo de datos JSON. Muchos productos de bases de datos ya ofrecen este tipo.

SQL:2016 solo admite la operación de datos JSON y los datos aún se almacenan en cadenas. La nueva funcionalidad también agrega algunas funciones relacionadas con JSON, como JSON_SERIALIZE, JSON_SCALAR e IS JSON.

Tipo de datos JSON mejorado (T802)

Esta característica puede especificar opciones adicionales para el tipo JSON. Específicamente, se puede especificar una detección de clave única, como JSON('...text...' WITH UNIQUE KEYS) .

JSON basado en cadenas (T803)

Esta función representa la cadena JSON en SQL:2016. Las funciones JSON proporcionadas por la base de datos (como JSON_OBJECT, JSON_OBJECTAGG, JSON_TABLE, etc.) pueden optar por admitir datos JSON en formato de cadena o tipo de datos JSON nativo, o ambos.

Constantes enteras hexadecimales en rutas SQL/JSON (T840)

Esta característica permite el uso de constantes enteras hexadecimales en el lenguaje de ruta SQL/JSON.

Aunque no forma parte de esta función, el estándar SQL ahora admite JavaScript (ECMAScript) en forma de extensiones, por lo que no es necesario actualizar el estándar SQL cada vez que se actualiza ECMAScript. Por lo tanto, las rutas SQL/JSON ahora también pueden admitir otras constantes numéricas en el ECMAScript más reciente, como enteros binarios y separadores de guiones bajos.

Accesores simplificados de SQL/JSON (T860-T864)

La función Accesor simplificado permite el acceso a tipos compuestos y de matrices en datos JSON mediante la sintaxis de puntos y matrices. Por ejemplo, supongamos que el campo j es un tipo JSON que contiene los siguientes datos:

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

Podemos obtener la información en un campo usando el descriptor de acceso simplificado:

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

Métodos de elementos SQL/JSON (T865-T878)

Los métodos o funciones de elementos SQL/JSON se pueden usar en expresiones de ruta SQL/JSON para manipular valores de elementos. SQL:2016 ya define algunos de estos métodos, como abs(), floor(), size(). Los métodos recién agregados se utilizan principalmente para la conversión de tipos de datos:

  • T865: método de elemento SQL/JSON: bigint()
  • T866: Método de elemento SQL/JSON: booleano()
  • T867: Método de elemento SQL/JSON: fecha()
  • T868: Método de elementos SQL/JSON: decimal()
  • T869: método de elementos SQL/JSON: decimal() con precisión y escala
  • T870: Método de elementos SQL/JSON: entero()
  • T871: método de elemento SQL/JSON: número()
  • T872: método de elemento SQL/JSON: cadena()
  • T873: método de elemento SQL/JSON: hora()
  • T874: método de elemento SQL/JSON: time_tz()
  • T875: método de elemento SQL/JSON: precisión de tiempo
  • T876: método de elemento SQL/JSON: marca de tiempo()
  • T877: Método de elemento SQL/JSON: timestamp_tz()
  • T878: método de elemento SQL/JSON: precisión de marca de tiempo

Función de comparación de datos JSON (T879-T882)

Esta característica permite operaciones de comparación, clasificación y agrupación en tipos de datos JSON.

Lenguaje de consulta de gráficos de propiedades

Esta es una adición completamente nueva al estándar SQL: Consultas de gráficos de propiedades (SQL/PGQ). Esta nueva función admite la consulta de datos en tablas utilizando bases de datos de gráficos.

El lenguaje de consulta de gráficos de propiedades completas es complejo, aquí hay un ejemplo simple:

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;

En el ejemplo anterior, las claves foráneas deben definirse entre las tablas, de modo que la definición del mapa de propiedades pueda determinar la relación entre ellas, o la relación entre las tablas se puede especificar cuando se define el mapa de propiedades.

Supongo que te gusta

Origin blog.csdn.net/horses/article/details/129994705
Recomendado
Clasificación