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.
SELECT
Récupère les lignes de données de zéro ou plusieurs tables.
Note
Cette rubrique fournit des informations récapitulatives à titre de référence. Cette documentation n'a pas pour objectif de couvrir en détail l'utilisation de SELECT et du langage SQL. Pour des informations sur l'utilisation de SQL spécifique à Athena, voir Considérations et limitations relatives aux requêtes SQL dans Amazon Athena et Exécuter des requêtes SQL dans Amazon Athena. En guise d'exemple en matière de création d'une base de données, de création d'une table et d'exécution d'une requête SELECT sur la table dans Athena, voir Mise en route.
Résumé
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
Note
Les mots réservés dans les instructions SQL SELECT doivent être placés entre guillemets doubles. Pour de plus amples informations, veuillez consulter Mots clés réservés auxquels il est possible d'échapper dans les instructions SQL SELECT.
Paramètres
- [ WITH with_query [, ....] ]
-
Vous pouvez utiliser
WITHpour aplatir les requêtes imbriquées ou pour simplifier les sous-requêtes.L'utilisation de la clause
WITHpour créer des requêtes récursives est prise en charge à partir de la version 3 du moteur Athena. La profondeur de récursivité maximale est de 10.La clause
WITHprécède la listeSELECTdans une requête et définit une ou plusieurs sous-requêtes pour une utilisation au sein de la requêteSELECT.Chaque sous-requête définit une table temporaire, similaire à la définition d'une vue, que vous pouvez référencer dans la clause
FROM. Les tables sont utilisées uniquement lorsque la requête s'exécute.La syntaxe de
with_queryest la suivante :subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)Où :
-
subquery_table_nameest un nom unique d'une table temporaire qui définit les résultats de la sous-requête de la clauseWITH. Chaquesubquerydoit avoir un nom de table qui peut être référencé dans la clauseFROM. -
column_name [, ...]est une liste facultative de noms de colonne de sortie. Le nombre de noms de colonne doit être égal ou inférieur au nombre de colonnes défini parsubquery. -
subquerydésigne n'importe quelle instruction de requête.
-
- [TOUS | DISTINCT] select_expression
-
select_expressiondétermine les lignes à sélectionner. Aselect_expressionpeut utiliser l'un des formats suivants :expression [ [ AS ] column_alias ] [, ...]row_expression.* [ AS ( column_alias [, ...] ) ]relation.**-
La
expression [ [ AS ] column_alias ]syntaxe spécifie une colonne de sortie. La[AS] column_aliassyntaxe facultative spécifie un nom de titre personnalisé à utiliser pour la colonne dans la sortie. -
Pour
row_expression.* [ AS ( column_alias [, ...] ) ],row_expressionest une expression arbitraire du type de donnéesROW. Les champs de la ligne définissent les colonnes de sortie à inclure dans le résultat. -
En effet
relation.*, les colonnes derelationsont incluses dans le résultat. Cette syntaxe n'autorise pas l'utilisation d'alias de colonne. -
L'astérisque
*indique que toutes les colonnes doivent être incluses dans le jeu de résultats. -
Dans le jeu de résultats, l'ordre des colonnes est identique à l'ordre de leur spécification par l'expression de sélection. Si une expression de sélection renvoie plusieurs colonnes, l'ordre des colonnes suit l'ordre utilisé dans la relation source ou l'expression de type ligne.
-
Lorsque des alias de colonne sont spécifiés, ils remplacent les noms de champs de colonne ou de ligne préexistants. Si l'expression select ne comporte pas de nom de colonne, les noms de colonnes anonymes indexés à zéro (
_col0,_col1,_col2, ...) sont affichés dans la sortie. -
ALLest la valeur par défaut. L'utilisation d'ALLest traité de la même façon que si la valeur avait été omise ; toutes les lignes de toutes les colonnes sont sélectionnées et les doublons sont conservés. -
Utilisez
DISTINCTpour renvoyer uniquement des valeurs distinctes lorsqu'une colonne contient des valeurs en double.
-
- FROM from_item [, ...]
-
Indique les entrées de la requête, où
from_itempeut être une vue, une construction de jointure ou une sous-requête comme décrit ci-dessous.L'élément
from_itempeut être l'un ou l'autre :-
table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]Où
table_nameest le nom de la table cible à partir de laquelle sélectionner les lignes, oùaliasest le nom pour donner la sortie de l'instructionSELECTet oùcolumn_aliasdéfinit les colonnes de l'aliasspécifié.
-OU-
-
join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]Où
join_typeest l'un des éléments suivants :-
[ INNER ] JOIN -
LEFT [ OUTER ] JOIN -
RIGHT [ OUTER ] JOIN -
FULL [ OUTER ] JOIN -
CROSS JOIN -
ON join_condition | USING (join_column [, ...])Où l'utilisation dejoin_conditionvous permet de spécifier les noms de colonne pour les clés de jointure de plusieurs tables et où l'utilisation dejoin_columnnécessitejoin_columnpour exister dans les deux tables.
-
-
- [ Condition WHERE ]
-
Filtre les résultats en fonction de la
conditionque vous spécifiez, oùconditiona généralement la syntaxe suivante.column_nameoperatorvalue[[[AND | OR]column_nameoperatorvalue] ...]Il
operatorpeut s'agir de l'un des comparateurs=>,,<,>=,<=<>,!=.Les expressions de sous-requêtes suivantes peuvent également être utilisées dans la clause
WHERE.-
[NOT] BETWEEN– Spécifie une plage entre deux entiers, comme dans l'exemple suivant. Si le type de données de colonne estinteger_AANDinteger_Bvarchar, la colonne doit d'abord être convertie en entier.SELECT DISTINCT processid FROM "webdata"."impressions" WHERE cast(processid as int) BETWEEN 1500 and 1800 ORDER BY processid -
[NOT] LIKE– Recherche le motif spécifié. Utilisez le signe de pourcentage (value%) comme caractère générique, comme dans l'exemple suivant.SELECT * FROM "webdata"."impressions" WHERE referrer LIKE '%.org' -
[NOT] IN (– Spécifie une liste de valeurs possibles pour une colonne, comme dans l'exemple suivant.value[,value[, ...])SELECT * FROM "webdata"."impressions" WHERE referrer IN ('example.com','example.net','example.org')
-
- [ GROUP BY [ ALL | DISTINCT ] grouping_expressions [, ...] ]
-
Divise la sortie de l'instruction
SELECTen lignes avec les valeurs correspondantes.ALLetDISTINCTdéterminent si les ensembles de groupement dupliqués produisent chacun des lignes de sortie distinctes. Si ce paramètre n'est pas spécifié,ALLest utilisé.grouping_expressionsvous permettent d'effectuer des opérations de regroupement complexes. Vous pouvez utiliser des opérations de regroupement complexes pour effectuer une analyse qui nécessite une agrégation sur plusieurs ensembles de colonnes dans une seule requête.L'élément
grouping_expressionspeut être une fonction quelconque, telle queSUM,AVGouCOUNT, exécutée sur les colonnes d'entrée.Les expressions
GROUP BYpeuvent grouper les sorties par noms de colonne d'entrée qui n'apparaissent pas dans la sortie de l'instructionSELECT.Toutes les expressions de sortie doivent être des fonctions d'agrégat ou des colonnes présentes dans la clause
GROUP BY.Vous pouvez utiliser une seule requête pour effectuer une analyse qui nécessite l'agrégation de plusieurs jeux de colonnes.
Athena prend en charge les agrégations complexes à l'aide de
GROUPING SETS,CUBEetROLLUP.GROUP BY GROUPING SETSspécifie plusieurs listes de colonnes à regrouper.GROUP BY CUBEgénère tous les ensembles de regroupement possibles pour un ensemble de colonnes donné.GROUP BY ROLLUPgénère tous les sous-totaux possibles pour un ensemble de colonnes donné. Les opérations de regroupement complexes ne prennent pas en charge le regroupement sur des expressions composées de colonnes d'entrée. Seuls les noms de colonnes sont autorisés.Vous pouvez souvent utiliser
UNION ALLpour obtenir les mêmes résultats que ces opérationsGROUP BY, mais les requêtes qui utilisentGROUP BYont l'avantage de lire les données une seule fois, tandis qu'UNION ALLlit les données sous-jacentes trois fois et peut générer des résultats incohérents lorsque la source de données est soumise à modification. - [ HAVING condition ]
-
Utilisé avec les fonctions d'agrégat et la clause
GROUP BY. Détermine quels groupes sont sélectionnés, en éliminant ceux qui ne satisfont pascondition. Le filtrage se produit après le calcul des groupes et des agrégats. - [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] union_query] ]
-
UNION,INTERSECTetEXCEPTcombinent les résultats de plus d'une instructionSELECTen une seule requête.ALLetDISTINCTcontrôlent l'unicité des lignes incluses dans le jeu de résultats final.UNIONcombine les lignes résultant de la première requête avec les lignes résultant de la deuxième requête. Pour éliminer les doublons,UNIONconstruit une table de hachage, qui consomme de la mémoire. Pour de meilleures performances, envisagez d'utiliserUNION ALLsi votre requête ne nécessite pas l'élimination des doublons. Plusieurs clausesUNIONsont traitées de gauche à droite, sauf si vous utilisez des parenthèses pour définir explicitement l'ordre de traitement.INTERSECTrenvoie uniquement les lignes qui sont présentes dans les résultats de la première et de la seconde requête.EXCEPTrenvoie les lignes des résultats de la première requête, en excluant les lignes trouvées par la seconde requête.ALLentraîne l'inclusion de toutes les lignes, même si elles sont identiques.DISTINCTfait en sorte que seules les lignes uniques soient incluses dans le jeu de résultats combinés. - [ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
-
Trie un jeu de résultats par une ou
expressionde sortie.Lorsque la clause contient plusieurs expressions, les résultats sont triés en fonction de la première
expression. Ensuite, la secondeexpressionest appliquée aux lignes qui possèdent des valeurs correspondantes à partir de la première expression, et ainsi de suite.Chaque
expressionpeut spécifier les colonnes à partir deSELECTou un nombre ordinal pour une colonne de sortie par son emplacement, à partir de un.ORDER BYest évaluée comme la dernière étape après toute clauseGROUP BYouHAVING.ASCetDESCdéterminent si les résultats sont triés dans l'ordre croissant ou décroissant. L'ordre de tri par défaut est croissant (ASC). L'ordre null par défaut estNULLS LAST, que l'ordre soit croissant ou décroissant. - [ OFFSET count [ ROW | ROWS ] ]
-
Utilisation de la clause
OFFSETpour ignorer un certain nombre de lignes principales du jeu de résultats. Si la clauseORDER BYest présente, la clauseOFFSETest évaluée sur un jeu de résultats triés, et le jeu reste trié après que les lignes ignorées aient été écartées. Si la requête n'a pas de clauseORDER BY, le choix des lignes à écarter est arbitraire. Si le nombre spécifié parOFFSETest égal ou dépasse la taille du jeu de résultat, le résultat final est vide. - LIMIT [ count | ALL ]
-
Limite le nombre de lignes dans le jeu de résultats à
count.LIMIT ALLest identique à l'omission de la clauseLIMIT. Si la requête n'a pas de clauseORDER BY, les résultats sont arbitraires. - TABLESAMPLE [ BERNOULLI | SYSTEM ] (pourcentage)
-
Opérateur facultatif pour sélectionner les lignes d'une table à partir d'une méthode d'échantillonnage.
BERNOULLIsélectionne chaque ligne à inclure dans l'exemple de la table avec une probabilité depercentage. Tous les blocs physiques de la table sont analysés, et certaines lignes sont ignorées en fonction de la comparaison entre lepercentagede l'échantillon et une valeur aléatoire calculée lors de l'exécution.Avec
SYSTEM, la table est divisée en segments logiques de données, et la table est échantillonnée au niveau de cette granularité.Soit toutes les lignes d'un segment sont sélectionnées, soit le segment est ignoré en fonction de la comparaison entre l'échantillon
percentageet une valeur aléatoire calculée lors de l'exécution. L'échantillonnageSYSTEMdépend du connecteur. Cette méthode ne garantit pas de probabilités d'échantillonnage indépendantes. - [ UNNEST (array_or_map) [WITH ORDINALITY] ]
-
Développe un tableau ou une carte dans une relation. Les tableaux sont développés en une seule colonne. Les cartes sont développées en deux colonnes (clé, valeur).
Vous pouvez utiliser
UNNESTavec plusieurs arguments, qui sont développés en plusieurs colonnes avec autant de lignes que l'argument ayant la plus haute cardinalité.Les autres colonnes sont complétées avec les valeurs NULL.
La clause
WITH ORDINALITYajoute une colonne « ordinality » à la fin.UNNESTest généralement utilisé avec une clauseJOINet peut référencer les colonnes à partir des relations sur le côté gauche de la jointureJOIN.
Obtention des emplacements de fichiers pour les données source dans Simple Storage Service (Amazon S3)
Pour connaître l'emplacement du fichier Simple Storage Service (Amazon S3) pour les données d'une ligne de table, vous pouvez utiliser "$path" dans une requête SELECT, comme dans l'exemple suivant :
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
Cela renvoie un résultat comme le suivant :
s3://amzn-s3-demo-bucket/datasets_mytable/year=2019/data_file1.json
Pour obtenir une liste unique et triée des chemins d'accès aux noms de fichiers S3 pour les données d'une table, vous pouvez utiliser SELECT DISTINCT et ORDER BY, comme dans l'exemple suivant.
SELECT DISTINCT "$path" AS data_source_file FROM sampledb.elb_logs ORDER By data_source_file ASC
Pour renvoyer uniquement les noms de fichiers sans le chemin d'accès, vous pouvez passer "$path" comme paramètre à une fonction regexp_extract, comme dans l'exemple suivant.
SELECT DISTINCT regexp_extract("$path", '[^/]+$') AS data_source_file FROM sampledb.elb_logs ORDER By data_source_file ASC
Pour renvoyer les données d'un fichier spécifique, spécifiez le fichier dans la clause WHERE, comme dans l'exemple suivant.
SELECT *,"$path" FROM my_database.my_table WHERE "$path" = 's3://amzn-s3-demo-bucket/my_table/my_partition/file-01.csv'
Pour plus d'informations et d'exemples, consultez l'article Comment voir le fichier source Simple Storage Service (Amazon S3) pour une ligne dans une table Athena ?
Note
Dans Athena, les colonnes de métadonnées masquées $bucket, $file_modified_time, $file_size et $partition ne sont pas prises en charge pour les vues.
Échappement de guillemets simples
Pour échapper un guillemet simple, faites-le précéder d'un autre guillemet simple, comme dans l'exemple suivant. Ne confondez pas ceci avec un guillemet double.
Select 'O''Reilly'
Résultats
O'Reilly
Ressources supplémentaires
Pour plus d'informations sur l'utilisation des instructions SELECT dans Athena, consultez les ressources suivantes.
| Pour plus d'informations à ce sujet | Voir ce qui suit |
|---|---|
| Exécution de requêtes dans Athena | Exécuter des requêtes SQL dans Amazon Athena |
Utilisation de SELECT pour créer une table |
Création d'une table à partir des résultats d'une requête (CTAS) |
Insertion de données à partir d'une requête SELECT dans une autre table |
INSERT INTO |
Utilisation de fonctions intégrées dans les instructions SELECT |
Fonctions dans Amazon Athena |
Utilisation de fonctions définies par l'utilisateur dans les instructions SELECT |
Requête avec fonctions définies par l'utilisateur |
| Interrogation des métadonnées d'un catalogue de données | Interrogez le AWS Glue Data Catalog |