Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Consultas

Última actualización: Sep 03, 2026

Realtime Compute for Apache Flink es compatible con las consultas SQL nativas de Apache Flink. La siguiente gramática en forma de Backus-Naur (BNF) define el superconjunto de consultas SQL de streaming y por lotes compatibles.

query:
    values
  | WITH withItem [ , withItem ]* query
  | {
        select
      | selectWithoutFrom
      | query UNION [ ALL ] query
      | query EXCEPT query
      | query INTERSECT query
    }
    [ ORDER BY orderItem [, orderItem ]* ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start { ROW | ROWS } ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY]

withItem:
    name
    [ '(' column [, column ]* ')' ]
    AS '(' query ')'

orderItem:
    expression [ ASC | DESC ]

select:
    SELECT [ ALL | DISTINCT ]
    { * | projectItem [, projectItem ]* }
    FROM tableExpression
    [ WHERE booleanExpression ]
    [ GROUP BY { groupItem [, groupItem ]* } ]
    [ HAVING booleanExpression ]
    [ WINDOW windowName AS windowSpec [, windowName AS windowSpec ]* ]

selectWithoutFrom:
    SELECT [ ALL | DISTINCT ]
    { * | projectItem [, projectItem ]* }

projectItem:
    expression [ [ AS ] columnAlias ]
  | tableAlias . *

tableExpression:
    tableReference [, tableReference ]*
  | tableExpression [ NATURAL ] [ LEFT | RIGHT | FULL ] JOIN tableExpression [ joinCondition ]

joinCondition:
    ON booleanExpression
  | USING '(' column [, column ]* ')'

tableReference:
    tablePrimary
    [ matchRecognize ]
    [ [ AS ] alias [ '(' columnAlias [, columnAlias ]* ')' ] ]

tablePrimary:
    [ TABLE ] tablePath [ dynamicTableOptions ] [systemTimePeriod] [[AS] correlationName]
  | LATERAL TABLE '(' functionName '(' expression [, expression ]* ')' ')'
  | [ LATERAL ] '(' query ')'
  | UNNEST '(' expression ')'

tablePath:
    [ [ catalogName . ] databaseName . ] tableName

systemTimePeriod:
    FOR SYSTEM_TIME AS OF dateTimeExpression

dynamicTableOptions:
    /*+ OPTIONS(key=val [, key=val]*) */

key:
    stringLiteral

val:
    stringLiteral

values:
    VALUES expression [, expression ]*

groupItem:
    expression
  | '(' ')'
  | '(' expression [, expression ]* ')'
  | CUBE '(' expression [, expression ]* ')'
  | ROLLUP '(' expression [, expression ]* ')'
  | GROUPING SETS '(' groupItem [, groupItem ]* ')'

windowRef:
    windowName
  | windowSpec

windowSpec:
    [ windowName ]
    '('
    [ ORDER BY orderItem [, orderItem ]* ]
    [ PARTITION BY expression [, expression ]* ]
    [
        RANGE numericOrIntervalExpression {PRECEDING}
      | ROWS numericExpression {PRECEDING}
    ]
    ')'

matchRecognize:
    MATCH_RECOGNIZE '('
    [ PARTITION BY expression [, expression ]* ]
    [ ORDER BY orderItem [, orderItem ]* ]
    [ MEASURES measureColumn [, measureColumn ]* ]
    [ ONE ROW PER MATCH ]
    [ AFTER MATCH
      ( SKIP TO NEXT ROW
      | SKIP PAST LAST ROW
      | SKIP TO FIRST variable
      | SKIP TO LAST variable
      | SKIP TO variable )
    ]
    PATTERN '(' pattern ')'
    [ WITHIN intervalLiteral ]
    DEFINE variable AS condition [, variable AS condition ]*
    ')'

measureColumn:
    expression AS alias

pattern:
    patternTerm [ '|' patternTerm ]*

patternTerm:
    patternFactor [ patternFactor ]*

patternFactor:
    variable [ patternQuantifier ]

patternQuantifier:
    '*'
  | '*?'
  | '+'
  | '+?'
  | '?'
  | '??'
  | '{' { [ minRepeat ], [ maxRepeat ] } '}' ['?']
  | '{' repeat '}'

Identificadores

Las reglas de identificadores de Flink SQL difieren de Java en un aspecto importante: se permiten caracteres no alfanuméricos. En todos los demás aspectos, las reglas son las mismas que en Java:

  • Las definiciones de identificadores distinguen entre mayúsculas y minúsculas, independientemente de si el identificador está encerrado entre comillas inversas.

  • La coincidencia de identificadores distingue entre mayúsculas y minúsculas.

Ejemplo con un identificador no alfanumérico:

SELECT a AS `my field` FROM t

Constantes de cadena

