SELECT [ALL|DISTINCT [ON column] ] expression [ AS name ] [, ...] [ INTO [TEMP] [TABLE] new_table ] [ FROM table [alias ] [, ...] ] [ WHERE condition ] [ GROUP BY column [, ...] ] [ HAVING condition [, ...] ] [ { UNION [ALL] | INTERSECT | EXCEPT } select ] [ ORDER BY column [ ASC | DESC ] [, ...] ] [ FOR UPDATE [OF class_name...]] [ LIMIT count [OFFSET|, count]] |
Nom d'une colonne de table ou d'une expression.
Spécifie un autre nom pour une colonne ou une expression en utiliant la clause AS. name ne peut pas être utilisé dans la condition WHERE. Il peut, cependant, être référencé dans les clauses associées ORDER BY et GROUP BY.
La table est créée uniquement pour la session, et est automatiquement supprimée en fin de session.
Si la clause INTO TABLE est spécifiée, le résultat de la requête sera stocké dans une autre table en indiquant son nom. La table cible (new_table) sera créée automatiquement et n'existera pas avant que cette commande soit exécutée. Voir SELECT INTO pour plus d'information.
La clause CREATE TABLE AS créera également une nouvelle table depuis une requête select. |
Nom d'une table existante référencée par la clause FROM.
Autre nom pour la table précédente. Utilisé pour raccourcir ou pour éliminer les ambiguïtés pour les jointures dans une table unique.
Expression booléenne donnant un résultat vrai ou faux. Voir la clause WHERE.
Nom d'une colonne de table.
Un select avec toutes les fonctionnalités sauf la clause ORDER BY.
Ensemble complet de lignes résultant d'une spécification d'une requête.
Nombre de lignes retourné par la requête.
SELECT retourne les lignes d'une ou plusieurs tables. Les candidats pour la sélection sont les lignes qui satisfont la condition WHERE; si WHERE est omis, toutes les lignes sont candidates.
DISTINCT élimine toutes les lignes dupliquées de la sélection. DISTINCT ON column éliminera tous les duplicats de la colonne spécifiée; ceci est équivalent a utiliser GROUP BY column. ALL qui retournera toutes les lignes candidates y compris les duplicats.
La clause GROUP BY permet à un utilisateur de diviser une table conceptuelle en groupes. (Voir la clause GROUP BY).
La clause HAVING spécifie une table groupée dérivée d'une élimination de groupes résultat d'une clause spécifiée antérieurement. (Voir la clauseHAVING).
La clause ORDER BY permet de spécifier que l'utilisateur désire que les lignes soient triées selon le mode ascendant ASCending ou descendant DESCending (Voir la clause ORDER BY)
La clause UNION donne comme résultat une collection de lignes retournées par la requête. (Voir la clause UNION).
INTERSECT donne les lignes communes aux deux requêtes. (Voir la clause INTERSECT).
EXCEPT renvoie les lignes dans le haut de la requête, pas dans le bas. (Voir la clause EXCEPT).
La clause FOR UPDATE permet aux select d'exécuter le verrouillage exclusif des lignes sélectionnées. (Voir la clause EXCEPT).
La clause LIMIT...OFFSET permet de contrôler quelles lignes sont renvoyées par la requête.
Vous devez avoir le droit de SELECT sur la table pour lire ses valeurs. (Voir GRANT/REVOKE).
La condition optionnelle WHERE a la forme générale :
WHERE expr ETER">ce"PARreplaceable> [ log_op ... ] |
GROUP BY spécifie une table groupée dérivée par l'application de cette clause :
GROUP BY column [, ...] |
GROUP BY condensera en une seule ligne toutes les lignes qui partagent les mêmes valeurs des colonnes groupées; les agrégats renvoient les valeurs dérivées de toutes les lignes qui make up the group. La valeur renvoyée par une colonne non groupée ou non agrégée est dépendante de l'ordre dans lequel les lignes sont lues depuis la base.
La condition optionnelle HAVING a la forme générale :
HAVING cond_expr |
HAVING specifie une table groupée dérivée de l'élimination de groupes provenant du résultat d'une clause antérieurement spécifiée qui ne rencontre pas cond_expr.
Chaque colonne référencée dans cond_expr sera une référence non ambiguë d'une colonne groupée.
ORDER BY column [ ASC | DESC ] [, ...] |
column peut être ou un nom de colonne ou un nombre ordinal.
Les nombres ordinaux se réfèrent à la position ordinale (gauche-droite) de la colonne. Cette fonctionnalité fait qu'il est possible de définir un ordonnancement sur la base d'une colonne qui n'a pas de nom en propre. Ceci n'est jamais absolument nécesaire car il est toujours possible d'assigner un nom à une colonne calculée en utilisant la clause AS, ex. :
SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen; |
Depuis la version 6.4 de PostgreSQL, les colonnes dans la clause ORDER BY n'ont pas besoin d'apparaître dans la clause SELECT. Ainsi, la clause suivante est maintenant légale :
SELECT name FROM distributors ORDER BY code; |
Optionnellement on peut ajouter le mot-clé DESC (descendant) ou ASC (ascendant) après chaque colonne dans la clause ORDER BY. Si rien n'est spécifié, ASC est pris par défaut.
table_query UNION [ ALL ] table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
La clause UNION permet au résultat d'une requête d'être une collection de lignes. Les deux tables qui représentent les opérandes directs d'UNION doivent avoir le même nombre de colonnes, et les colonnes correspondantes doivent être de données types compatibles.
Par défaut, le résultat de UNION ne doit contenir aucune ligne dupliquée à moins que la clause ALL soit spécifiée..
Les opérateurs UNION multiples dans la même clause SELECT sont évalués de gauche à droite. Notez que le mot-clé ALL n'est pas global par nature, étant appliqué seulement pour le résultat de la paire de tables courantes.
table_query INTERSECT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
La clause INTERSECT permet de renvoyer toutes les lignes communes aux requêtes. Les deux tables qui représentent les opérandes directs de INTERSECT doivent avoir le même nombre de colonnes, et les colonnes correspondantes doivent être de types donnée compatibles.
Les opérateurs multiples INTERSECT dans le même SELECT sont évalués de gauche à droite.
table_query EXCEPT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
La clause EXCEPT permet de renvoyer les lignes du haut de la requête qui ne sont pas dans le bas de la requête. Les deux tables qui représentent les opérandes directs de EXCEPT doivent avoir le même nombre de colonnes, et les colonnes correspondantes doivent être de types donnée correspondantes..
Les opérateurs multiples EXCEPT dans le même SELECT sont évalués de gauche à droite.
Pour joindre la table films avec la table distributors:
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 Hrs |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 Bed Knobs and Broomsticks|111|Walt Disney | |Musical |
Pour totaliser la colonne len de tous les films et grouper le résultat par kind:
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 |
Pour totaliser la colonne lende tous les films et grouper les résultats par kind et montrer les groupes qui ont moins de 5 heures :
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 |
Les deux exemples suivants sont des moyens identiques de trier les résultats individuels selon le contenu de la seconde colonne (name):
SELECT * FROM distributors ORDER BY name; 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 |
Cet exemple indique comment obtenir l'union des tables distributors et actors, en limitant le résultat de ceux qui commencent avec la lettre W dans chaque table. Seules les lignes distinctes sont utilisées, ainsi le mot-clé ALL est omis :
-- distributors: actors: -- did|name id|name -- ---+------------ --+-------------- -- 108|Westward 1|Woody Allen -- 111|Walt Disney 2|Warren Beatty -- 112|Warner Bros. 3|Walter Matthau -- ... ... SELECT distributors.name FROM distributors WHERE distributors.name LIKE 'W%' UNION SELECT actors.name FROM actors WHERE actors.name LIKE 'W%' name -------------- Walt Disney Walter Matthau Warner Bros. Warren Beatty Westward Woody Allen |
Postgres permet d'omettre la clause FROM dans une requête. Cette fonctionnalité vient du langage de requête PostQUEL d'origine :
SELECT distributors.* WHERE name = 'Westwood'; did|name ---+---------------- 108|Westward |
Dans le standard SQL92 le mot-clé optionnel "AS" peut être omis sans affecter le comportement. Le parser Postgres nécessite ce mot-clé quand on renomme des colonnes parce que les fonctionnalités d'extensibilité de type entrainent la parser dans des ambiguïtés dans ce contexte..
dans le standardSQL92 le nouveau nom de colonne spécifié dans la clause "AS" peut être référencé dans les clauses GROUP BY et HAVING. Ce n'est pas encore admis dans Postgres.
La phrase DISTINCT ON ne fait pas partie de SQL92.