查询表中的数据。

适用引擎

SELECT语法适用于宽表引擎和时序引擎。

使用限制

Lindorm的SELECT语句仅支持扁平化的查询,不支持多表连接查询(JOIN)或集合查询(UNION、INTERSECT等)。

语法

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

使用说明

SELECT子句

SELECT子句指定了查询输出的列、常量和函数表达式。AS函数用于定义查询结果集中列的临时别名。

WHERE子句

WHERE子句用于指定查询条件。

宽表WHERE子句的使用有以下注意事项:

  • 建议按下列规则定义查询条件,避免低效查询。

    • 仅使用表的第一个主键列或索引表的第一个索引列作为查询条件。

    • 如果查询条件中包含了非第一个主键列(或非第一个索引列),需要定义表的第一个主键列(或索引表的第一个索引列)的上下界。

    如查询条件不符合上述规则,需使用 /*+ _l_allow_filtering_ */强制执行低效查询,示例请参见强制执行低效查询

  • 如果宽表开启了动态列:

    • 为了确保查询语句的性能WHERE子句中建议包含主键或索引列。

    • WHERE子句中动态列的条件需要为HexString。

    关于动态列的详情,请参见动态列

GROUP BY子句

宽表引擎与时序引擎均支持GROUP BY子句,用于分组聚合计算。

ORDER BY子句

指定一个列或多个列,对查询结果集进行排序。

LIMIT子句

LIMIT子句用于分页查询。LIMIT后只跟一个数字,表示返回的结果集行数。LIMIT后跟两个由英文逗号(,)分隔的数字,例如LIMIT n, m,表示跳过n行后,返回m行数据。[ LIMIT integer [OFFSET integer]等同于[LIMIT integer, integer]

重要
  • LIMIT子句指定OFFSET后,分页查询仍然会检索OFFSET跳过的数据。为避免查询负载过大,建议您将OFFSET的值设置在5000以内。

  • 如果宽表开启了动态列,请注意以下事项:

    • 使用SELECT *查询动态列表时,Lindorm SQL为了保证结果集元数据的正确性,需要在查询语句后加LIMIT。

    • 对于动态列表的SELECT *查询操作,LIMIT的默认最大值为5000,超过最大值会报错。

HINT

宽表引擎和时序引擎支持通过Hint优化查询计划或实现特定的查询功能。详情请参见HINT简介

示例

本文提供的示例基于CREATE TABLE文档和UPSERT文档的示例语句。

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

简单查询

SELECT * FROM sensor; --选择全部列
SELECT device_id,region,humidity FROM senor;  --选择部分列
SELECT * FROM sensor WHERE device_id = 'F07A1260' LIMIT 20 OFFSET 5; --等价于LIMIT 5,20
SELECT count(*) AS countRow FROM sensor; --定义别名

聚合查询

  • 统计设备IDF07A1260某一时刻上报的所有数据条数。

SELECT count(*) FROM sensor WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';
  • 查询设备IDF07A1260在一段时间内的最大温度。

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

条件查询

  • 查询region为'north-cn'且温度高于15度或region为'south-cn'且温度高于10度,湿度不为空的设备IDF07A1260的湿度。

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;
  • 查询设备ID为F07A1260F07A1261的数据。

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

强制执行低效查询

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