2.5. Consultar una tabla #

Para recuperar datos de una tabla, esta se consulta. Para hacer esto se utiliza una sentencia SELECT de SQL. La sentencia se divide en una lista de selección (la parte que lista las columnas que se van a devolver), una lista de tablas (la parte que lista las tablas de las que se van a recuperar los datos) y una condición (qualification) opcional (la parte que especifica cualquier restricción). Por ejemplo, para recuperar todas las filas de la tabla weather, escribe:

SELECT * FROM weather;

Aquí * es una abreviatura de todas las columnas. [2] Por lo tanto, se obtendría el mismo resultado con:

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

La salida debería ser:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

Puedes escribir expresiones, no solo referencias simples a columnas, en la lista de selección. Por ejemplo, puedes hacer lo siguiente:

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

Esto debería devolver:

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

Observa cómo se utiliza la cláusula AS para cambiar el nombre de la columna de salida. (La cláusula AS es opcional).

Una consulta puede ser restringida o calificada añadiendo una cláusula WHERE que especifique qué filas se desean. La cláusula WHERE contiene una expresión booleana (valor de verdad), y solo se devuelven las filas para las cuales la expresión booleana sea verdadera. Se permiten los operadores booleanos habituales (AND, OR y NOT) en la condición. Por ejemplo, la siguiente consulta recupera el clima de San Francisco en los días de lluvia:

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

Resultado:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

Puedes solicitar que los resultados de una consulta se devuelvan en orden:

SELECT * FROM weather
    ORDER BY city;

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

En este ejemplo, el orden de clasificación no está completamente especificado, por lo que podrías obtener las filas de San Francisco en cualquier orden. Pero siempre obtendrías los resultados mostrados anteriormente si haces lo siguiente:

SELECT * FROM weather
    ORDER BY city, temp_lo;

Puedes solicitar que se eliminen las filas duplicadas del resultado de una consulta:

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

Aquí también, el orden de las filas del resultado podría variar. Puedes asegurar resultados consistentes utilizando DISTINCT y ORDER BY juntos: [3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;



[2] Aunque SELECT * es útil para consultas rápidas, se considera ampliamente un mal estilo en código de producción, ya que añadir una columna a la tabla cambiaría los resultados.

[3] En algunos sistemas de bases de datos, incluyendo versiones anteriores de PostgreSQL, la implementación de DISTINCT ordena automáticamente las filas, por lo que ORDER BY no es necesario. Pero esto no es requerido por el estándar SQL, y el actual PostgreSQL no garantiza que DISTINCT haga que las filas se ordenen.