Consultando una tabla
Para obtener datos desde una tabla, esta es consultada. Para esto se usa una sentencia SQL SELECT. La sentencia es dividida en una lista de selección (la parte que lista las columnas a ser devueltas), una lista de tablas (la parte que lista las tablas desde las cuales se obtendrán los datos), y una limitación opcional (la parte que especifíca las restricciones). Por ejemplo, para obtener todas las filas de la tabla clima, escribir:
SELECT * FROM clima;
Aquí * es un atajo para "todas las columnas". [1] Por lo que tendríamos el mismo efecto con:
SELECT ciudad, temp_min, temp_max, prcp, fecha FROM clima;
La salida sería:
ciudad | temp_min | temp_max | prcp | fecha ---------------+----------+----------+------+------------ San Francisco | 46 | 50 | 0.25 | 1994-11-27 San Francisco | 43 | 57 | 0 | 1994-11-29 Hayward | 37 | 54 | | 1994-11-29 (3 filas)
Puede escribir expresiones, no sólo referencias simples a columnas, en la lista de selección. Por ejemplo, puede hacer:
SELECT ciudad, (temp_min+temp_max)/2 AS temp_prom, fecha FROM clima;
Debería darnos:
ciudad | temp_prom | date ---------------+-----------+------------ San Francisco | 48 | 1994-11-27 San Francisco | 50 | 1994-11-29 Hayward | 45 | 1994-11-29 (3 filas)
Notar como la clausula AS es usada para reetiquetar la columna de salida. (La clausula AS es opcional.)
Una consulta puede ser "limitado" al agregar una clausula WHERE que especifica que filas son requerida. La clausula WHERE contiene una expresión Booleana (valor de verdad), y solo son devueltas las filas para la cual la expresión Booleana es verdadera. Los operadores Booleanos usuales (AND, OR, y NOT) son permitidos en la limitación. Por ejemplo, lo siguiente obtiene el clima de San Francisco para los días lluviosos:
SELECT * FROM clima
WHERE ciudad = 'San Francisco' AND prcp > 0.0;
Resulta:
ciudad | temp_min | temp_max | prcp | fecha ---------------+----------+----------+------+------------ San Francisco | 46 | 50 | 0.25 | 1994-11-27 (1 fila)
Puede requerir que los resultados de una consulta sean devueltos de forma ordenada:
SELECT * FROM clima
ORDER BY ciudad;
ciudad | temp_min | temp_max | prcp | fecha ---------------+----------+----------+------+------------ Hayward | 37 | 54 | | 1994-11-29 San Francisco | 43 | 57 | 0 | 1994-11-29 San Francisco | 46 | 50 | 0.25 | 1994-11-27
En el ejemplo, el orden no esta del todo especificado, y podría obtener las filas de San Francisco en cualquier orden. Pero siempre obtiene los resultados mostrados arriba si hace:
SELECT * FROM clima
ORDER BY ciudad, temp_min;
Puede requerir que las filas duplicadas sean removidas del resultado de una consulta:
SELECT DISTINCT ciudad
FROM clima;
ciudad --------------- Hayward San Francisco (2 filas)
Nuevamente aquí, el orden del resultado puede variar. Puede asegurarse resultados consistentes usando DISTINCT y ORDER BY juntas: [2]
SELECT DISTINCT ciudad
FROM clima
ORDER BY ciudad;
Nota 1
Mientras que SELECT * es útil para consultas rápidas, es considerado ampliamente como un mal estilo en código de producción, dado que agregar columnas a la tabla cambiaría los resultados.
Nota 2
En algunos sistemas de base de datos, incluyendo versiones viejas de PostgreSQL, la implementación de DISTINCT automáticamente ordena las filas por lo que el ORDER BY es innecesario. Pero esto no es requerido por el estándar SQL, y actualmente PostgreSQL no garantiza que la clausula DISTINCT cause que las filas sean ordenadas.
