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

# Langages de requête alternatifs

> Utilisez des langages de requête alternatifs avec 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>
            Fonctionnalité expérimentale
        </a>;
};

Outre le SQL standard, ClickHouse prend en charge plusieurs langages de requête alternatifs pour interroger les données.

Les dialectes actuellement pris en charge sont :

* `clickhouse` : le [dialecte SQL](/fr/chdb/reference/sql-reference) par défaut de ClickHouse
* `prql` : [langage de requêtes relationnelles en pipeline (PRQL)](https://prql-lang.org/)
* `kusto` : [langage de requête Kusto (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query)
* `trino` : [Trino SQL](https://trino.io/docs/current/language.html)

Le langage de requête utilisé est déterminé par le paramètre `dialect`.

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

Le SQL standard est le langage de requêtes par défaut de ClickHouse.

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

<h2 id="pipelined-relational-query-language-prql">
  Langage de requêtes relationnelles en pipeline (PRQL)
</h2>

<ExperimentalBadge />

Pour activer PRQL :

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

Exemple de requête PRQL :

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

En coulisses, ClickHouse s’appuie sur une transpilation de PRQL en SQL pour exécuter les requêtes PRQL.

<h2 id="kusto-query-language-kql">
  Langage de requête Kusto (KQL)
</h2>

<ExperimentalBadge />

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

Notez que les requêtes KQL peuvent ne pas avoir accès à toutes les fonctions définies dans ClickHouse.

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

<ExperimentalBadge />

Pour activer le dialecte Trino :

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

La syntaxe propre à Trino est traduite en ClickHouse SQL, et les noms de fonctions Trino sont associés à leurs équivalents 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 │
└─────────┘
```

La traduction couvre, entre autres, les littéraux `ARRAY[...]`, `TRY_CAST`, `UNNEST` (traduit en `ARRAY JOIN`),
les constructeurs et types `ROW`, les tables `VALUES`, `OFFSET` avant `LIMIT`, `BETWEEN SYMMETRIC`, ainsi que plusieurs centaines de
fonctions, y compris celles dont les noms existent dans les deux systèmes avec une sémantique différente (par exemple, la fonction Trino `length`
compte les code points Unicode et est traduite en `lengthUTF8`). Les fonctions ClickHouse dont les noms n'entrent pas en conflit avec ceux de
Trino restent accessibles : les deux familles de fonctions peuvent donc être mélangées au sein d'une même requête.

Les valeurs `JSON` de Trino sont mises en correspondance avec le type ClickHouse [`JSON`](/fr/reference/data-types/newjson) :
les littéraux `JSON '...'` et `json_parse` deviennent des conversions vers `JSON`, `json_format` devient `toJSONString`, et les
fonctions de chemin (`json_extract`, `json_extract_scalar`, `json_value`, `json_query`, `json_exists`, `json_size`) sont
traduites en leurs équivalents ClickHouse. Comme le type `JSON` de ClickHouse stocke des objets, les documents qui ne sont pas des objets
(tableaux et scalaires de premier niveau) sont rejetés lorsqu'ils sont matérialisés en tant que valeurs `JSON` ; les fonctions de chemin acceptent
n'importe quel texte JSON.

Certains aspects de la sémantique de Trino ne peuvent pas être exprimés dans le texte de la requête traduite ; ils sont alors appliqués
au contexte de la requête : les jointures externes produisent `NULL` (`join_use_nulls`), les opérations ensemblistes utilisent le supertype numérique plutôt que
`Variant` (`use_variant_as_common_type`), et l'analyseur de requêtes est requis (`enable_analyzer`). Une clause
`SETTINGS` explicite dans la requête garde toutefois la préséance sur ces réglages.

La sémantique qui ne peut pas être corrigée par une traduction au niveau de la requête reste celle de ClickHouse. En particulier,
l'opérateur de division `/` effectue une division entière dans Trino, mais une division en virgule flottante dans ClickHouse, et
`round` utilise l'arrondi du banquier dans ClickHouse pour les arguments `Float`.

Utilisez `EXPLAIN SYNTAX` pour voir comment une requête est traduite.
