SELECT クエリ
SELECT
クエリはデータの取得を行います。デフォルトでは、要求されたデータはクライアントに返されますが、INSERT INTO と組み合わせることで、異なるテーブルへ転送することも可能です。
構文
全ての構文はオプションですが、SELECT
直後の表現リストは必須であり、詳細については 以下 で説明します。
各オプショナルな句の詳細は別々のセクションで扱い、実行順にリストされています。
- WITH句
- SELECT句
- DISTINCT句
- FROM句
- SAMPLE句
- JOIN句
- PREWHERE句
- WHERE句
- WINDOW句
- GROUP BY句
- LIMIT BY句
- HAVING句
- QUALIFY句
- LIMIT句
- OFFSET句
- UNION句
- INTERSECT句
- EXCEPT句
- INTO OUTFILE句
- FORMAT句
SELECT 句
表現は、SELECT
句で指定され、上記の構文での全ての操作が終了した後に計算されます。これらの表現は、結果のそれぞれの行に適用されるかのように動作します。SELECT
句の表現に集約関数が含まれている場合、ClickHouseは GROUP BY 集約中に集約関数とその引数として使用される表現を処理します。
結果に全てのカラムを含めたい場合は、アスタリスク(*
)を使用してください。例えば、SELECT * FROM ...
と記述します。
動的カラム選択
動的カラム選択(COLUMNS式とも呼ばれます)は、結果の特定のカラムをre2正規表現に一致させることができます。
例えば、次のようなテーブルを考えます:
以下のクエリは、名前に a
シンボルを含む全てのカラムからデータを選択します。
選択されたカラムはアルファベット順では返されません。
複数の COLUMNS
式をクエリ内で使用し、それに対して関数を適用することができます。
例えば:
COLUMNS
式によって返される各カラムは、関数の別々の引数として渡されます。また、関数がサポートしている場合は他の引数も関数に渡すことができます。関数を使用する際は注意してください。もし渡した引数の数が関数がサポートする数と一致しない場合、ClickHouseは例外をスローします。
例えば:
この例では、COLUMNS('a')
が2つのカラム aa
と ab
を返し、COLUMNS('c')
が bc
カラムを返します。+
演算子は3つの引数には適用できないため、ClickHouseは関連するメッセージを伴って例外をスローします。
COLUMNS
式に一致したカラムは異なるデータ型を持つことがあります。もし COLUMNS
がどのカラムにも一致せず、SELECT
の唯一の表現である場合、ClickHouseは例外をスローします。
アスタリスク
クエリの任意の部分に表現の代わりにアスタリスクを置くことができます。クエリが解析されると、アスタリスクは全テーブルカラムのリストに展開されます(MATERIALIZED
および ALIAS
カラムを除く)。アスタリスクを使用する場合が正当化されるのはほんの数ケースです:
- テーブルダンプを作成する場合。
- システムテーブルのようにカラムが少ないテーブルの場合。
- テーブル内のカラムについての情報を取得する場合。この場合は
LIMIT 1
を設定します。しかし、DESC TABLE
クエリを使用する方が良いです。 PREWHERE
を使用して少数のカラムに強いフィルタをかける場合。- サブクエリ内において(外部クエリに必要でないカラムがサブクエリから除外されるため)。
その他のすべてのケースでは、アスタリスクの使用は推奨されません。アスタリスクを使うことは、カラム指向DBMSの利点ではなく欠点だけをもたらすからです。言い換えれば、アスタリスクの使用は推奨されません。
極値
結果に加えて、結果カラムの最小値と最大値も取得できます。これを行うには、extremes 設定を 1 に設定します。最小値と最大値は数値型、日付、および時刻付きの日付に対して計算されます。他のカラムに対しては、デフォルトの値が出力されます。
追加で2行(それぞれ最小値と最大値)が計算されます。これらの追加行は、XML
、JSON*
、TabSeparated*
、CSV*
、Vertical
、Template
および Pretty*
形式で出力され、他の行とは別に出力されます。他のフォーマットでは出力されません。
JSON*
および XML
フォーマットでは、極値は別の 'extremes' フィールドに出力されます。TabSeparated*
、CSV*
および Vertical
フォーマットでは、行は主な結果の後に、そして 'totals' が存在する場合はその後に来ます。その前に空の行(他のデータの後)が置かれます。Pretty*
フォーマットでは、行は主な結果の後に別のテーブルとして出力され、もし存在すれば totals
の後に表示されます。Template
フォーマットでは、極値は指定されたテンプレートに従って出力されます。
極値は LIMIT
の前、ただし LIMIT BY
の後に計算されます。しかし、LIMIT offset, size
を使用する場合、offset
前の行も extremes
に含まれます。ストリームリクエストでは、結果には LIMIT
を通過した少数の行も含まれることがあります。
注意事項
クエリの任意の部分で同義語(AS
エイリアス)を使用できます。
GROUP BY
、ORDER BY
、および LIMIT BY
句は位置引数をサポートできます。これを有効にするには、enable_positional_arguments 設定をオンにします。例えば、ORDER BY 1,2
と記述すると、テーブルの行が最初のカラムで、次に2番目のカラムでソートされます。
実装の詳細
クエリが DISTINCT
、GROUP BY
、および ORDER BY
句及び IN
と JOIN
のサブクエリを省略する場合、クエリは完全にストリーム処理され、O(1) のRAMを使用します。さもなくば、適切な制限が指定されていない場合、クエリは多くのRAMを消費する可能性があります:
max_memory_usage
max_rows_to_group_by
max_rows_to_sort
max_rows_in_distinct
max_bytes_in_distinct
max_rows_in_set
max_bytes_in_set
max_rows_in_join
max_bytes_in_join
max_bytes_before_external_sort
max_bytes_ratio_before_external_sort
max_bytes_before_external_group_by
max_bytes_ratio_before_external_group_by
詳細については、「設定」セクションを参照してください。外部ソート(ディスクに一時テーブルを保存すること)や外部集計を使用することも可能です。
SELECT 修飾子
SELECT
クエリで以下の修飾子を使用できます。
APPLY
クエリの外部テーブル式から返された各行に対して関数を適用できるようにします。
構文:
例:
EXCEPT
結果から除外する1つ以上のカラム名を指定します。全ての一致するカラム名が出力から除外されます。
構文:
例:
REPLACE
1つ以上の表現エイリアスを指定します。各エイリアスは SELECT *
ステートメントのカラム名と一致しなければなりません。出力カラムリストでは、一致するエイリアスのカラムがその REPLACE
内の表現に置き換えられます。
この修飾子はカラムの名前や順序を変更するものではありませんが、値や値の型を変更することが可能です。
構文:
例:
修飾子の組み合わせ
各修飾子を個別に使用したり、組み合わせて使用できます。
例:
同じ修飾子を複数回使用する。
単一のクエリで複数の修飾子を使用する。
SELECTクエリにおけるSETTINGS
SELECT
クエリ内で必要な設定を指定できます。設定値はこのクエリにのみ適用され、クエリの実行後にデフォルトまたは前の値にリセットされます。
設定を行う他の方法については こちら を参照してください。
例