2.5. Consultar tabelas

Para trazer os dados de uma tabela, a tabela deve ser consultada. Para esta finalidade é utilizado o comando SELECT do SQL. Este 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 digite:

SELECT * FROM clima;

Aqui o * é uma forma abreviada de "todas as colunas". [1] 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
-----------------+----------+----------+------+------------
 São Francisco   |       46 |       50 | 0.25 | 1994-11-27
 São Francisco   |       43 |       57 |    0 | 1994-11-29
 Hayward         |       37 |       54 |      | 1994-11-29
(3 linhas)

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

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

devendo produzir:

     cidade      | temp_media |    data
-----------------+------------+------------
 São Francisco   |         48 | 1994-11-27
 São Francisco   |         50 | 1994-11-29
 Hayward         |         45 | 1994-11-29
(3 linhas)

Perceba que a cláusula AS foi utilizada para mudar o nome da coluna de 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), e somente são 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 São Francisco nos dias de chuva:

SELECT * FROM clima
    WHERE cidade = 'São Francisco' AND prcp > 0.0;

Resultado:

     cidade      | temp_min | temp_max | prcp |    data
-----------------+----------+----------+------+------------
 São Francisco   |       46 |       50 | 0.25 | 1994-11-27
(1 linha)

Pode ser solicitado que os resultados da consulta sejam retornados em uma determinada ordem:

SELECT * FROM clima
    ORDER BY cidade;
     cidade      | temp_min | temp_max | prcp |    data
-----------------+----------+----------+------+------------
 Hayward         |       37 |       54 |      | 1994-11-29
 São Francisco   |       43 |       57 |    0 | 1994-11-29
 São Francisco   |       46 |       50 | 0.25 | 1994-11-27

Neste exemplo a ordem de classificação não está totalmente especificada e, portanto, as linhas de São Francisco 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: [2]

SELECT DISTINCT cidade
    FROM clima;

    cidade
---------------
 Hayward
 São Francisco
(2 linhas)

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

SELECT DISTINCT cidade
    FROM clima
    ORDER BY cidade;

Notas

[1]

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.

[2]

Oracle — Deve ser especificado DISTINCT ou UNIQUE se for desejado que o banco de dados retorne apenas um cópia de cada conjunto de linhas duplicadas selecionadas. Estas duas palavras chave são sinônimos. As linhas duplicadas são aquelas com valores correspondentes para cada expressão da lista de seleção. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.)

[3]

Em alguns sistemas de banco de dados, incluindo as 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 isto não é requerido pelo padrão SQL, e o PostgreSQL corrente não garante que DISTINCT faça com que as linhas sejam ordenadas.

[4]

Oracle — A seguinte restrição se aplica à cláusula ORDER BY: Se for especificado o operador DISTINCT no comando SELECT, então a cláusula ORDER BY não poderá fazer referência a colunas, a menos que estas apareçam na lista de seleção. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (Foi observado que esta restrição também se aplica ao PostgreSQL, ao DB2 e ao SQL Server). (N. do T.)

SourceForge.net Logo CSS válido!