テーブルからデータをクエリします。
適用エンジン
SELECT 構文は、LindormTable と LindormTSDB に適用されます。
制限事項
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句内の動的カラムの条件は HexStrings である必要があります。
動的カラムの詳細については、「動的カラム」をご参照ください。
GROUP BY句
LindormTable と LindormTSDB は、グループ化と集約のために GROUP BY句 をサポートしています。時空間関数は GROUP BY句 をサポートしていないことに注意してください。
ORDER BY句
クエリの結果セットをソートするために、1つ以上のカラムを指定します。
ORDER BY句 のカラム名が SELECT句 にも表示されていることを確認してください。そうでない場合、セマンティックチェックエラーが発生します。ORDER BY句 はエイリアスをサポートしていません。
LIMIT句
LIMIT句 は、ページングクエリに使用されます。LIMIT の後に単一の数値が続く場合、その数値は返される行数を示します。LIMIT の後にコンマ (,) で区切られた2つの数値 (例: LIMIT n, m) が続く場合、文は n行をスキップし、m行のデータを返します。[ LIMIT integer [OFFSET integer] は [LIMIT integer, integer] と同等です。
LIMIT句 で OFFSET を指定した場合でも、クエリは OFFSET によってスキップされたデータを取得します。過剰なクエリペイロードを回避するために、OFFSET 値を 5000 以下に設定してください。
ワイドテーブルで動的カラムが有効になっている場合、次の点に注意してください。
動的カラムを持つテーブルを
SELECT *でクエリする場合、文に LIMIT句 を追加する必要があります。これにより、結果セット内のメタデータの正確性が保証されます。動的カラムを持つテーブルに対する
SELECT *クエリの場合、LIMIT のデフォルトの最大値は 5000 です。値が最大値を超えると、エラーが報告されます。
HINT
LindormTable と LindormTSDB は、クエリプランを最適化したり、特定のクエリ機能を有効にしたりするためのヒントワードをサポートしています。詳細については、「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';条件付きクエリ
ID が
F07A1260のデバイスについて、リージョンが 'north-cn' で温度が 15度より高い場合、またはリージョンが 'south-cn' で温度が 10度より高く、湿度が NULL ではない場合の湿度をクエリします。
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');時空間関数を呼び出して条件付きクエリを実行します。次の3つの空間条件 (
ST_Contains、ST_DWithin、ST_DWithinSphere) については、効率的な実行がサポートされています。ST_Contains関数を使用して、指定された空間範囲内の点に対応するデータをクエリします。SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);ST_DWithin関数を使用して、重心から指定された平面距離内の点に対応するデータをクエリします。単位: 度。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);
非効率なクエリの強制実行
LindormTable が SELECT文 を非効率なクエリとして識別した場合、LindormTable はデフォルトではクエリを実行せず、例外をスローします。これにより、クエリが Lindorm のパフォーマンスと安定性に影響を与えるのを防ぎます。
非効率なクエリチェックをスキップし、クエリの実行を強制するには、クエリ文に /*+ _l_allow_filtering_ */ を追加します。
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity=20; SELECT クエリは、次のすべての条件を満たす場合に非効率と見なされます。
WHERE句 が、テーブルの最初のプライマリキーの上限と下限を指定していない。WHERE句 が、インデックステーブルの最初のインデックスキー列の上限と下限を指定していない。WHERE句 が、最初のプライマリキーまたは最初のインデックスキー列ではないカラムに対する条件を含んでいる。
非効率なクエリに関連する問題の解決方法については、「非効率なクエリの解決または回避方法」をご参照ください。