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 ] |
El nombre de una columna de la tabla o una expresi�n.
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.
La tabla se crea solamente para esta sesi�n, y es autom�ticamente descartada al finalizar la misma.
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.
La declaraci�n CREATE TABLE AS tambi�n crear� una nueva tabla a partir de la consulta. |
El nombre de una tabla existente a la que se refiere la cl�usula FROM.
Un nombre alternativo para la tabla precedente table. Se utiliza para abreviar o eliminar ambig�edades en uniones dentro de una misma tabla.
Una expresi�n booleana que da como resultado verdadero o falso (true or false). Consulte la cl�usula WHERE.
El nombre de una columna de la tabla.
Una declaraci�n de selecci�n (select) exceptuando la cl�usula ORDER BY.
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; |
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).
La condici�n opcional WHERE tiene la forma general:
WHERE boolean_expr |
expr cond_op expr |
log_op expr |
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.
La condici�n opcional HAVING tiene la forma general:
HAVING cond_expr |
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.
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 '>'.
table_query UNION [ ALL ] table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
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.
table_query INTERSECT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
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.
table_query EXCEPT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ] |
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.
LIMIT { count | ALL } [ { OFFSET | , } start ] OFFSET start |
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.
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 |
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 |
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.