查詢表中的資料。
適用引擎
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子句
指定一個列或多個列,對查詢結果集進行排序。
需確保
ORDER BY的列名出現在SELECT子句中,否則語義校正會出錯。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語句中存在非第一個主鍵(或非第一個索引列)的條件。
如果查詢語句為低效查詢語句,解決方案請參見如何解決或規避低效查詢問題。