> ## 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.

# 其他查询语言

> 在 ClickHouse 中使用其他查询语言

export const ExperimentalBadge = () => {
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#experimental-features" className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Experimental 功能
        </a>;
};

除标准 SQL 外，ClickHouse 还支持多种可用于数据查询的其他查询语言。

当前支持的 方言 如下：

* `clickhouse`：ClickHouse 默认的 [SQL 方言](/zh/chdb/reference/sql-reference)
* `prql`：[管道式关系查询语言 (PRQL)](https://prql-lang.org/)
* `kusto`：[Kusto 查询语言 (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query)
* `trino`：[Trino SQL](https://trino.io/docs/current/language.html)

使用哪种查询语言由 `dialect` 设置控制。

<h2 id="standard-sql">
  标准 SQL
</h2>

标准 SQL 是 ClickHouse 的默认查询语言。

```sql theme={null}
SET dialect = 'clickhouse'
```

<h2 id="pipelined-relational-query-language-prql">
  管道式关系查询语言 (PRQL)
</h2>

<ExperimentalBadge />

要启用 PRQL：

```sql theme={null}
SET allow_experimental_prql_dialect = 1; -- 此 SET 语句仅在 ClickHouse v25.1 及以上版本中需要
SET dialect = 'prql'
```

PRQL 查询示例：

```prql theme={null}
from trips
aggregate {
    ct = count this
    total_days = sum days
}
```

ClickHouse 在底层通过将 PRQL 转译为 SQL 来运行 PRQL 查询。

<h2 id="kusto-query-language-kql">
  Kusto 查询语言 (KQL)
</h2>

<ExperimentalBadge />

如需启用 KQL：

```sql theme={null}
SET allow_experimental_kusto_dialect = 1; -- 此 SET 语句仅适用于 ClickHouse 版本 >= 25.1
SET dialect = 'kusto'
```

```kql title="Query" theme={null}
numbers(10) | project number
```

```response title="Response" theme={null}
┌─number─┐
│      0 │
│      1 │
│      2 │
│      3 │
│      4 │
│      5 │
│      6 │
│      7 │
│      8 │
│      9 │
└────────┘
```

请注意，KQL 查询可能无法调用 ClickHouse 中定义的所有函数。

<h2 id="trino-sql">
  Trino SQL
</h2>

<ExperimentalBadge />

要启用 Trino 方言：

```sql theme={null}
SET enable_trino_dialect = 1;
SET dialect = 'trino'
```

Trino 特有的语法会被转换为 ClickHouse SQL，Trino 函数名则映射为对应的 ClickHouse 函数：

```sql title="Query" theme={null}
SELECT approx_distinct(x) FROM (VALUES 1, 2, 2) AS t(x)
```

```response title="Response" theme={null}
┌─uniq(x)─┐
│       2 │
└─────────┘
```

该转换涵盖 `ARRAY[...]` 字面量、`TRY_CAST`、`UNNEST` (转换为 `ARRAY JOIN`) 、
`ROW` 构造器与类型、`VALUES` 表、位于 `LIMIT` 之前的 `OFFSET`、`BETWEEN SYMMETRIC`，以及数百个
函数，其中包括那些在两个系统中同名但语义不同的函数 (例如，Trino 的 `length`
统计 Unicode 码点，因此被转换为 `lengthUTF8`) 。与 Trino 函数名不冲突的 ClickHouse 函数
依然可用，因此两类函数可以在同一个查询中混用。

Trino 的 `JSON` 值会映射为 ClickHouse 的 [`JSON`](/zh/reference/data-types/newjson) 类型：
`JSON '...'` 字面量和 `json_parse` 转换为对 `JSON` 的 cast，`json_format` 转换为 `toJSONString`，路径
函数 (`json_extract`、`json_extract_scalar`、`json_value`、`json_query`、`json_exists`、`json_size`) 则
转换为对应的 ClickHouse 函数。由于 ClickHouse 的 `JSON` 类型存储的是对象，非对象文档
(顶层数组和标量) 在被 materialize 为 `JSON` 值时会被拒绝；而路径函数可以接受
任意 JSON 文本。

部分 Trino 语义无法在转换后的查询文本中表达，转而应用于查询上下文：
OUTER JOIN 产生 `NULL` (`join_use_nulls`) 、set operations 使用数值 supertype 而非
`Variant` (`use_variant_as_common_type`) 、并且必须启用查询分析器 (`enable_analyzer`) 。查询中显式书写的
`SETTINGS` 子句仍会覆盖这些设置。

无法通过查询级转换修正的语义仍沿用 ClickHouse 的行为。其中最需要注意的是：
除法运算符 `/` 在 Trino 中执行整数除法，在 ClickHouse 中则执行浮点除法；并且
对于 `Float` 参数，ClickHouse 的 `round` 采用银行家舍入。

使用 `EXPLAIN SYNTAX` 可以查看查询的转换结果。
