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')
はカラム aa
および ab
を返し、COLUMNS('c')
は bc
カラムを返します。+
演算子は 3 引数には適用できないため、ClickHouse は関連するメッセージを伴って例外をスローします。
COLUMNS
表現に一致したカラムは、異なるデータ型を持つことがあります。COLUMNS
に一致するカラムがない場合、 SELECT
の唯一の式であれば、ClickHouse は例外をスローします。
アスタリスク
クエリの任意の部分に式の代わりにアスタリスクを置くことができます。クエリが分析されると、アスタリスクはすべてのテーブルカラムのリスト(MATERIALIZED
および ALIAS
カラムを除く)に展開されます。アスタリスクを使用することが正当化されるケースはごくわずかです:
- テーブルダンプを作成する場合。
- システムテーブルのようにカラムがごく少数のテーブルの場合。
- テーブルにどのカラムが含まれているかを取得する場合。この場合、
LIMIT 1
を設定します。しかし、DESC TABLE
クエリを使用する方が望ましいです。 PREWHERE
を使用して小数のカラムに対して強いフィルタリングが行われる場合。- サブクエリ内(外部クエリに不要なカラムはサブクエリから除外されるため)。
その他のすべてのケースでは、アスタリスクの使用を推奨しません。なぜなら、アスタリスクは列指向DBMSの欠点をもたらすだけで、利点を得ることはできないからです。言い換えれば、アスタリスクの使用は推奨されません。
極端値
結果に加えて、結果のカラムの最小値および最大値も取得できます。これを行うには、extremes 設定を 1 に設定します。最小値および最大値は、数値型、日付、および日時を持つ日付に対して計算されます。他のカラムについては、デフォルト値が出力されます。
さらに 2 行(最小値と最大値)が計算され、これらの追加の 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
はテーブル内の行を最初のカラム、次に第二のカラムで並べ替えます。
実装の詳細
クエリが 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 | 結果から除外するカラムの名前を一つ以上指定します。すべての一致するカラム名は出力から省略されます。 |
REPLACE | 一つ以上の式エイリアスを指定します。各エイリアスは SELECT * 文のカラム名と一致する必要があります。出力カラムリストでは、エイリアスに一致するカラムはその REPLACE の式によって置き換えられます。この修飾子はカラムの名前や順序を変えることはありません。ただし、値や値の型を変えることはできます。 |
修飾子の組み合わせ
各修飾子を個別に使用することも、組み合わせて使用することもできます。
例:
同じ修飾子を複数回使用する。
単一のクエリで複数の修飾子を使用する。
SELECT クエリでの SETTINGS
必要な設定を SELECT
クエリの中で直接指定できます。設定値はこのクエリにのみ適用され、クエリが実行された後にデフォルトまたは以前の値にリセットされます。
その他の設定方法については、こちらを参照してください。
真偽値の設定は、値の割り当てを省略する短縮構文を使用できます。設定名のみが指定される場合、自動的に 1
(真)に設定されます。
例