> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> パイプ演算子のドキュメント

# パイプ演算子

パイプ演算子を使用すると、[GoogleSQL のパイプ構文](https://research.google/pubs/sql-has-problems-we-can-fix-them-pipe-syntax-in-sql/)と同様に、クエリを上から下へ読める変換の線形チェーンとして記述できます。

```sql theme={null}
FROM orders
|> WHERE cancelled = 0
|> AGGREGATE sum(amount) AS total GROUP BY customer
|> ORDER BY total DESC
|> LIMIT 3
```

任意の `SELECT` クエリの後に、パイプ演算子を連鎖させることができます。各演算子は `|>` トークンで始まり、直前のクエリの結果を入力として受け取り、さらに1つの変換を適用します。各演算子内では、通常の ClickHouse 構文を使用します。

パイプ演算子は構文拡張です。各演算子は直前のクエリをサブクエリでラップするため、生成される AST はネストされたサブクエリで記述した同等のクエリの AST と同じになります。したがって、上記のクエリは次と同等です。

```sql theme={null}
SELECT * FROM
(
    SELECT customer, sum(amount) AS total FROM
    (
        SELECT * FROM
        (
            SELECT * FROM orders
        )
        WHERE cancelled = 0
    )
    GROUP BY customer
)
ORDER BY total DESC
LIMIT 3
```

<div id="from-queries">
  ## FROM クエリ
</div>

クエリは `FROM` 句から開始でき、このようなクエリでは `SELECT` 句は任意です。`SELECT` 句を省略した場合、`SELECT *` が記述されているものとしてクエリが実行されます。

```sql theme={null}
FROM orders;
FROM orders WHERE amount > 100;
FROM orders |> WHERE amount > 100;
```

テーブルの別名は、通常の `SELECT` クエリの `FROM` 句と同様に、`AS` キーワードありでもなしでも記述できます: `FROM orders o WHERE o.amount > 100`。唯一の例外は、`select` という単語だけを別名として記述する場合です。テーブルの後に `select` を記述すると、別名ではなく明示的な `SELECT` 句の開始として扱われます。`select` という名前のテーブル自体は影響を受けず、独自の別名を保持できます: `FROM select s WHERE s.id = 1`。

最後のテーブルのサンプルオフセットがクエリレベルの `OFFSET` とも解釈できる場合、`SELECT` 句は省略できません。これは、`FROM t SAMPLE 1/10 OFFSET 5` では `OFFSET` が `SAMPLE` に属する一方、`FROM t SAMPLE 1/10 SELECT * OFFSET 5` ではクエリレベルの `OFFSET` となるためです。両者を区別するには、明示的な `SELECT` が必要です。クエリレベルの `OFFSET` の前に置けない句でクエリが続く場合は曖昧さがないため、通常どおり `SELECT` 句は任意です: `FROM t SAMPLE 1/10 OFFSET 5 WHERE x > 0`, `FROM t SAMPLE 1/10 OFFSET 5 JOIN dim USING (id)`。

<div id="operators">
  ## 演算子
</div>

<div id="where">
  ### WHERE
</div>

`|> WHERE condition` は入力行をフィルタリングします。集約の後に適用した場合は、`HAVING` と同様に機能します。

```sql theme={null}
FROM orders
|> AGGREGATE sum(amount) AS total GROUP BY customer
|> WHERE total > 100
```

<div id="select">
  ### SELECT
</div>

`|> SELECT [DISTINCT] expr1 [AS alias1], ...` は、指定した式のみを出力カラムとして残します。

```sql theme={null}
FROM orders |> SELECT customer, amount * 2 AS doubled
```

通常のクエリの `SELECT` 句と同じ位置で、式リストの末尾にカンマを付けることができます。この場合、カンマの後にはクエリの終端または次の `|>` 演算子を続けられます: `FROM orders |> SELECT customer, amount, |> LIMIT 1`。同様のことが `EXTEND` 演算子および `AGGREGATE` 演算子にも当てはまります。

<div id="extend">
  ### EXTEND
</div>

`|> EXTEND expr1 [AS alias1], ...` は、指定した式を入力カラムに追加します。これは `SELECT *, expr1 AS alias1, ...` と同等です。

```sql theme={null}
FROM orders |> EXTEND amount * 10 AS big
```

<div id="set">
  ### SET
</div>

`|> SET column1 = expr1, ...` は、指定したカラムの値を置き換えます。これは `SELECT * REPLACE (expr1 AS column1, ...)` と同等です。

```sql theme={null}
FROM orders |> SET amount = amount + 1000
```

<div id="drop">
  ### DROP
</div>

`|> DROP column1, ...` は、指定したカラムを削除します。これは `SELECT * EXCEPT (column1, ...)` と同等です。

```sql theme={null}
FROM orders |> DROP cancelled
```

<div id="as">
  ### AS
</div>

`|> AS alias` は次の演算子の入力に別名を付け、その演算子内から参照できるようにします。主に JOIN で使用します：

```sql theme={null}
FROM orders
|> AGGREGATE sum(amount) AS total GROUP BY customer
|> AS agg
|> JOIN orders AS o ON agg.customer = o.customer
```

<div id="aggregate">
  ### AGGREGATE
</div>

`|> AGGREGATE agg1 [AS alias1], ... [GROUP BY expr1 [AS alias1], ...]` は入力行を集計します。出力カラムは、グループ化に使用したカラムの後に集計カラムが続きます。`GROUP BY` を指定しない場合、入力全体が1行に集計されます。

```sql theme={null}
FROM orders |> AGGREGATE count() AS c, sum(amount) AS total GROUP BY customer;
FROM orders |> AGGREGATE count() AS c;
```

<div id="distinct">
  ### DISTINCT
</div>

`|> DISTINCT` は重複行を除外します。これは `SELECT DISTINCT *` と同等です。

<div id="order-by">
  ### ORDER BY
</div>

`|> ORDER BY expr1 [ASC/DESC], ...` は入力行をソートします。`ORDER BY ALL`、`WITH FILL`、`INTERPOLATE` を含め、`ORDER BY` 句の完全な構文がサポートされています。

```sql theme={null}
FROM orders |> ORDER BY amount DESC;
FROM orders |> SELECT customer, amount |> ORDER BY ALL;
FROM points |> ORDER BY x WITH FILL FROM 1 TO 10 INTERPOLATE (y AS y + 1)
```

<div id="limit-and-offset">
  ### LIMIT と OFFSET
</div>

`|> LIMIT length [OFFSET offset]` および `|> OFFSET offset` は、返される行数を制限します。

```sql theme={null}
FROM orders |> ORDER BY amount DESC |> LIMIT 3 OFFSET 1
```

<div id="join-and-array-join">
  ### JOIN と ARRAY JOIN
</div>

`|> [GLOBAL] [ANY/ALL/ASOF/SEMI/ANTI] [INNER/LEFT/RIGHT/FULL/CROSS] JOIN table [ON expr | USING (columns)]` は、入力を別のテーブル、サブクエリ、またはテーブル関数と結合します。すべての種類の [JOIN](/docs/ja/reference/statements/select/join) および [ARRAY JOIN](/docs/ja/reference/statements/select/array-join) がサポートされています。`FROM` 句と同様に、1 つの演算子に複数の JOIN を含めることができます。

```sql theme={null}
FROM customers
|> AS c
|> LEFT JOIN orders AS o ON c.name = o.customer
|> ARRAY JOIN tags
```

各演算子はそれぞれ新しいサブクエリのスコープとなるため、テーブル別名は同じ演算子内 (`ON` 条件内) でのみ参照できます。後続の演算子からは、`SELECT *` の後と同様に、JOIN 結果の結合後のカラムを参照できます。

クロス JOIN のカンマ表記もサポートされており、演算子への入力が左辺になります: `FROM customers |> AS c |> , orders`。ほかの JOIN と同様に、`joined_subquery_requires_alias` 設定が有効な場合は、入力に別名が必要です (デフォルトで有効です) 。

通常のクエリの `FROM` 句と同様に、`ARRAY JOIN` の直後ではカンマによるクロス JOIN はサポートされません。`ARRAY JOIN` の直後のカンマは、常にその式リストの一部として解釈されます。

<div id="union-intersect-and-except">
  ### UNION、INTERSECT、EXCEPT
</div>

`|> UNION [ALL/DISTINCT] (query1) [, (query2), ...]`、`|> INTERSECT [ALL/DISTINCT] ...`、`|> EXCEPT [ALL/DISTINCT] ...` は、入力と他のクエリの結果を結合します。

```sql theme={null}
FROM orders
|> SELECT customer
|> UNION ALL (FROM customers |> SELECT name)
|> DISTINCT
```

オペランドを囲む括弧は単一のクエリでは任意ですが、集合演算の後に別のパイプ演算子でチェーンを続ける場合は必須です。そうしないと、次の演算子が最後のオペランドに適用されるのか、結果全体に適用されるのかが不明確になります。

<div id="notes">
  ## 注記
</div>

* クエリの `WITH` 句は、スカラー別名と CTE のいずれについても、後続するすべてのパイプ演算子で引き続き可視です: `WITH 10 AS threshold FROM t |> WHERE x < threshold`。
* `INSERT ... SELECT` では、`INSERT` の前に記述した `WITH` 句は、生成される最も外側の `SELECT` に付加されます。手書きのネストされたサブクエリの場合と同様に、解釈時には `enable_global_with_statement` 設定 (デフォルトで有効) を介して内側のパイプステージにも適用されます。この設定が無効な場合、`INSERT` スコープの `WITH` に含まれる別名と CTE は、手書きのサブクエリ内で可視にならないのと同様に、パイプステージ内でも可視になりません。
* 他の `SELECT` クエリと同様に、パイプ演算子によって生成されたクエリの末尾には、その生成クエリに付加される `SETTINGS` 句を指定できます: `FROM t |> LIMIT 1 SETTINGS max_threads = 1` は `SELECT * FROM (SELECT * FROM t) LIMIT 1 SETTINGS max_threads = 1` と同じです。これは、サブクエリ、`CREATE VIEW`、`view` テーブル関数など、クエリ設定を個別に処理しない場所でも機能します。チェーン途中の `SETTINGS` 句はそのステージに残り、そのステージは次の演算子のサブクエリになります。括弧で囲まれたオペランドを持つ集合演算の後では、末尾に `SETTINGS` を指定できません。サブクエリを使用する同等のクエリでも、その位置に `SETTINGS` 句を指定することはできません。
* 最初のパイプ演算子より前のクエリにある `SETTINGS` 句はそのクエリに残り、そのクエリは生成されるラッパーのサブクエリになります。通常の設定は、サブクエリの解釈時にその設定が適用されるため、引き続き機能します。唯一の例外は、クエリアナライザを選択する設定の組である `enable_analyzer` とその別名 `allow_experimental_analyzer` です。これらはサブクエリ内で変更できないため、`SELECT number FROM numbers(1) SETTINGS enable_analyzer = 0 |> LIMIT 1` は `INCORRECT_QUERY` をスローします。これは、同等の手書きの `SELECT * FROM (SELECT number FROM numbers(1) SETTINGS enable_analyzer = 0) LIMIT 1` とまったく同じです。これら2つの設定は最後のパイプ演算子の後に記述するか、クエリの外部から渡してください。
* パイプ演算子は、集合演算を含め、その前にあるクエリ全体に結び付きます: `SELECT 1 UNION ALL SELECT 2 |> AGGREGATE count()` では、集約は `UNION ALL` の結果に適用されます。パイプ演算子の後に `UNION` でクエリを続けるには、`|> UNION` 演算子または括弧を使用します。
* パイプ演算子は、`SELECT` クエリが想定されるあらゆる場所で使用できます: サブクエリ、`INSERT ... SELECT` (`INSERT INTO t FROM src |> ...` 形式を含む) 、`CREATE VIEW`、`view` テーブル関数などです。
* カラム名をその場で変更する専用の演算子はありません。`|> SELECT * EXCEPT (old_name), old_name AS new_name`、または `SET` 演算子と `DROP` 演算子を使用してください。
