> ## 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>
            Экспериментальная возможность
        </a>;
};

Помимо стандартного SQL, ClickHouse поддерживает различные альтернативные языки запросов для работы с данными.

В настоящее время поддерживаются следующие диалекты:

* `clickhouse`: Диалект [SQL](/ru/chdb/reference/sql-reference), используемый в ClickHouse по умолчанию
* `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`, `OFFSET` перед `LIMIT`, `BETWEEN SYMMETRIC`, а также несколько сотен
функций, включая те, имена которых есть в обеих системах, но с разной семантикой (например, в Trino `length`
считает кодовые точки Unicode и транслируется в `lengthUTF8`). Функции ClickHouse, имена которых не конфликтуют с
именами Trino, остаются доступными, поэтому оба семейства функций можно смешивать в одном запросе.

Значения `JSON` из Trino отображаются на тип ClickHouse [`JSON`](/ru/reference/data-types/newjson):
литералы `JSON '...'` и `json_parse` превращаются в приведение к `JSON`, `json_format` — в `toJSONString`, а функции
работы с путями (`json_extract`, `json_extract_scalar`, `json_value`, `json_query`, `json_exists`, `json_size`)
транслируются в свои аналоги в ClickHouse. Поскольку тип `JSON` в ClickHouse хранит объекты, документы, не являющиеся
объектами (массивы и скалярные значения верхнего уровня), отклоняются при материализации в виде значений `JSON`;
функции работы с путями принимают любой JSON-текст.

Некоторые особенности семантики Trino невозможно выразить в тексте транслированного запроса — вместо этого они
применяются к контексту запроса: внешние соединения дают `NULL` (`join_use_nulls`), операции над множествами используют
числовой супертип, а не `Variant` (`use_variant_as_common_type`), и требуется query analyzer (`enable_analyzer`). Явно
указанная в запросе секция `SETTINGS` по-прежнему имеет приоритет над этими значениями.

Семантика, которую нельзя исправить трансляцией на уровне запроса, остаётся семантикой ClickHouse. В первую очередь
это касается оператора деления `/`: в Trino он выполняет целочисленное деление, а в ClickHouse — деление с плавающей
точкой; кроме того, `round` в ClickHouse для аргументов типа `Float` использует банковское округление.

Используйте `EXPLAIN SYNTAX`, чтобы увидеть, как транслируется запрос.
