Tous les produits
Search
Centre de documentation

Lindorm:SELECT

Dernière mise à jour :Aug 11, 2026

Interroge les données d'une table.

Moteurs pris en charge

La syntaxe SELECT s'applique à LindormTable et LindormTSDB.

Limites

SELECT prend uniquement en charge les requêtes aplaties (sur une seule table). Les jointures entre plusieurs tables (JOIN) et les opérations sur les ensembles (UNION, INTERSECT) ne sont pas prises en charge.

Syntaxe

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

Remarques d'utilisation

Clause SELECT

La clause SELECT spécifie les colonnes, constantes et expressions de fonction à renvoyer. Utilisez AS pour définir un alias temporaire pour une colonne dans l'ensemble de résultats.

Clause WHERE

La clause WHERE spécifie les conditions de la requête.

Requêtes sur tables larges

Important

Pour éviter les requêtes inefficaces sur les tables larges, respectez les règles suivantes :

  • Utilisez uniquement la première colonne de clé primaire ou la première colonne d'index de la table d'index comme condition de requête, OU

  • Si vous devez filtrer sur toute autre colonne, définissez une borne supérieure et inférieure pour la première colonne de clé primaire ou la première colonne d'index. Les requêtes qui violent ces deux règles sont signalées comme inefficaces et bloquées par défaut. Pour forcer l'exécution d'une telle requête, ajoutez /*+ _l_allow_filtering_ */. Consultez Forcer une requête inefficace.

L'exemple suivant illustre la différence entre une requête efficace et une requête inefficace sur la table sensor, dont device_id est la première colonne de clé primaire :

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

Colonnes dynamiques

Si les colonnes dynamiques sont activées pour la table large :

  • Incluez les colonnes de clé primaire ou d'index dans la clause WHERE afin de garantir les performances de la requête.

  • Les conditions portant sur les colonnes dynamiques dans la clause WHERE doivent être des HexStrings.

Pour plus d'informations, consultez Colonnes dynamiques.

Clause ORDER BY

Spécifie une ou plusieurs colonnes pour trier l'ensemble de résultats.

Important
  • Chaque colonne de la clause ORDER BY doit également figurer dans la clause SELECT. Dans le cas contraire, une erreur de vérification sémantique se produit.

  • La clause ORDER BY ne prend pas en charge les alias.

Clause LIMIT

La clause LIMIT contrôle le nombre de lignes renvoyées et prend en charge les requêtes paginées.

Syntaxe Comportement
LIMIT n Renvoie n lignes
LIMIT n, m Ignore n lignes, puis renvoie m lignes
LIMIT m OFFSET n Équivalent à LIMIT n, m
Important
  • Maintenez la valeur OFFSET à 5 000 ou moins. Même avec un OFFSET, la requête récupère toujours en interne les lignes ignorées ; ainsi, des valeurs OFFSET élevées augmentent la charge de la requête.

  • Si les colonnes dynamiques sont activées, SELECT * nécessite une clause LIMIT pour garantir des métadonnées correctes dans l'ensemble de résultats. La limite maximale par défaut pour ce type de requêtes est de 5 000 ; dépasser cette valeur génère une erreur.

HINT

LindormTable et LindormTSDB prennent en charge les hints pour influencer les plans de requête ou activer des comportements de requête spécifiques. Pour plus de détails, consultez Présentation des HINTS.

Exemples

Les exemples de cette rubrique utilisent la table suivante :

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

Requêtes 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;

Exemples de fonctions spatio-temporelles :

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

Requêtes d'agrégation

Comptez tous les enregistrements pour l'appareil F07A1260 à un instant donné :

SELECT count(*) FROM sensor
WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';

Obtenez la température maximale pour l'appareil F07A1260 sur une plage horaire :

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';

Requêtes conditionnelles

Interrogez l'humidité pour l'appareil F07A1260 lorsque la région et la température satisfont des conditions composées, et que l'humidité n'est pas nulle :

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;

Interrogez les données de plusieurs appareils en utilisant IN :

SELECT * FROM sensor WHERE device_id IN ('F07A1260', 'F07A1261');

Requêtes conditionnelles spatio-temporelles — les trois conditions spatiales suivantes permettent une exécution efficace :

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

Forcer une requête inefficace

Lorsque LindormTable détecte qu'une instruction SELECT est inefficace, il bloque la requête par défaut et lève une exception. Cette mesure protège les performances globales du système.

Une requête est considérée comme inefficace lorsque toutes les conditions suivantes sont réunies :

  • La clause WHERE ne définit pas de borne supérieure et inférieure pour la première colonne de clé primaire.

  • La clause WHERE ne définit pas de borne supérieure et inférieure pour la première colonne d'index de la table d'index.

  • La clause WHERE filtre sur une colonne qui n'est ni la première colonne de clé primaire ni la première colonne d'index.

Pour ignorer la vérification et forcer l'exécution de la requête, ajoutez /*+ _l_allow_filtering_ */ :

SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity = 20;

Pour obtenir des conseils sur la résolution ou l'évitement des requêtes inefficaces, consultez Comment résoudre ou éviter les requêtes inefficaces.