SELECT 構文を使用して、テーブル内のデータをクエリできます。
適用エンジン
SELECT 構文は、LindormTable と LindormTSDB に適用できます。
制限
Lindorm の SELECT 構文は、複数のテーブルにまたがる結合クエリでは使用できません。
構文
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で動的列に指定されたクエリ条件は、16 進数文字列である必要があります。
動的列の詳細については、「動的列」をご参照ください。
GROUP BY
GROUP BY パラメーターは、LindormTable と LindormTSDB でサポートされています。このパラメーターを指定して、クエリ結果をグループ化および集計できます。
ORDER BY
ORDER BY パラメーターは、クエリ結果をソートする 1 つ以上の列を指定します。
LIMIT
LIMIT パラメーターは、クエリ結果をページごとに返すために使用されます。LIMIT パラメーターの後に 1 桁の数字が続く場合、その数字は各ページで返される行数を示します。LIMIT パラメーターの後にコンマ (,) で区切られた 2 つの数字が続く場合、最初の数字はオフセットを示し、2 番目の数字は各ページで返される行数を示します。LIMIT integer [OFFSET integer] 句は、LIMIT integer, integer 句と同じです。
LIMIT 句でオフセット値を指定した場合、オフセット値で指定されたスキップされた行は、ステートメントによって引き続きクエリされます。LindormTable ノードのワークロードを削減するために、オフセットを 5,000 以下の値に設定することをお勧めします。
ワイドテーブルで動的列が有効になっている場合は、次の点に注意してください。
SELECT *ステートメントは、動的列が有効になっているテーブルのデータをクエリするために使用されます。この場合、ステートメントの末尾に LIMIT 句を追加します。このようにして、Lindorm SQL は結果セットのメタデータの整合性を確保できます。動的列が有効になっているテーブルのデータをクエリするために指定された LIMIT 句を含む
SELECT *ステートメントを使用する場合、LIMIT のデフォルトの最大値は 5,000 です。最大値を指定できます。クエリされた値が最大値を超えると、エラーが返されます。
HINT
LindormTable と LindormTSDB では、ステートメントでヒントを使用して、クエリプランを最適化したり、特定のクエリ機能を使用したりできます。詳細については、「ヒント」をご参照ください。
例
次の例では、CREATE TABLE および UPSERT 構文のドキュメントに記載されている次のステートメントを実行して、サンプルテーブル sensor を作成します。
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 句は LIMIT 5,20 と同じです。
SELECT count(*) AS countRow FROM sensor; --結果の列のエイリアスを指定します。集計クエリの実行
特定の時点でデバイス
F07A1260によって報告されたすべてのデータレコードの数を測定します。
SELECT count(*) FROM sensor WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';指定された期間内のデバイス
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のデバイスの湿度をクエリします。デバイスは、次の条件のいずれかを満たす必要があります。1. 地域が north-cn で、温度が 15 度を超えている。2. 地域が south-cn で、温度が 10 度を超えており、湿度が空でない。
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');非効率的なクエリの強制実行
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity=20;