> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Alternative query languages

> Use alternative query languages in 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 feature
        </a>;
};

Besides standard SQL, ClickHouse supports various alternative query languages for querying data.

The currently supported dialects are:

* `clickhouse`: The default [SQL dialect](/chdb/reference/sql-reference) of ClickHouse
* `prql`: [Pipelined Relational Query Language (PRQL)](https://prql-lang.org/)
* `kusto`: [Kusto Query Language (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query)
* `trino`: [Trino SQL](https://trino.io/docs/current/language.html)

Which query language is used is controlled by setting `dialect`.

<h2 id="standard-sql">
  Standard SQL
</h2>

Standard SQL is the default query language of ClickHouse.

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

<h2 id="pipelined-relational-query-language-prql">
  Pipelined relational query language (PRQL)
</h2>

<ExperimentalBadge />

To enable PRQL:

```sql theme={null}
SET allow_experimental_prql_dialect = 1; -- this SET statement is required only for ClickHouse versions >= v25.1
SET dialect = 'prql'
```

Example PRQL query:

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

Under the hood, ClickHouse uses transpilation from PRQL to SQL to run PRQL queries.

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

<ExperimentalBadge />

To enable KQL:

```sql theme={null}
SET allow_experimental_kusto_dialect = 1; -- this SET statement is required only for ClickHouse versions >= 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 │
└────────┘
```

Note that KQL queries may not be able to access all functions defined in ClickHouse.

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

<ExperimentalBadge />

To enable the Trino dialect:

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

Trino-specific syntax is translated to ClickHouse SQL, and Trino function names are mapped to their ClickHouse equivalents:

```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 │
└─────────┘
```

The translation covers, among other things, `ARRAY[...]` literals, `TRY_CAST`, `UNNEST` (translated to `ARRAY JOIN`),
`ROW` constructors and types, `VALUES` tables, `OFFSET` before `LIMIT`, `BETWEEN SYMMETRIC`, and several hundred
functions, including the ones whose names exist in both systems with different semantics (for example, Trino `length`
counts Unicode code points and is translated to `lengthUTF8`). ClickHouse functions that do not collide with Trino
names remain accessible, so both function families can be mixed in one query.

Trino `JSON` values are mapped to the ClickHouse [`JSON`](/reference/data-types/newjson) type:
`JSON '...'` literals and `json_parse` become casts to `JSON`, `json_format` becomes `toJSONString`, and the path
functions (`json_extract`, `json_extract_scalar`, `json_value`, `json_query`, `json_exists`, `json_size`) are
translated to their ClickHouse counterparts. Since the ClickHouse `JSON` type stores objects, non-object documents
(top-level arrays and scalars) are rejected when they are materialized as `JSON` values; the path functions accept
any JSON text.

Some Trino semantics are not expressible in the translated query text; they are applied to the query context
instead: outer joins produce `NULL` (`join_use_nulls`), set operations use the numeric supertype rather than
`Variant` (`use_variant_as_common_type`), and the query analyzer is required (`enable_analyzer`). An explicit
`SETTINGS` clause in the query still takes precedence over these.

Semantics that cannot be fixed by a translation at the query level remain the ClickHouse ones. Most notably,
the division operator `/` performs integer division in Trino but floating-point division in ClickHouse, and
`round` uses banker's rounding in ClickHouse for `Float` arguments.

Use `EXPLAIN SYNTAX` to see how a query is translated.
