SELECT

Nombre

SELECT  --  Recupera registros desde una tabla o vista.

Synopsis

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    expression [ AS name ] [, ...]
    [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
    [ FROM table [ alias ] [, ...] ]
    [ WHERE condition ]
    [ GROUP BY column [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION [ ALL ] | INTERSECT | EXCEPT } select ]
    [ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ]
    [ FOR UPDATE [ OF class_name [, ...] ] ]
    LIMIT { count | ALL } [ { OFFSET | , } start ]
  

Inputs

expression

El nombre de una columna de la tabla o una expresi�n.

name

Especifica otro nombre para una columna o una expresi�n que utilice la cl�usula AS. Este nombre se utiliza principalmente como etiqueta para la columna de salid. El nombre no puede ser utilizado en las cl�usulas WHERE, GROUP BY o HAVING. Sin embargo, puede ser referenciado en cl�usulas ORDER BY.

TEMPORARY, TEMP

La tabla se crea solamente para esta sesi�n, y es autom�ticamente descartada al finalizar la misma.

new_table

Si se utiliza la cl�usula INTO TABLE, el resultado de la consulta se almacenar� en otra tabla con el nombre indicado. La tabla objetivo (new_table) ser� creada autom�ticamente y no deber� existir previamente a la utilizaci�n de este comando. Consulte el comando SELECT INTO para m�s informaci�n.

Nota

La declaraci�n CREATE TABLE AS tambi�n crear� una nueva tabla a partir de la consulta.

table

El nombre de una tabla existente a la que se refiere la cl�usula FROM.

alias

Un nombre alternativo para la tabla precedente table. Se utiliza para abreviar o eliminar ambig�edades en uniones dentro de una misma tabla.

condition

Una expresi�n booleana que da como resultado verdadero o falso (true or false). Consulte la cl�usula WHERE.

column

El nombre de una columna de la tabla.

select

Una declaraci�n de selecci�n (select) exceptuando la cl�usula ORDER BY.

Outputs

Registros

El conjunto completo de registros (filas) que resultan de la especificaci�n de la consulta.

count

La cantidad de registros (filas) devueltos por la consulta.

Descripci�n

SELECT devuelve registros de una o m�s tablas. Los candidatos a ser seleccionados son aquellos registros que cumplen la condici�n especificada con WHERE; si se omite WHERE, se retornan todos los registros. (Consulte Cl�usula WHERE.)

DISTINCT elimina registros duplicados del resultado. ALL (predeterminado) devolver� todos los registros, que cumplan con la consulta, incluyendo los duplicados.

DISTINCT ON elimina los registros que cumplen con todas las expresiones especificadas, manteniendo solamente el primer registro de cada conjunto de duplicados. Note que no se puede predecir cu�l ser� "el primer registro" a menos que se utilice ORDER BY para asegurar que el registro eseado es el que efectivamente aparece primero. Por ejemplo:

        SELECT DISTINCT ON (location) location, time, report
        FROM weatherReports
        ORDER BY location, time DESC;
   
recuperea el reporte de tiempo (weather report) m�s reciente para cada locaci�n (location). Pero si no se hubiera utilizado ORDER BY para forzar el orden descendente de los valores de fecha para cada locaci�n, se hubiesen recuperado reportes de una fecha impredecible para cada locaci�n.

La cl�usula GROUP BY permite al usuario dividir una tabla conceptualmente en grupos. (Consulte Cl�usula GROUP BY.)

La cl�usula HAVING especifica una tabla con grupos derivada de la eliminaci�n de grupos del resultado de la cl�usula previamente especificada. (Consulte Cl�usula HAVING.)

La cl�usula ORDER BY permite al usuario especificar si quiere los registros ordenados de manera ascendente o descendente utilizando los operadores de modo ASC y DESC. (Consulte Cl�usula ORDER BY.)

El operador UNION permite permite que el resultado sea una colecci�n de registros devueltos por las consultas involucradas. (Consulte Cl�usula UNION.)

El operador INTERSECT le da los registros comunes a ambas consultas. (Consulte Cl�usula INTERSECT.)

El operador EXCEPT le da los registros devueltos por la primera consulta que no se encuentran en la segunda consulta. (Consulte Cl�usula EXCEPT.)

La cl�usula FOR UPDATE permite a SELECT realizar un bloqueo exclusivo de los registros seleccionados.

La cl�usula LIMIT permite devolver al usuario un subconjunto de los registros producidos por la consulta. (Consulte Cl�usula LIMIT.)

Usted debe tener permiso de realizar SELECT sobre una tabla para poder leer sus valores. (Consulte las declaraciones GRANT/REVOKE).

Cl�usula WHERE

La condici�n opcional WHERE tiene la forma general:

WHERE boolean_expr
    
boolean_expr puede consistir de cualquier expresi�n cuyo resultado sea un valor booleano. En muchos casos, esta expresi�n ser�:
     expr cond_op expr
    
o
     log_op expr
    
donde cond_op puede ser uno de: =, <, <=, >, >= or <>, un operador condicional como ALL, ANY, IN, LIKE o operador definido localmente, y log_op puede ser uno de: AND, OR, NOT. La comparaci�n devuelve TRUE (verdadero) o FALSE (falso) y todas las instancias ser�n descartadas si la expresi�n resulta falsa.

Cl�usula GROUP BY

GROUP BY especifica una tabla con grupos derivada de la aplicaci�n de esta cl�usula:

	GROUP BY column [, ...]
    

GROUP BY condensar� en una sola fila todos aquellos registros que compartan los mismos valores para las columnas agrupadas. Las funciones de agregaci�n, si las hubiera, son computadas a trav�s de todas las filas que conforman cada grupo, produciendo un valor separado por cada uno de los grupos (mientras que sin GROUP BY, una funci�n de agregaci�n produce un solo valor computado a trav�s de todas las filas seleccionadas). Cuando GROUP BY est� presente, no es v�lido hacer referencia a columnas no agrupadas excepto dentro de funciones de agregaci�n, ya que habr�a m�s de un posible valor de retorno para una columna no agrupada.

Cl�usula HAVING

La condici�n opcional HAVING tiene la forma general:

HAVING cond_expr
    
donde cond_expr cumple las mismas condiciones que las especificadas para WHERE.

HAVING especifica una tabla con grupos derivada de la eliminaci�n de grupos, del resultado de la cl�usula previamente especificada, que no cumplen con cond_expr.

Cada columna referenciada en cond_expr debe referirse precisamente (sin ambig�edades) a una columna de grupo, a menos que la referencia aparezca dentro de una funci�n de agregaci�n.

Cl�usula ORDER BY

ORDER BY column [ ASC | DESC ] [, ...]
    

column puede ser tanto el nombre de una columna como un n�mero ordinal.

Los n�meros ordinales hacen referencia a la posici�n (de izquierda a derecha) de la columna. Esta caracter�stica hace posible definir un orden basado en una columna que no tiene un nombre adecuado. Esto nunca es absolutamente necesario ya que siempre es posible asignar un nombre a una columna calculada utilizando la cl�usula AS, por ej.:

	SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen;
    

A partir de la versi�n 6.4 de PostgreSQL, es tambi�n posible ordenar, con ORDER BY, seg�n expresiones arbitrarias, incluyendo campos que no aparecen en el resultado de SELECT. Por lo tanto, la siguiente declaraci�n es legal:

	SELECT name FROM distributors ORDER BY code;
    

Opcionalmente una puede agregar la palabra clave DESC (descendente) o ASC (ascendente) luego del nombre de cada columna en la cl�usula ORDER BY. Si no se especifica, se asume ASC de forma predeterminada. Alternativamente, puede indicarse un nombre de operador de orden espec�fico. ASC es equivalente a USING '<' y DESC es equivalente a USING '>'.

Cl�usula UNION

table_query UNION [ ALL ] table_query
    [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
donde table_query especifica cualquier declaraci�n SELECT sin la cl�usula ORDER BY.

El operador UNION permite que el resultado sea una colecci�n de registros devueltos por las consultas involucradas. Los dos SELECTs que representan los dos operandos directos de la UNION deben producir el mismo n�mero de columnas, y las columnas correspondientes deben ser de tipos de datos compatibles.

De forma predeterminada, el resultado de UNION no contiene registros duplicados a menos que se especifique la cl�usula ALL.

Si se utilizan varios operadores UNION en la misma declaraci�n SELECT se eval�an de izquierda a derecha. Note que la palabra clave ALL no es global, siendo aplicada solamente al par de tablas de resultado actual.

Cl�usula INTERSECT

table_query INTERSECT table_query
    [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
donde table_query especifica cualquier expresi�n SELECT sin la cl�usula ORDER BY.

El operador INTERSECT le da los registros comunes a ambas consultas. Los dos SELECTs que representan los operandos directos de la intersecci�n deben producir el mismo n�mero de columnas, y las columnas correspondientes deben ser de tipos de datos compatibles.

Si se utilizan varios operadores INTERSECT en la misma declaraci�n SELECT se eval�an de izquierda a derecha, a menos que se utilicen par�ntesis para modificar esto.

Cl�usula EXCEPT

table_query EXCEPT table_query
     [ ORDER BY column [ ASC | DESC ] [, ...] ]
    
donde table_query especifica cualquier expresi�n SELECT sin la cl�usula ORDER BY.

El operador EXCEPT le da los registros devueltos por la primera consulta pero no por la segunda. Los dos SELECTs que representan los operandos directos de la intersecci�n deben producir el mismo n�mero de columnas, y las columnas correspondientes deben ser de tipos de datos compatibles.

Si se utilizan varios operadores INTERSECT en la misma declaraci�n SELECT se eval�an de izquierda a derecha, a menos que se utilicen par�ntesis para modificar esto.

Cl�usula LIMIT

    LIMIT { count | ALL } [ { OFFSET | , } start ]
    OFFSET start
    
donde count especifica el m�ximo n�mero de registros a devolver y start especifica el n�mero de registros a saltear antes de empezar a devolver registros.

LIMIT le permite recuperar s�lo una porci�n de los registros que se generan por el resto de la consulta. Si se especifica un n�mero l�mite, no se devolver�n m�s registros que esa cantidad. Si se da un valor de desplazamiento, esa cantidad de registros ser� salteada antes de comenzar a devolver registros.

Cuando se utiliza LIMIT es una buena idea utilizar la cl�usula ORDER BY para colocar los registros del resultado en un orden �nico. De otra forma obtendr� un subconjunto impredecible de los registros de la consulta --- tal vez est� buscando los registros del d�cimo al vig�simo, �pero del d�cimo al vig�simo en qu� orden? Usted no conoce el orden a menos que utilice ORDER BY.

Ya en Postgres 7.0, el optimizador de consultas toma en cuenta a LIMIT cuando genera un plan de consulta, as� que es muy factible que usted obtenga diferentes planes (abarcando diferentes criterios de ordenamiento de registros) dependiendo de los valores dados a LIMIT y OFFSET. Por lo tanto, utilizar diferentes valores para LIMIT/OFFSET para seleccionar diferentes subconjuntos del resultado de una consulta, provocar� resultados inconsistentes a menos que usted se asegura un resultado predecible ordenando con ORDER BY. Esto no es un bug; es una consecuencia inherente al hecho de que SQL no establece ning�n compromiso de entregar los resultados de una consulta en un orden en particular a menos que se utilice ORDER BY para especificar un criterio de orden expl�citamente.

Uso

Para unir la tabla films con la tabla 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
   

Para sumar la columna len (duraci�n) de todos los filmes y agrupar los resultados seg�n la columna kind (tipo):

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
   

Para sumar la columna len de todos los filmes, agrupar los resultados seg�n la columna kind y mostrar los totales de esos grupos que sean menores a 5 horas:

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
   

Los siguientes dos ejemplos muestran maneras id�nticas de ordenar los resultados individuales de acuerdo con los contenidos de la segunda columna (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
   

Este ejemplo muestra c�mo obtener la union de las tablas distributors y actors, restringiendo los resultados a aquellos que comienzan con la letra W en cada tabla. No se quieren duplicados, as� que la palabra clave ALL se omite.

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

Compatibilidad

Extensiones

Postgres permite omitir la cl�usula FROM de una consulta. Esta caracter�stica fue conservada del lenguaje original de consulta PostQuel:

SELECT distributors.* WHERE name = 'Westwood';

    did|name
    ---+----------------
    108|Westward
  

SQL92

Cl�usula SELECT

En el est�ndar SQL92, la palabra clave opcional "AS" es totalmente prescindible y puede ser omitida sin afectar el significado. El analizador sint�ctico de Postgres requiere la presencia de esta palabra cuando se renombran columnas debido a las caracter�sticas de extensibilidad de tipos que pueden llevar a interpretaciones ambiguas en este contexto.

DISTINCT ON no es parte de SQL92. Tampoco los son LIMIT y OFFSET.

Cl�usula UNION

La sintaxis de SQL92 para UNION admite una cl�usula adicional CORRESPONDING BY:

 
table_query UNION [ALL]
    [CORRESPONDING [BY (column [,...])]]
    table_query
     

La cl�usula CORRESPONDING BY no es soportada por Postgres.