SELECT
説明
1つ以上のテーブル、ビュー、またはマテリアライズドビューからデータをクエリします。SELECT文は一般的に以下の句で構成されます。
- WITH
- WHEREと演算子
- GROUP BY
- HAVING
- UNION
- INTERSECT
- EXCEPT/MINUS
- ORDER BY
- LIMIT
- OFFSET
- Joins
- サブクエリ
- DISTINCT
- エイリアス
SELECTは独立した文としても、他の文にネストされた句としても機能します。SELECT句の出力は他の文の入力として使用できます。
StarRocksのクエリ文 は基本的にSQL92標準に準拠しています。ここではサポートされているSELECTの使用法について簡単に説明します。
NOTE
StarRocks内部テーブルのテーブル、ビュー、またはマテリアライズドビューからデータをクエリするには、これらのオブジェクトに対するSELECT権限が必要です。外部データソースのテーブル、ビュー、またはマテリアライズドビューからデータをクエリするには、対応するexternal catalogに対するUSAGE権限が必要です。
WITH
SELECT文の前に追加できる句で、SELECT内で複数回参照される複雑な式にエイリアスを定義します。
CRATE VIEWに似ていますが、句で定義されたテーブル名とカラム名はクエリ終了後に保持されず、実際のテーブルやVIEWの名前と競合しません。
WITH句を使用する利点は以下の通りです。
クエリ内の重複を減らし、便利でメンテナンスが容易です。
クエリの最も複雑な部分を別々のブロックに抽象化することで、SQLコードを読みやすく理解しやすくします。
例:
-- 外部レベルで1つのサブクエリを定義し、UNION ALLクエリの初期段階の一部として
-- 内部レベルで別のサブクエリを定義します。
with t1 as (select 1),t2 as (select 2)
select * from t1 union all select * from t2;
Join
ジョイン操作は、2つ以上のテーブルからデータを結合し、その中のいくつかのカラムの結果セットを返します。
StarRocksは、自己ジョイン、クロスジョイン、内部ジョイン、外部ジョイン、セミジョイン、アンチジョインをサポートしています。外部ジョインには、左ジョイン、右ジョイン、フルジョインが含まれます。
構文:
SELECT select_list FROM
table_or_subquery1 [INNER] JOIN table_or_subquery2 |
table_or_subquery1 {LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER]} JOIN table_or_subquery2 |
table_or_subquery1 {LEFT | RIGHT} SEMI JOIN table_or_subquery2 |
table_or_subquery1 {LEFT | RIGHT} ANTI JOIN table_or_subquery2 |
[ ON col1 = col2 [AND col3 = col4 ...] |
USING (col1 [, col2 ...]) ]
[other_join_clause ...]
[ WHERE where_clauses ]
SELECT select_list FROM
table_or_subquery1, table_or_subquery2 [, table_or_subquery3 ...]
[other_join_clause ...]
WHERE
col1 = col2 [AND col3 = col4 ...]
SELECT select_list FROM
table_or_subquery1 CROSS JOIN table_or_subquery2
[other_join_clause ...]
[ WHERE where_clauses ]
Self Join
StarRocksは自己ジョインをサポートしており、自己ジョインと自己ジョインです。例えば、同じテーブルの異なるカラムを結合します。
自己ジョインを識別する特別な構文は実際にはありません。自己ジョインのジョイン条件の両側は同じテーブルから来ます。
異なるエイリアスを割り当てる必要があります。
例:
SELECT lhs.id, rhs.parent, lhs.c1, rhs.c2 FROM tree_data lhs, tree_data rhs WHERE lhs.id = rhs.parent;
Cross Join
クロスジョインは多くの結果を生成する可能性があるため、クロスジョインは注意して使用する必要があります。
クロスジョインを使用する必要がある場合でも、フィルター条件を使用し、返される結果が少ないことを確認する必要があります。例:
SELECT * FROM t1, t2;
SELECT * FROM t1 CROSS JOIN t2;
Inner Join
内部ジョインは最もよく知られ、一般的に使用されるジョインです。2つの類似したテーブルの要求されたカラムから結果を返し、両方のテーブルのカラムが同じ値を含む場合に結合されます。
両方のテーブルのカラム名が同じ場合、完全な名前(table_name.column_nameの形式)を使用するか、カラム名にエイリアスを付ける必要があります。
例:
以下の3つのクエリは同等です。
SELECT t1.id, c1, c2 FROM t1, t2 WHERE t1.id = t2.id;
SELECT t1.id, c1, c2 FROM t1 JOIN t2 ON t1.id = t2.id;
SELECT t1.id, c1, c2 FROM t1 INNER JOIN t2 ON t1.id = t2.id;
Outer Join
外部ジョインは、左または右のテーブル、または両方のすべての行を返します。他のテーブルに一致するデータがない場合は、NULLに設定されます。例:
SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.id = t2.id;
SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.id = t2.id;
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.id;
同等ジョインと不等ジョイン
通常、ユーザーは最も等しいジョインを使用し、ジョイン条件の演算子が等号であることを要求します。
不等ジョインは、ジョイン条件で!=、等号を使用できます。不等ジョインは多くの結果を生成し、計算中にメモリ制限を超える可能性があります。
注意して使用してください。不等ジョインは内部ジョインのみをサポートします。例:
SELECT t1.id, c1, c2 FROM t1 INNER JOIN t2 ON t1.id = t2.id;
SELECT t1.id, c1, c2 FROM t1 INNER JOIN t2 ON t1.id > t2.id;
Semi Join
左セミジョインは、右テーブルのデータと一致する左テーブルの行のみを返します。右テーブルのデータと一致する行がいくつあっても関係ありません。
左テーブルのこの行は最大1回返されます。右セミジョインは同様に機能しますが、返されるデータは右テーブルです。
例:
SELECT t1.c1, t1.c2, t1.c2 FROM t1 LEFT SEMI JOIN t2 ON t1.id = t2.id;
Anti Join
左アンチジョインは、右テーブルと一致しない左テーブルの行のみを返します。
右アンチジョインはこの比較を逆にし、左テーブルと一致しない右テーブルの行のみを返します。例:
SELECT t1.c1, t1.c2, t1.c2 FROM t1 LEFT ANTI JOIN t2 ON t1.id = t2.id;
Equi-joinとNon-equi-join
StarRocksがサポートするさまざまなジョインは、指定されたジョイン条件に応じて、等価ジョインと非等価ジョインに分類されます。
Equi-joins | 自己ジョイン、クロスジョイン、内部ジョイン、外部ジョイン、セミジョイン、アンチジョイン |
---|---|
Non-equi-joins | クロスジョイン、内部ジョイン、左セミジョイン、左アンチジョイン、外部ジョイン |
-
Equi-joins
等価ジョインは、
=
演算子で2つのジョイン項目を結合するジョイン条件を使用します。例:a JOIN b ON a.id = b.id
. -
Non-equi-joins
非等価ジョインは、
<
,<=
,>
,>=
, または<>
などの比較演算子で2つのジョイン項目を結合するジョイン条件を使用します。例:a JOIN b ON a.id < b.id
. 非等価ジョインは等価ジョインよりも遅く実行されます。非等価ジョインを使用する際は注意をお勧めします。以下の2つの例は、非等価ジョインを実行する方法を示しています。
SELECT t1.id, c1, c2
FROM t1
INNER JOIN t2 ON t1.id < t2.id;
SELECT t1.id, c1, c2
FROM t1
LEFT JOIN t2 ON t1.id > t2.id;
ORDER BY
SELECT文のORDER BY句は、1つ以上のカラムの値を比較して結果セットをソートします。
ORDER BYは時間とリソースを消費する操作です。すべての結果を1つのノードに送信してマージしてからソートする必要があるためです。ソートはORDER BYのないクエリよりも多くのメモリリソースを消 費します。
したがって、ソートされた結果セットから最初のN
個の結果のみが必要な場合は、LIMIT句を使用してメモリ使用量とネットワークオーバーヘッドを削減できます。LIMIT句が指定されていない場合、デフォルトで最初の65535個の結果が返されます。
構文:
ORDER BY <column_name>
[ASC | DESC]
[NULLS FIRST | NULLS LAST]
ASC
は結果を昇順で返すことを指定します。DESC
は結果を降順で返すことを指定します。順序が指定されていない場合、デフォルトはASC(昇順)です。例:
select * from big_table order by tiny_column, short_column desc;
NULL値のソート順: NULLS FIRST
はNULL値が非NULL値の前に返されることを示します。NULLS LAST
はNULL値が非NULL値の後に返されることを示します。
例:
select * from sales_record order by employee_id nulls first;