Consulta datos de una tabla.
Motores compatibles
La sintaxis de SELECT aplica para LindormTable y LindormTSDB.
Límites
SELECT solo admite consultas planas (de una sola tabla). No es compatible con consultas de unión de varias tablas (JOIN) ni con consultas de conjuntos (UNION, INTERSECT).
Sintaxis
SELECT [hint_clause] ( select_clause | '*' )
FROM table_name
[ WHERE where_clause ]
[ GROUP BY group_by_clause ]
[ ORDER BY ordering_clause ]
[ LIMIT integer [OFFSET integer] ] | [LIMIT integer, integer]
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= column_name
| term
| function_name '(' [ selector ( ',' selector )* ] ')'
where_clause ::= relation ( AND|OR relation )*
relation ::= column_name operator term
|'(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKE
group_by_clause ::= column_name ( ',' column_name )*
ordering_clause ::= column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*
hint_clause::=/*+hint_items*/
hint_items::=hint_item(','hint_item)*
hint_item::=identifier('('hint_option(','hint_option)*')')
hint_option::=expression
Notas de uso
Cláusula SELECT
La cláusula SELECT especifica las columnas, constantes y expresiones de función que se devolverán. Use AS para definir un alias temporal para una columna en el conjunto de resultados.
Cláusula WHERE
La cláusula WHERE especifica las condiciones de la consulta.
Consultas de tablas anchas
Para evitar consultas ineficientes en tablas anchas, siga estas reglas:
Use únicamente la primera columna de clave primaria o la primera columna de índice de la tabla de índices como condición de consulta, O BIEN
Si necesita filtrar por cualquier otra columna, establezca un límite superior e inferior para la primera columna de clave primaria o la primera columna de índice. Las consultas que incumplan ambas reglas se marcan como ineficientes y se bloquean de forma predeterminada. Para forzar la ejecución de este tipo de consultas, agregue
/*+ _l_allow_filtering_ */. Consulte Force an inefficient query.
A continuación se muestra la diferencia entre una consulta eficiente y una ineficiente sobre la tabla sensor, cuya primera columna de clave primaria es device_id:
-- Allowed: first primary key column (device_id) is used as a condition
SELECT * FROM sensor WHERE device_id = 'F07A1260' AND humidity = 20;
-- Not allowed: no bound on device_id; filtering on a non-primary-key column only
-- This query is flagged as inefficient and blocked unless _l_allow_filtering_ is added.
SELECT * FROM sensor WHERE humidity = 20;
Columnas dinámicas
Si las columnas dinámicas están habilitadas para la tabla ancha:
Incluya columnas de clave primaria o de índice en la cláusula
WHEREpara garantizar el rendimiento de la consulta.Las condiciones sobre columnas dinámicas en la cláusula
WHEREdeben ser HexStrings.
Para obtener más información, consulte Dynamic columns.
Cláusula ORDER BY
Especifica una o más columnas para ordenar el conjunto de resultados.
Cada columna de la cláusula
ORDER BYtambién debe aparecer en la cláusula SELECT. De lo contrario, se genera un error de comprobación semántica.La cláusula
ORDER BYno admite alias.
Cláusula LIMIT
La cláusula LIMIT controla cuántas filas se devuelven y admite consultas paginadas.
|
Sintaxis |
Comportamiento |
|
|
Devuelve |
|
|
Omite |
|
|
Equivalente a |
Mantenga OFFSET en 5,000 o menos. Incluso con un OFFSET, la consulta recupera internamente las filas omitidas, por lo que los valores altos de OFFSET aumentan la sobrecarga de la consulta.
Si las columnas dinámicas están habilitadas,
SELECT *requiere una cláusula LIMIT para garantizar metadatos correctos en el conjunto de resultados. El valor máximo predeterminado de LIMIT para estas consultas es 5,000; si se supera este valor, se devuelve un error.
HINT
LindormTable y LindormTSDB admiten hints para influir en los planes de consulta o habilitar comportamientos específicos. Para obtener más detalles, consulte HINT overview.
Ejemplos
Los ejemplos de este tema utilizan la siguiente tabla:
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time BIGINT NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
Consultas simples
-- Select all columns
SELECT * FROM sensor;
-- Select specific columns
SELECT device_id, region, humidity FROM sensor;
-- Limit results with an offset (LIMIT 5, 20 is equivalent)
SELECT * FROM sensor WHERE device_id = 'F07A1260' LIMIT 20 OFFSET 5;
-- Define a column alias
SELECT count(*) AS countRow FROM sensor;
Ejemplos de funciones espaciotemporales:
-- Return the WKT representation of a geometry column
SELECT id, ST_AsText(g) FROM gps_data;
-- Return a buffered geometry
SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;
Consultas de agregación
Cuente todos los registros del dispositivo F07A1260 en un momento específico:
SELECT count(*) FROM sensor
WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';
Obtenga la temperatura máxima del dispositivo F07A1260 durante un intervalo de tiempo:
SELECT max(temperature) AS max_temp FROM sensor
WHERE device_id = 'F07A1260'
AND time >= '2021-04-22 15:33:00'
AND time < '2021-04-22 15:33:20';
Consultas condicionales
Consulte la humedad del dispositivo F07A1260 cuando la región y la temperatura cumplan condiciones compuestas, y la humedad no sea nula:
SELECT device_id, humidity FROM sensor
WHERE ((region = 'north-cn' AND temperature > 15)
OR (region = 'south-cn' AND temperature > 10))
AND device_id = 'F07A1260'
AND humidity IS NOT NULL;
Consulte datos de varios dispositivos mediante IN:
SELECT * FROM sensor WHERE device_id IN ('F07A1260', 'F07A1261');
Consultas condicionales espaciotemporales: las tres condiciones espaciales siguientes admiten una ejecución eficiente:
-- ST_Contains: points inside a polygon
SELECT id FROM gps_data
WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
-- ST_DWithin: points within a planar distance (unit: degrees)
SELECT id FROM gps_data
WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);
-- ST_DWithinSphere: points within a spherical distance (unit: meters)
SELECT id FROM gps_data
WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
Forzar una consulta ineficiente
Cuando LindormTable detecta que una instrucción SELECT es ineficiente, bloquea la consulta de forma predeterminada y genera una excepción. Esto protege el rendimiento general del sistema.
Una consulta se considera ineficiente cuando se cumplen todas las siguientes condiciones:
La cláusula
WHEREno establece un límite superior e inferior para la primera columna de clave primaria.La cláusula
WHEREno establece un límite superior e inferior para la primera columna de índice de la tabla de índices.La cláusula
WHEREfiltra por una columna que no es ni la primera columna de clave primaria ni la primera columna de índice.
Para omitir la comprobación y forzar la ejecución de la consulta, agregue /*+ _l_allow_filtering_ */:
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity = 20;
Para obtener orientación sobre cómo resolver o evitar consultas ineficientes, consulte How to resolve or avoid inefficient queries.