SELECT

Nom

SELECT — Permet de retrouver les lignes d'une table ou d'une vue.
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]]
  

Entrées

expression

Nom d'une colonne de table ou d'une expression.

name

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.

TEMP

La table est créée uniquement pour la session, et est automatiquement supprimée en fin de session.

new_table

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.

Note

La clause CREATE TABLE AS créera également une nouvelle table depuis une requête select.

table

Nom d'une table existante référencée par la clause FROM.

alias

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.

condition

Expression booléenne donnant un résultat vrai ou faux. Voir la clause WHERE.

column

Nom d'une colonne de table.

select

Un select avec toutes les fonctionnalités sauf la clause ORDER BY.

Sorties

Rows

Ensemble complet de lignes résultant d'une spécification d'une requête.

count

Nombre de lignes retourné par la requête.

Description

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

Clause WHERE

La condition optionnelle WHERE a la forme générale :
WHERE expr ETER">ce"PARreplaceable> [ log_op ... ]
    
cond_op peut être un des: =, <, <=, >, >= ou <>, un opérateur conditionnel comme ALL, ANY, IN, LIKE, etc. ou un opérateur défini localement, et log_op peut être un des: AND, OR, NOT. La comparaison renvoie ou TRUE ou FALSE et toutes les instances seront abandonnées si l'expression est estimée à FALSE.

Clause GROUP BY

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.

Clause HAVING

La condition optionnelle HAVING a la forme générale :
HAVING cond_expr
    
ou cond_expr est la même que spécifié pour la clause WHERE.

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.

Clause ORDER BY

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.

Clause UNION

table_query UNION [ ALL ]
table_query
     [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
table_query spécifie une expression select sans clause ORDER BY.

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.

Clause INTERSECT

table_query INTERSECT
table_query
     [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
table_query spécifie une expression select sans clause ORDER BY.

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.

Clause EXCEPT

table_query EXCEPT
     table_query
     [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
table_query spécifie une expression select sans clause ORDER BY.

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.

Utilisation

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
  

Compatibilité

Extensions

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
  

SQL92

Clause SELECT

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.

Clause UNION

La syntaxe SQL92 pour UNION admet une clause additionnelle CORRESPONDING BY :
 
table_query UNION [ALL]
    [CORRESPONDING [BY (column [,...])]]
    table_query
     

La clause CORRESPONDING BY n'est pas supportée par Postgres.