Las constantes de cadena deben usar comillas simples ('), no comillas dobles (").

SELECT 'Hello World'

Para escapar una comilla simple dentro de una cadena, duplíquela:

Flink SQL> SELECT 'Hello World', 'It''s me';
+-------------+---------+
|      EXPR$0 |  EXPR$1 |
+-------------+---------+
| Hello World | It's me |
+-------------+---------+
1 row in set

Secuencias de escape Unicode

Para incluir valores Unicode en una constante de cadena, utilice el prefijo U& seguido de una secuencia de escape.

Método

Sintaxis

Ejemplo

Escape predeterminado (barra invertida)

U&'\<unicode>'

SELECT U&'\263A'

Carácter de escape personalizado

U&'<char><unicode>' UESCAPE '<char>'

SELECT U&'#263A' UESCAPE '#' — usa # como carácter de escape

Consultas compatibles

La siguiente tabla enumera todas las consultas compatibles con Apache Flink 1.15. Para consultar la referencia de una versión diferente de Flink, cambie de versión en el sitio web de Apache Flink.

Consulta

Referencia

Hints

SQL Hints

Cláusula WITH

Cláusula WITH

Cláusulas SELECT y WHERE

Cláusulas SELECT y WHERE

SELECT DISTINCT

SELECT DISTINCT

Funciones de ventana

Funciones con valor de tabla de ventanas (Windowing TVFs)

Agregación de ventana

Window aggregation

Agregación de grupo

Agregación de grupo

Agregación Over

Agregación Over

Join

Joins

Window join

Window join

Operaciones de conjuntos

Operaciones de conjuntos

Cláusula ORDER BY

Cláusula ORDER BY

Cláusula LIMIT

Cláusula LIMIT

Top-N

Top-N

Window Top-N

Window Top-N

Deduplicación

Deduplicación

Deduplicación de ventana

Deduplicación de ventana

Reconocimiento de patrones

Reconocimiento de patrones

Ejecución de consultas

En modo streaming, los flujos de entrada se dividen en dos categorías:

  • Los flujos sin actualizaciones contienen únicamente eventos de tipo INSERT.

  • Los flujos con actualizaciones contienen otros tipos de eventos. Los orígenes de captura de datos de cambio (CDC) producen flujos con actualizaciones. Ciertas operaciones de Flink, como la agregación de grupo y Top-N, también generan eventos de actualización internamente.

La mayoría de las operaciones que producen eventos de actualización dependen de operadores con estado, los cuales utilizan estado gestionado para rastrear las actualizaciones. Sin embargo, no todos los operadores con estado aceptan flujos con actualizaciones como entrada. Por ejemplo, la agregación Over y el Interval Join no admiten flujos con actualizaciones como entrada.

La siguiente tabla describe las características de ejecución de cada consulta compatible. Esta información aplica a Ververica Runtime (VVR) 6.0.X y versiones posteriores.

ConsultaOperador de ejecuciónUsa datos de estadoConsume flujos con actualizacionesGenera eventos de actualizaciónNotas
SELECT y WHERECalcNoSíNo—
Lookup JoinLookupJoinNo*SíNoPara VVR 8.0.1 y versiones posteriores: establecer table.optimizer.non-deterministic-update.strategy en TRY_RESOLVE habilita la resolución automática basada en estado de problemas de actualización no determinista. Establézcalo en IGNORE para deshabilitar el uso de estado. Cambiar este parámetro puede causar incompatibilidad y requerir la reejecución de la consulta.
Función de tablaCorrelateNoSíNo—
SELECT DISTINCTGroupAggregateSíSíSí—
Agregación de grupoGroupAggregate / LocalGroupAggregate / GlobalGroupAggregate / IncrementalGroupAggregateSí*SíSíEl operador de preagregación LocalGroupAggregate no utiliza datos de estado.
Agregación OverOverAggregateSíNoNo—
Agregación de ventanaGroupWindowAggregate / WindowAggregate / LocalWindowAggregate / GlobalWindowAggregateSí*Sí*No*LocalWindowAggregate no utiliza datos de estado. La compatibilidad con flujos de actualización difiere entre VVR y Apache Flink; consulte la sección "Comparación de la compatibilidad con flujos de actualización" del tema Window aggregation para obtener más detalles. Si la función de disparo anticipado o tardío (experimental) está habilitada, se generan eventos de actualización.
Join (join regular)JoinSíSíSí*Los joins externos (LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN) generan eventos de actualización.
Interval JoinIntervalJoinSíNoNo—
Temporal JoinTemporalJoinSíSíNo—
Window joinWindowJoinSíNoNo—
Top-NRankSíSíSíTop-N no admite clasificación por tiempo de procesamiento. Utilice funciones integradas como CURRENT_TIMESTAMP en su lugar.
Aviso

Especificar un campo de tiempo de procesamiento en la cláusula ORDER BY puede causar errores en los datos. Este problema no se reporta durante las verificaciones de sintaxis en VVR 8.0.7 y versiones anteriores.

Window Top-NWindowRankSíNoNo—
DeduplicaciónDeduplicateSíNoSí*El uso de la directiva Deduplicate Keep FirstRow con tiempo de procesamiento (Proctime) no genera eventos de actualización.
Deduplicación de ventanaWindowDeduplicateSíNoNo—
Nota

Los operadores sin estado transmiten los tipos de eventos sin modificarlos; los eventos de salida son del mismo tipo que los de entrada. Los operadores sin estado nunca generan eventos de actualización, independientemente de si la entrada es un flujo con actualizaciones.