查询表中的数据。
适用引擎
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子句的使用有以下注意事项:
GROUP BY子句
宽表引擎与时序引擎均支持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)
);简单查询
对
sensor表内容进行查询。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; --定义别名调用时空函数进行简单查询。时空函数的分类及介绍,请参见时空函数。
SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;
聚合查询
统计设备ID
F07A1260某一时刻上报的所有数据条数。
SELECT count(*) FROM sensor WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';查询设备ID
F07A1260在一段时间内的最大温度。
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度,湿度不为空的设备ID
F07A1260的湿度。
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为
F07A1260或F07A1261的数据。
SELECT * FROM sensor WHERE device_id IN ('F07A1260', 'F07A1261');调用时空函数进行条件查询,目前支持
ST_Contains、ST_DWithin、ST_DWithinSphere三种空间条件的高效执行。使用
ST_Contains函数查询给定空间范围内的点对应的数据。SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);使用
ST_DWithin函数查询与中心点在给定平面距离以内的点对应的数据。距离单位:degree。SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);使用
ST_DWithinSphere函数查询与中心点在给定球面距离以内的点对应的数据。距离单位:米。SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
强制执行低效查询
当执行SELECT语句被Lindorm宽表引擎识别为低效查询时,为了避免这类查询语句给Lindorm带来性能稳定性风险,Lindorm宽表引擎默认不允许执行该类查询,同时会抛出异常。
在查询语句中增加/*+ _l_allow_filtering_ */,表示跳过低效查询检测,强制执行低效查询。
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity=20; 如果SELECT查询的条件同时满足以下三个条件,则该查询语句被认为是低效查询语句。
WHERE语句中没有指定表的第一个主键的上下界。WHERE语句中没有指定索引表中第一个索引列的上下界。WHERE语句中存在非第一个主键(或非第一个索引列)的条件。
如果查询语句为低效查询语句,解决方法请参见如何解决或规避低效查询问题。