> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/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
```

## FROM クエリ

クエリは `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`。

括弧内のサブクエリも `FROM` 句から開始できるため、`(from IN ('a'))` は曖昧になります。これは、`from` という名前のカラムに対する式 `from IN ('a')` とも、`IN` という名前のテーブル関数に対するサブクエリ `SELECT * FROM IN('a')` とも解釈できます。カラムとしての解釈の方が古くからあり、そちらが優先されます。つまり、括弧の内容が `from` という単語に続いて演算子が現れる式として解釈できる場合、それは常にその式であり、サブクエリにはなりません。もう一方の解釈にしたい場合は、`SELECT` 句を明示的に記述してください: `1 IN (SELECT * FROM in)`。

最後のテーブルのサンプルオフセットがクエリレベルの `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)`。

## 演算子

### WHERE

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

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

### SELECT

`|> 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` 演算子にも当てはまります。

### EXTEND

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

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

### SET

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

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

### DROP

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

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

### AS

`|> 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
```

### AGGREGATE

`|> 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;
```

### DISTINCT

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

### ORDER BY

`|> 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)
```

### LIMIT と OFFSET

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

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

### JOIN と ARRAY JOIN

`|> [GLOBAL] [ANY/ALL/ASOF/SEMI/ANTI] [INNER/LEFT/RIGHT/FULL/CROSS] JOIN table [ON expr | USING (columns)]` は、入力を別のテーブル、サブクエリ、またはテーブル関数と結合します。すべての種類の [JOIN](/ja/reference/statements/select/join) および [ARRAY JOIN](/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` の直後のカンマは、常にその式リストの一部として解釈されます。

### UNION、INTERSECT、EXCEPT

`|> 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
```

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

## 注記

* クエリの `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` 句はそのクエリに残り、そのクエリは生成されるラッパーのサブクエリになります。通常の設定は、サブクエリの解釈時にその設定が適用されるため、引き続き機能します。
* パイプ演算子は、集合演算を含め、その前にあるクエリ全体に結び付きます: `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` 演算子を使用してください。
