2.5. Consultar uma tabela #

Para trazer os dados de uma tabela, a tabela deve ser consultada. Para esta finalidade é utilizado o comando SELECT do SQL. Esse comando é dividido em lista de seleção (a parte que especifica as colunas a serem trazidas), lista de tabelas (a parte que especifica as tabelas de onde os dados vão ser trazidos), e uma qualificação opcional (a parte onde são especificadas as restrições). Por exemplo, para trazer todas as linhas da tabela clima, execute:

SELECT * FROM clima;

Aqui o * é uma forma abreviada para todas as colunas. [9] Seriam obtidos os mesmos resultados usando:

SELECT cidade, temp_min, temp_max, prcp, data
    FROM clima;

A saída deve ser:

       cidade        | temp_min | temp_max | prcp |    data
---------------------+----------+----------+------+------------
 Salvador - BA       |       21 |       28 |  3.4 | 2022-06-25
 Salvador - BA       |       23 |       27 |    0 | 2022-06-26
 Rio de Janeiro - RJ |       17 |       29 |      | 2022-06-29
(3 linhas)

Na lista de seleção podem ser escritas expressões, e não apenas referências a colunas. Por exemplo, pode ser executado:

SELECT cidade,
       (temp_min+temp_max)/2 AS temp_media,
       data
    FROM clima;

devendo produzir:

       cidade        | temp_media |    data
---------------------+------------+------------
 Salvador - BA       |         24 | 2022-06-25
 Salvador - BA       |         25 | 2022-06-26
 Rio de Janeiro - RJ |         23 | 2022-06-29
(3 linhas)

Perceba que a cláusula AS foi utilizada para mudar o nome da coluna na saída (a cláusula AS é opcional).

A consulta pode ser qualificada, adicionando a cláusula WHERE para especificar as linhas desejadas. A cláusula WHERE contém expressões booleanas (valor verdade), fazendo com que somente sejam retornadas as linhas para as quais o resultado da expressão booleana for verdade. São permitidos os operadores booleanos usuais (AND, OR e NOT) na qualificação. Por exemplo, o comando abaixo mostra o clima de Salvador - BA nos dias de chuva:

SELECT *
    FROM clima
    WHERE cidade = 'Salvador - BA'
      AND prcp > 0;

Resultado:

    cidade     | temp_min | temp_max | prcp |    data
---------------+----------+----------+------+------------
 Salvador - BA |       21 |       28 |  3.4 | 2022-06-25
(1 linha)

Pode ser solicitado que os resultados da consulta sejam retornados de forma ordenada:

SELECT *
    FROM clima
    ORDER BY cidade;

       cidade        | temp_min | temp_max | prcp |    data
---------------------+----------+----------+------+------------
 Rio de Janeiro - RJ |       17 |       29 |      | 2022-06-29
 Salvador - BA       |       21 |       28 |  3.4 | 2022-06-25
 Salvador - BA       |       23 |       27 |    0 | 2022-06-26
(3 linhas)

Neste exemplo a ordem de classificação não está completamente especificada, portanto as linhas de Salvador - BA podem retornar em qualquer ordem. Mas sempre seriam obtidos os resultados mostrados acima se fosse executado:

SELECT *
    FROM clima
    ORDER BY cidade, temp_min;

Pode ser solicitado que as linhas duplicadas sejam removidas do resultado da consulta:

SELECT DISTINCT cidade
    FROM clima;

       cidade
---------------------
 Rio de Janeiro - RJ
 Salvador - BA
(2 linhas)

Novamente, neste exemplo a ordem das linhas pode variar. Pode-se garantir resultados consistentes utilizando DISTINCT e ORDER BY juntos: [10]

SELECT DISTINCT cidade
    FROM clima
    ORDER BY cidade;

       cidade
---------------------
 Rio de Janeiro - RJ
 Salvador - BA
(2 linhas)



[9] Embora o SELECT * seja útil para consultas improvisadas, é geralmente considerado um estilo ruim para código em produção, uma vez que a adição de uma coluna à tabela mudaria os resultados.

[10] Em alguns sistemas de banco de dados, incluindo versões antigas do PostgreSQL, a implementação do DISTINCT ordena automaticamente as linhas e, por isso, o ORDER BY não é necessário. Mas isso não é requerido pelo padrão SQL, e o PostgreSQL atual não garante que o DISTINCT faça com que as linhas sejam ordenadas.