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.