05.-Consulta de tablas

Para recuperar datos de una tabla, se consulta; para locual utilizamos la declaración SQL SELECT. La declaración se divide en una lista de selección (la parte que enumera las columnas a devolver), una lista de tablas (la parte que enumera las tablas a partir de las cuales recuperar los datos), y una calificación opcional (la parte que especifica cualquier restricción). Por ejemplo, para recuperar todas las filas de la tabla weather, escribimos:

SELECT * FROM weather;

Aquí * es una abreviatura para todas las columnas. 1 Así que el mismo resultado sería tenido con:

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

La salida debe 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 de columna simples, en la lista de selección. Por ejemplo, puede hacer:

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

Esto debería dar:

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

Observe cómo el AScláusula se utiliza para reetiquete la columna de salida. (El ASla cláusula es opcional.)

Una consulta puede ser calificada. WHEREcláusula que especifica qué filas se quieren. El WHEREcláusula contiene una expresión booleana (valor de la verdad), y sólo se devuelven filas para las que la expresión booleana es verdadera. Los habituales operadores booleanos (AND, OR, y NOT) están permitidos en la calificación. Por ejemplo, los siguientes recuperan el clima de San Francisco en días lluviosos:

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)

Puede solicitar que los resultados de una consulta sean devueltos en orden ordenado:

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 tipo no está completamente especificado, y por lo que podría obtener las filas de San Francisco en cualquier orden. Pero siempre obtendrías los resultados mostrados arriba si lo haces:

SELECT * FROM weather
    ORDER BY city, temp_lo;

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

SELECT DISTINCT city
    FROM weather;
     city
---------------
 Hayward
 San Francisco
(2 rows)

Una vez más, el pedido de la fila de resultados podría variar. Usted puede asegurar resultados consistentes mediante el uso de DISTINCTy ORDER BYen conjunto: 2

SELECT DISTINCT city
    FROM weather
    ORDER BY city;


  1. Mientras SELECT *es útil para las consultas fuera de las esposas, se considera ampliamente mal estilo en el código de producción, ya que añadir una columna a la tabla cambiaría los resultados. 

  2. En algunos sistemas de bases de datos, incluidas versiones anteriores de PostgreSQL, la implementación de DISTINCT automáticamente ordena las filas con lo que ORDER BY es innecesario. Pero esto no es requerido por el estándar SQL, y el PostgreSQL actual no garantiza que DISTINCT haga que las filas aparezcan ordenadas.