SELECT (pour extraire des lignes)
La commande SELECT permet d'extraire des lignes d'une table ou d'une vue. Il renvoie les lignes qui satisfont aux critères que vous avez spécifiés, y compris la condition WHERE. Si vous omettez la condition WHERE, la commande SELECT sélectionne toutes les lignes.
- Vous pouvez inclure * dans la liste de sortie pour indiquer toutes les colonnes des lignes sélectionnées. Vous pouvez également indiquer "
<table>.*pour désigner les colonnes provenant d'une table spécifique. L'interrogation d'un tableau décrit les fonctions que vous pouvez utiliser dans une commande SELECT. - Vous pouvez utiliser le mot-clé distinct pour éliminer les lignes dupliquées du résultat. Le mot-clé all (par défaut) renvoie toutes les lignes candidates, y compris les doublons.
Syntaxe
SELECT [ DISTINCT | ALL ] [ * | <col> [ AS <output_name> ]
<expression> [ AS <output_name> ] [,<expression> [ AS <output_name> ]…]
[ FROM <from_item>[,<from_item>…] ]
[ WHERE <condition> ]
[ GROUP BY <expression>[,<expression>…] ]
[ HAVING <condition>[,<condition>…] ]
[ { UNION | INTERSECT | EXCEPT | MINUS }[ DISTINCT | ALL ]
SELECT
[ ORDER BY <expression> [ ASC | DESC | USING <operator>
[NULLS {FIRST | LAST}][, …] ]
[ LIMIT { <count> | ALL } ]<table>
[ [ AS ] <alias> [ ( <column_alias_list> ) ] ] |
[ FOR SYSTEM_TIME
{ AS OF <timestamp-expression> |
BEFORE <timestamp-expr> |
BETWEEN <timestamp-expression1> AND <timestamp-expression2> |
FROM <timestamp-expression1> TO <timestamp-expression2> } ] |
( <select> ) [ AS ] <alias> [ ( <column_alias_list> ) ] |
<from_item> [ NATURAL ] <join_type> <from_item>
[ ON <join_condition> | USING ( <join_column_list> ) ]Pour plus d'informations sur FOR SYSTEM_TIME, voir Syntaxe des requêtes de déplacement dans le temps et horodatage.
Entrées
La commande SELECT prend en compte les données suivantes :
| Entrée | Descriptif |
|---|---|
| alias | Spécifie un nom de remplacement pour le nom de la table précédente. Utilisez un alias par souci de concision ou pour éliminer toute ambiguïté en cas de jointure automatique (lorsque la même table est analysée plusieurs fois). Si vous écrivez un alias, vous pouvez également écrire une liste d'alias de colonnes pour fournir des noms de substitution pour une ou plusieurs colonnes du tableau. |
| <col> | Nom d'une colonne. |
| <nom_de_sortie> | Nom à donner à la colonne dans la sortie. Ce nom est généralement utilisé pour étiqueter une colonne à des fins d'affichage. Vous pouvez également l'utiliser pour faire référence à la valeur de la colonne dans les clauses ORDER BY et GROUP BY. Vous ne pouvez pas utiliser ce nom dans les clauses WHERE ou HAVING ; écrivez l'expression à la place. |
| <expression> | Le nom d'une colonne du tableau ou d'une expression. |
| FROM | La clause FROM spécifie une ou plusieurs tables sources pour la commande SELECT. Si vous spécifiez plusieurs sources, le résultat est le produit cartésien de toutes les lignes de toutes les sources. En général, cependant, vous ajoutez des conditions de qualification pour restreindre les lignes que le système renvoie à peu de produits cartésiens. Vous pouvez mettre entre parenthèses une commande de sous-sélection dans une clause FROM. L'utilisation d'une commande de sous-sélection est le seul moyen d'obtenir plusieurs niveaux de regroupement, d'agrégation ou de tri dans une seule requête. Vous devez spécifier un alias pour la commande subselect. Un élément FROM peut être une clause de jointure, qui combine deux éléments from plus simples. Utilisez des parenthèses, si nécessaire, pour déterminer l'ordre d'emboîtement. |
| <from_item> | Une référence de table, une sous-sélection ou une clause de jointure. Pour plus d'informations sur FOR SYSTEM_TIME, voir Syntaxe des requêtes de déplacement dans le temps et horodatage. |
| LIEU | Cette clause a la forme générale suivante :La partie boolean_expr de la clause peut consister en toute expression produisant une valeur booléenne. Dans de nombreux cas, vous utilisez l'expression comme suit :
où :
|
| REGROUPER PAR | Cette clause permet de diviser une table en groupes de lignes correspondant à une ou plusieurs valeurs. La clause spécifie une table groupée qui est dérivée par l'application de la clause :La clause GROUP BY condense, en une seule ligne, toutes les lignes sélectionnées qui partagent des valeurs pour les colonnes regroupées. Le système calcule les fonctions d'agrégation sur toutes les lignes qui composent chaque groupe, produisant une valeur distincte pour chaque groupe (alors que sans GROUP BY, un agrégat produit une valeur unique calculée sur toutes les lignes sélectionnées). Lorsque vous incluez la clause GROUP BY, l'expression ou les expressions de sortie de la commande SELECT ne peuvent pas faire référence à des colonnes non groupées, sauf dans les fonctions d'agrégation, car il y aurait plus d'une valeur possible à renvoyer pour une colonne non groupée. Un groupe par valeur peut être :
|
| HAVING | La clause facultative HAVING a la forme générale suivanteoù l'expression booléenne est la même que celle spécifiée pour la clause where.La clause HAVING spécifie un tableau groupé dérivé par l'élimination des lignes qui ne satisfont pas à l'expression booléenne. La clause HAVING est différente de la clause WHERE :
Chaque colonne référencée dans boolean_expr doit faire référence sans ambiguïté à une colonne de regroupement, sauf si la référence est affichée dans une fonction d'agrégation. Dans une sélection de regroupement, la clause HAVING ne peut faire référence qu'à des expressions à valeur unique au sein d'un groupe. En d'autres termes, vous ne pouvez faire référence qu'à des champs de groupe, des agrégats ou des expressions à valeur unique dérivées de champs de groupe ou d'agrégats (qui doivent inclure des constantes). Par exemple, pour renvoyer le groupe et le nombre de groupes ayant plus de quatre membres :
Dans une sélection sans regroupement, où la sélection est conceptuellement regroupée par des champs de groupe zéro, vous ne pouvez faire référence qu'à des agrégats ou à des expressions à valeur unique. Par exemple, pour ne renvoyer aucune ligne s'il y a quatre salariés ou moins dans emp, ou une ligne avec le décompte s'il y a plus de quatre salariés dans emp :
|
| <condition> | Une expression booléenne qui donne un résultat vrai ou faux. |
| UNION | L'opérateur fait en sorte que le système calcule la collection de lignes renvoyées par les requêtes. Élimine les lignes en double, sauf si vous spécifiez le mot-clé ALL.où table_query spécifie toute expression de sélection sans clause ORDER BY, FOR UPDATE ou LIMIT.Si vous placez une sous-expression entre parenthèses, vous pouvez inclure les clauses ORDER BY et LIMIT. Si vous n'incluez pas de parenthèses, les clauses sont considérées comme s'appliquant au résultat de l'union, et non à son expression d'entrée droite. L'opérateur UNION calcule la collection (union d'ensembles) des lignes renvoyées par les requêtes concernées. Les deux sélections qui représentent les opérandes directs de l'union doivent produire le même nombre de colonnes, et les colonnes correspondantes doivent être de types de données compatibles. Le résultat de l'UNION ne contient pas de lignes dupliquées à moins que vous ne spécifiiez l'option ALL. L'option TOUS permet d'éviter l'élimination des doublons. Les opérateurs UNION multiples dans la même commande SELECT sont évalués de gauche à droite, à moins que vous n'indiquiez le contraire en utilisant des parenthèses. |
| INTERSECTION | Combine les résultats de deux requêtes en un seul résultat qui comprend toutes les lignes communes aux deux requêtes. Pour plus d'informations, voir l' opération INTERSECT. |
| SAUF ou MOINS | Recherche la différence entre les deux requêtes et le résultat comprend les lignes qui appartiennent uniquement à la première requête. Pour plus d'informations, voir l' opération SAUF. |
| TRIER PAR | Utilisez cette clause pour trier les lignes renvoyées dans l'ordre que vous avez spécifié. Une clause ORDER BY peut être :
Cette fonctionnalité est limitée par le fait qu'une clause ORDER BY qui s'applique au résultat d'une requête d'union ne peut spécifier que le nom ou le numéro d'une colonne de sortie, et non une expression. Si une clause ORDER BY est un nom simple qui correspond à la fois à un nom de colonne de résultat et à un nom de colonne d'entrée, ORDER BY l'interprète comme le nom de la colonne de résultat. C'est le contraire du choix que fait la clause GROUP BY dans la même situation. Vous pouvez spécifier un ordre de tri ascendant ou descendant :
Vous pouvez spécifier un ordre de tri pour les données nulles :
|
| Limite | Renvoyer un sous-ensemble des lignes produites par votre requête :
Lorsque vous spécifiez le paramètre LIMIT, spécifiez également le paramètre ORDER BY. Dans le cas contraire, le sous-ensemble de lignes renvoyé est indéterminé. |
| <joindre_liste_colonnes> | Une liste de colonnes de jointure. Par exemple, spécifier " USING (a,b) équivaut à spécifier " ON left_table.a = right_table.a et " ON left_table.b =
right_table.b. |
| <condition_de_jonction> | Une condition de qualification. Cette condition est similaire à la condition WHERE, sauf qu'elle ne s'applique qu'aux deux éléments from_items réunis dans cette clause de jointure. |
| <type_d'adhésion> | L'un des types de jointure suivants :
|
| <select> | Une commande SELECT. Vous devez placer la sous-sélection entre parenthèses et lui donner un alias. Lorsque vous incluez une sous-sélection dans la clause FROM, la sous-sélection agit comme si sa sortie avait été créée en tant que table temporaire au cours de cette seule commande de sélection. |
| <table> | Dans une clause FROM, le nom d'une table ou d'une vue. |
| CROSS JOIN et INNER JOIN | Produit un simple produit cartésien, le même que celui que vous obtiendriez en listant les deux éléments au niveau supérieur de FROM. La jointure croisée et la jointure interne sur les types (true) sont équivalentes ; aucune ligne n'est supprimée par qualification. Ces types de jonctions sont une commodité nota-tionnelle. Vous pouvez obtenir les mêmes résultats en utilisant les clauses FROM et WHERE. |
| JOINTURE EXTERNE SUR L'ELEMENT DE GAUCHE | Renvoie toutes les lignes du produit cartésien qualifié (c'est-à-dire toutes les lignes combinées qui satisfont à sa condition d'activation), plus une copie de chaque ligne du tableau de gauche pour laquelle aucune ligne de droite n'a satisfait à la condition d'activation. Le système ne prend en compte que la condition "own on" ou "using" de la jointure pour déterminer les lignes qui ont des correspondances. Il applique ensuite les conditions OUTER ON ou WHERE. |
| Jointure externe droite | Renvoie toutes les lignes jointes, plus une ligne pour chaque ligne de droite non appariée (étendue avec des zéros à gauche). Il s'agit d'une simple commodité d'écriture. Vous pouvez la convertir en une jointure externe gauche en inversant les entrées gauche et droite. |
| JOINTURE EXTERNE COMPLETE | Renvoie toutes les lignes jointes, plus une ligne pour chaque ligne gauche non appariée (étendue avec des zéros à droite), plus une ligne pour chaque ligne droite non appariée (étendue avec des zéros à gauche). Pour tous les types de jointure, à l'exception de la jointure croisée, vous devez écrire exactement l'un des éléments suivants :
|
Sorties
La commande SELECT a les résultats suivants :
| Sortie | Descriptif |
|---|---|
| ROWS | Renvoie l'ensemble des lignes résultant de la requête. |
| COUNT | Renvoie le nombre de lignes renvoyées par la requête. |
Droits
Vous devez être l'utilisateur admin, le propriétaire de la table, le propriétaire de la base de données ou du schéma dans lequel la table est définie, ou votre compte doit disposer des privilèges Select sur la table ou la classe d'objets Table (ou la classe Table externe, si la table sélectionnée est une table externe).
Utilisation
- Joindre la table '
filmsà la table 'distributors:MYDB.SCH1(USER)=> SELECT f.title, f.did, d.name, f.date_prod, f.kind FROM distributors d, films f WHERE f.did = d.did; title |did |name |date_prod |kind --------------------------+-----+------------------+-----------+------- The Third Man |101 |British Lion |1949-12-23 |Drama The African Queen |101 |British Lion |1951-08-11 |Romantic Une Femme est une Femme |102 |Jean Luc Godard |1961-03-12 |Romantic Vertigo |103 |Paramount |1958-11-14 |Action Becket |103 |Paramount |1964-02-03 |Drama 48 Hours |103 |Paramount |1982-10-22 |Action War and Peace |104 |Mosfilm |1967-02-12 |Drama West Side Story |105 |United Artists |1961-01-03 |Musical Bananas |105 |United Artists |1971-07-13 |Comedy Yojimbo |106 |Toho |1961-06-16 |Drama There's a Girl in my Soup |107 |Columbia |1970-06-11 |Comedy Taxi Driver |107 |Columbia |1975-05-15 |Action Absence of Malice |107 |Columbia |1981-11-15 |Action Storia di una donna |108 |Westward |1970-08-15 |Romantic The King and I |109 |20th Century Fox |1956-08-11 |Musical Das Boot |110 |Bavaria Atelier |1981-11-11 |Drama - Additionnez la colonne "
lende tous les films et regroupez les résultats par type :MYDB.SCH1(USER)=> SELECT kind, SUM(len) AS total FROM films GROUP BY kind; kind |total ---------+------- Action |07:34 Comedy |02:58 Drama |14:28 Musical |06:42 Romantic |04:38 - Additionner la colonne "
lende tous les films, regrouper les résultats par type et afficher les totaux des groupes inférieurs à 5 heures :MYDB.SCH1(USER)=> SELECT kind, SUM(len) AS total FROM films GROUP BY kind HAVING SUM(len) < INTERVAL '5 HOUR'; kind | total ---------+------ Comedy | 02:58 Romantic | 04:38 - Trier le contenu du tableau "
distributorsen fonction du contenu de la deuxième colonne (name) :MYDB.SCH1(USER)=> SELECT * FROM distributors ORDER BY name; or MYDB.SCH1(USER)=> SELECT * FROM distributors ORDER BY 2; did | name ------+----------------- 109 | 20th Century Fox 110 | Bavaria Atelier 101 | British Lion 107 | Columbia 102 | Jean Luc Godard 113 | Luso Films 104 | Mosfilm 103 | Paramount 106 | Toho 105 | United Artists 111 | Walt Disney 112 | Warner Bros. 108 | Westward - Obtenez l'union des tableaux '
distributorset 'actors, et limitez les résultats à ceux qui commencent par la lettre W :MYDB.SCH1(USER)=> SELECT distributors.name FROM distributors WHERE distributors.name LIKE 'W%'; UNION SELECT actors.name FROM actors WHERE actors.name LIKE 'W%'; Walt Disney Walter Matthau Warner Bros. Warren Beatty Westward Woody Allen
Étant donné que seules les lignes distinctes sont recherchées, le mot-clé ALL est omis.
considérations watsonx.data
- Apache Iceberg n'ont pas de longueur maximale de caractère pour le type de données string , ce qui entraîne une divergence avec la façon dont le système Netezza Performance Server traite les types de texte. Afin de compenser cela, Netezza traitera toutes les colonnes de chaînes comme ayant une longueur de 512 caractères. Si vos données contiennent une chaîne de caractères dont la longueur est supérieure à 512 caractères, la requête échouera avec une erreur de dépassement de capacité.Solution :
- Fixez la taille de la variable
DATALAKE_STRING_SIZEà une valeur plus élevée pour dépasser la limite de 512 caractères par défaut. - Alternativement, vous pouvez manuellement convertir la colonne string en un type Netezza NVARCHAR avec la taille requise.Par exemple, pour passer à 4096 caractères, exécutez :
Si, au cours d'une telle conversion, des données dépassent encore 4Kb de l'espace alloué, le reste des données est tronqué à la taille spécifiée.SELECT stringCol::NVARCHAR(4096) FROM ...
Vous devez également tenir compte des aspects suivants :- La variable de session
DATALAKE_STRING_SIZEest appliquée à toutes les colonnes de type string dans une table. - Si vous souhaitez traiter une colonne différemment d'une autre, vous pouvez donner à chaque colonne une taille différente.
- La conversion n'est possible que pour le type NVARCHAR().
- La portée de la variable de session
DATALAKE_STRING_SIZEest[1, 16000]. - Un comportement similaire est également applicable au type de données binary, qui utilise sa propre variable d'environnement
DATALAKE_BINARY_SIZEavec la même taille par défaut de 512 octets et la même plage effective de[1, 64000].
- Fixez la taille de la variable
- Si des noms de schéma dans Hive Metastore sont des mots-clés NPS, vous ne pouvez pas utiliser ces mots-clés comme identifiants lors de l'utilisation du schéma. Pour plus d'informations, voir Noms de schéma dans Hive Metastore (HMS) qui sont des mots-clés réservés NPS.