

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Commande SELECT dans Amazon QLDB
<a name="ql-reference.select"></a>

**Important**  
Avis de fin de support : les clients existants pourront utiliser Amazon QLDB jusqu'à la fin du support le 31 juillet 2025. Pour plus de détails, consultez [Migrer un registre Amazon QLDB vers Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/).

Dans Amazon QLDB, utilisez `SELECT` la commande pour récupérer les données d'une ou de plusieurs tables. Chaque `SELECT` requête dans QLDB est traitée dans le cadre d'une transaction et est soumise à [un](limits.md#limits.fixed) délai d'expiration de transaction.

L'ordre des résultats n'est pas spécifique et peut varier pour chaque `SELECT` requête. Vous ne devez pas vous fier à l'ordre des résultats pour aucune requête dans QLDB.

Pour savoir comment contrôler l'accès afin d'exécuter cette commande partiQL sur des tables spécifiques, consultez. [Commencer à utiliser le mode d'autorisation standard dans Amazon QLDB](getting-started-standard-mode.md)

**Avertissement**  
Lorsque vous exécutez une requête dans QLDB sans recherche indexée, une analyse complète de la table est déclenchée. partiQL prend en charge ces requêtes car il est compatible avec SQL. Cependant, *n'exécutez pas* d'analyses de tables pour les cas d'utilisation en production dans QLDB. L'analyse des tables peut entraîner des problèmes de performance sur les tables de grande taille, notamment des conflits de simultanéité et des délais d'expiration des transactions.  
Pour éviter de scanner des tables, vous devez exécuter des instructions contenant une clause de `WHERE` prédicat à l'aide d'un opérateur d'*égalité* sur un champ indexé ou un identifiant de document ; par exemple, `WHERE indexedField = 123` ou. `WHERE indexedField IN (456, 789)` Pour de plus amples informations, veuillez consulter [Optimisation des performances des requêtes](working.optimize.md).

**Topics**
+ [Syntaxe](#ql-reference.select.syntax)
+ [Paramètres](#ql-reference.select.parameters)
+ [Jointures](#ql-reference.select.joins)
+ [Limitations des requêtes imbriquées](#ql-reference.select.subqueries)
+ [Exemples](#ql-reference.select.examples)
+ [Exécution par programmation à l'aide du pilote](#ql-reference.select.driver)

## Syntaxe
<a name="ql-reference.select.syntax"></a>

```
SELECT [ VALUE ] expression [ AS field_alias ] [, expression, ... ]
FROM source [ AS source_alias ] [ AT idx_alias ] [ BY id_alias ] [, source, ... ]
[ WHERE condition ]
```

## Paramètres
<a name="ql-reference.select.parameters"></a>

**VALUE**  
Un qualificatif pour votre expression qui oblige la requête à renvoyer la valeur du type de données brutes, plutôt que la valeur soit encapsulée dans une structure de tuple.

***expression***  
Projection formée à partir du `*` caractère générique ou liste de projections d'un ou de plusieurs champs de document issus du jeu de résultats. Une expression peut être constituée d'appels à [Fonctions PartiQL](ql-functions.md) ou de champs modifiés par [Opérateurs PartiQL](ql-operators.md).

**EN TANT QUE *field\$1alias***  
(Facultatif) Alias temporaire défini par l'utilisateur pour le champ utilisé dans le jeu de résultats final. Le `AS` mot clé est facultatif.  
Si vous ne spécifiez pas d'alias pour une expression qui n'est pas un simple nom de champ, le jeu de résultats applique un nom par défaut à ce champ.

**À PARTIR DE *source***  
Source à interroger. Les seules sources actuellement prises en charge sont les noms de tables, les [jointures internes](#ql-reference.select.joins) entre les tables, les `SELECT` requêtes imbriquées (sous réserve de[Limitations des requêtes imbriquées](#ql-reference.select.subqueries)) et les appels de [fonctions d'historique](working.history.md) pour une table.  
Vous devez spécifier au moins une source. Les sources multiples doivent être séparées par des virgules.

**EN TANT QUE *source\$1alias***  
(Facultatif) Alias défini par l'utilisateur qui s'étend sur une source à interroger. Tous les alias de source utilisés dans la `WHERE` clause `SELECT` OR doivent être déclarés dans la `FROM` clause. Le `AS` mot clé est facultatif.

**À *idx\$1alias***  
(Facultatif) Alias défini par l'utilisateur qui se lie au numéro d'index (ordinal) de chaque élément d'une liste depuis la source. L'alias doit être déclaré dans la `FROM` clause à l'aide du `AT` mot clé.

**PAR *id\$1alias***  
(Facultatif) Alias défini par l'utilisateur qui est lié au champ de `id` métadonnées de chaque document du jeu de résultats. L'alias doit être déclaré dans la `FROM` clause à l'aide du `BY` mot clé. Cela est utile lorsque vous souhaitez projeter ou filtrer sur l'[ID du document](working.metadata.md) tout en interrogeant la vue utilisateur par défaut. Pour de plus amples informations, veuillez consulter [Utilisation de la clause BY pour demander l'ID du document](working.metadata.by-clause.md).

**OÙ *condition***  
Les critères de sélection et les critères de jointure (le cas échéant) pour la requête.

**Note**  
Si vous omettez la `WHERE` clause, tous les documents du tableau sont récupérés.

## Jointures
<a name="ql-reference.select.joins"></a>

Seules les jointures internes sont actuellement prises en charge. Vous pouvez écrire des requêtes de jointure internes à l'aide de la `INNER JOIN` clause explicite, comme suit. Dans cette syntaxe, `JOIN` doit être associé à`ON`, et le `INNER` mot-clé est facultatif.

```
SELECT expression
FROM table1 AS t1 [ INNER ] JOIN table2 AS t2
ON t1.element = t2.element
```

Vous pouvez également écrire des jointures internes en utilisant la syntaxe implicite, comme suit.

```
SELECT expression
FROM table1 AS t1, table2 AS t2
WHERE t1.element = t2.element
```

## Limitations des requêtes imbriquées
<a name="ql-reference.select.subqueries"></a>

Vous pouvez écrire des requêtes imbriquées (sous-requêtes) dans des `SELECT` expressions et dans `FROM` des sources. La principale restriction est que seule la requête la plus externe peut accéder à l'environnement de base de données global. Supposons, par exemple, que vous disposiez d'un registre contenant des tables `VehicleRegistration` et`Person`. La requête imbriquée suivante n'est pas valide car l'utilisateur interne `SELECT` essaie d'y accéder`Person`.

```
SELECT r.VIN,
    (SELECT p.PersonId FROM Person AS p WHERE p.PersonId = r.Owners.PrimaryOwner.PersonId) AS PrimaryOwner
FROM VehicleRegistration AS r
```

Alors que la requête imbriquée suivante est valide.

```
SELECT r.VIN, (SELECT o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner
FROM VehicleRegistration AS r
```

## Exemples
<a name="ql-reference.select.examples"></a>

La requête suivante montre un caractère générique `SELECT` entièrement générique de base avec une clause de `WHERE` prédicat standard qui utilise l'`IN`opérateur.

```
SELECT * FROM Vehicle
WHERE VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

Ce qui suit montre `SELECT` les projections avec un filtre de chaîne.

```
SELECT FirstName, LastName, Address 
FROM Person 
WHERE Address LIKE '%Seattle%'
AND GovId = 'LEWISR261LL'
```

Ce qui suit montre une sous-requête corrélée qui aplatit les données imbriquées. Notez que le `@` caractère est techniquement facultatif ici. Mais cela indique explicitement que vous voulez la `Owners` structure qui y est imbriquée`VehicleRegistration`, et non une collection différente nommée `Owners` (s'il en existait une). Pour plus de contexte, voir [Données imbriquées](working.userdata.md#working.userdata.nested) le chapitre *Utilisation des données et de l'historique*.

```
SELECT 
    r.VIN, 
    o.SecondaryOwners
FROM
    VehicleRegistration AS r, @r.Owners AS o
WHERE
    r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

Ce qui suit montre une sous-requête de la `SELECT` liste qui projette des données imbriquées, ainsi qu'une jointure interne implicite.

```
SELECT
    v.Make, 
    v.Model, 
    (SELECT VALUE o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner
FROM 
    VehicleRegistration AS r, Vehicle AS v
WHERE 
    r.VIN = v.VIN AND r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

Ce qui suit montre une jointure interne explicite.

```
SELECT
    v.Make, 
    v.Model, 
    r.Owners
FROM 
    VehicleRegistration AS r JOIN Vehicle AS v
ON
    r.VIN = v.VIN
WHERE
    r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

Ce qui suit montre une projection du champ de `id` métadonnées du document, à l'aide de la `BY` clause.

```
SELECT
    r_id,
    r.VIN
FROM
    VehicleRegistration AS r BY r_id
WHERE
    r_id = 'documentId'
```

Ce qui suit utilise la `BY` clause pour joindre les `Person` tables `DriversLicense` et dans leurs champs `PersonId` et `id` dans les champs du document, respectivement.

```
SELECT * FROM DriversLicense AS d INNER JOIN Person AS p BY pid
ON d.PersonId = pid
WHERE pid = 'documentId'
```

Ce qui suit utilise le [Un point de vue engagé](working.metadata.md#working.metadata.committed) pour joindre les `Person` tables `DriversLicense` et dans leurs champs `PersonId` et dans les `id` champs du document, respectivement.

```
SELECT * FROM DriversLicense AS d INNER JOIN _ql_committed_Person AS cp
ON d.PersonId = cp.metadata.id
WHERE cp.metadata.id = 'documentId'
```

Ce qui suit renvoie le numéro d'index (ordinal) `PersonId` et de chaque personne de la `Owners.SecondaryOwners` liste pour un document dans une table`VehicleRegistration`.

```
SELECT s.PersonId, owner_idx
FROM VehicleRegistration AS r, @r.Owners.SecondaryOwners AS s AT owner_idx
WHERE r.VIN = 'KM8SRDHF6EU074761'
```

## Exécution par programmation à l'aide du pilote
<a name="ql-reference.select.driver"></a>

*Pour savoir comment exécuter cette instruction par programmation à l'aide du pilote QLDB, consultez les didacticiels suivants dans Getting started with the driver :*
+ Java : [Tutoriel de démarrage rapide](driver-quickstart-java.md) \$1 [Référence de livre de cuisine](driver-cookbook-java.md)
+ .NET : [Tutoriel de démarrage rapide](driver-quickstart-dotnet.md) \$1 [Référence de livre de cuisine](driver-cookbook-dotnet.md)
+ Allez : [Tutoriel de démarrage rapide](driver-quickstart-golang.md) \$1 [Référence de livre de cuisine](driver-cookbook-golang.md)
+ Node.js : [Tutoriel de démarrage rapide](driver-quickstart-nodejs.md) \$1 [Référence de livre de cuisine](driver-cookbook-nodejs.md)
+ Python : [Tutoriel de démarrage rapide](driver-quickstart-python.md) \$1 [Référence de livre de cuisine](driver-cookbook-python.md)