# SELECT

SELECTクエリはデータの取得を行います。デフォルトでは、要求されたデータはクライアントに返されますが、INSERT INTOと組み合わせて別のテーブルに転送することもできます。

構文

SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [COMPRESSION type [LEVEL level]] ]
[FORMAT format]

# SELECTクエリ

SELECT句で指定された式は、上記のクエリの各節の操作が完了した後に計算されます。これらの式は、結果の個々の行に適用されるかのように機能します。SELECT句の式に集計関数が含まれている場合、MyscalはGROUP BY集計中に集計関数とその引数として使用される式を処理します。

結果にすべての列を含めたい場合は、アスタリスク(*)記号を使用します。たとえば、SELECT * FROM ...のようにします。

SELECT * FROM insert_table
SELECT *
FROM insert_table
Query id: 16064ddb-762f-4faf-9932-7f026ebbd6a6
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
│ 3 │ b │ 1 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# ORDER BY句

クエリの任意の部分でシノニム(ASエイリアス)を使用することができます。

GROUP BY、ORDER BY、およびLIMIT BY句は、位置引数をサポートすることができます。したがって、たとえば、ORDER BY 1,2はテーブルの行を最初に第1列、次に第2列でソートします。上記のinsert_tableテーブルを使用した例を参照してください。

SELECT *
FROM insert_table
ORDER BY c ASC
Query id: 5976cd93-1714-466f-8acc-0a5b35efd22f
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 3 │ b │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# WHERE句

WHERE句を使用して値をフィルタリングすることができます。例えば:

SELECT *
FROM insert_table
WHERE a = '1'
Query id: 273ac209-c4ca-4459-8314-3542913882ea
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
└───┴───┴───┘
3 rows in set. Elapsed: 0.003 sec. 

# PREWHERE句

Prewhereは、フィルタリングを効率的に適用するための最適化です。明示的にPREWHERE句が指定されていなくても、デフォルトで有効になっています。これは、WHERE条件の一部を自動的にprewhereステージに移動することによって機能します。PREWHERE句の役割は、この最適化を制御するだけであり、デフォルトで行われる方法よりも優れた方法を知っている場合にのみ使用します。

prewhereの最適化では、最初にprewhere式の実行に必要な列のみが読み込まれます。その後、クエリの残りの部分を実行するために必要な他の列が読み込まれますが、prewhere式が少なくともいくつかの行に対してtrueであるブロックのみが読み込まれます。prewhere式がすべての行に対してfalseであるブロックが多くあり、prewhereがクエリの他の部分よりも少ない列を必要とする場合、これによりクエリの実行にディスクから読み込むデータがはるかに少なくなることがしばしばあります。

# Prewhereの手動制御

この句はWHERE句と同じ意味を持ちます。違いは、テーブルから読み込まれるデータです。クエリの一部の列で使用されるフィルトレーション条件を手動で制御する場合に使用します。これにより、読み込むデータの量が減少します。

クエリでは、PREWHEREとWHEREを同時に指定することができます。この場合、PREWHEREはWHEREの前に来ます。

optimize_move_to_prewhere設定が0に設定されている場合、WHEREからPREWHEREへの式の一部を自動的に移動するためのヒューリスティックスは無効になります。

クエリにFINAL修飾子がある場合、PREWHEREの最適化は常に正しくありません。optimize_move_to_prewhereとoptimize_move_to_prewhere_if_finalの両方の設定がオンになっている場合にのみ有効になります。

# その他

ベクトルに関連するSELECT文については、基本的なベクトル検索を参照してください

Last Updated: Sat Apr 13 2024 10:45:55 GMT+0000