Cláusula SELECT

Autor

Douglas Braga

A cláusula SELECT determina quais colunas (ou expressões) aparecem no resultado de uma consulta. Ela oferece recursos além de simplesmente listar nomes de colunas: eliminação de duplicatas, expressões aritméticas, aliases e literais.

DISTINCT: Eliminando Duplicatas

Por padrão, o SQL não elimina linhas duplicadas no resultado — comportamento chamado de ALL. Para remover duplicatas, usa-se a palavra-chave DISTINCT.

-- Sem DISTINCT: lista o id_escola de cada professor (com repetição)
SELECT id_escola
FROM   professor;
7 records
id_escola
21
21
31
31
31
11
11
-- Com DISTINCT: cada id_escola aparece apenas uma vez
SELECT DISTINCT id_escola
FROM   professor;
3 records
id_escola
11
21
31

Os 7 professores são distribuídos entre 3 escolas distintas (ids: 11, 21, 31). DISTINCT elimina as repetições.

SELECT *

O asterisco * seleciona todas as colunas da tabela:

-- Retorna todas as colunas de professor
SELECT *
FROM   professor;
7 records
id_prof nome id_escola ch_semanal salario
21200001 Eduarda Souza 21 20 3200
21400002 Felipe Araujo 21 40 6400
31200001 Gustavo Costa 31 20 3300
31400002 Helena Carvalho 31 40 6700
31200003 Igor Melo 31 20 3100
11400001 Bruno Teixeira 11 40 6500
11400002 Carla Pinto 11 40 6600

Embora prático para exploração, o uso de SELECT * em aplicações de produção é desaconselhado, pois o resultado depende da estrutura atual da tabela e pode mudar se colunas forem adicionadas ou reordenadas.

Expressões Aritméticas

A cláusula SELECT pode conter expressões aritméticas com os operadores +, -, * e /:

-- Simular um reajuste de 10% no salário dos professores sem alterar o banco
SELECT nome, id_escola, salario,
       ROUND(salario * 1.10, 2) AS salario_reajustado
FROM   professor;
7 records
nome id_escola salario salario_reajustado
Eduarda Souza 21 3200 3520
Felipe Araujo 21 6400 7040
Gustavo Costa 31 3300 3630
Helena Carvalho 31 6700 7370
Igor Melo 31 3100 3410
Bruno Teixeira 11 6500 7150
Carla Pinto 11 6600 7260
Nota

A expressão salario * 1.10 não altera o banco de dados. Ela cria uma coluna calculada apenas no resultado da consulta. Para alterar os dados de fato, seria necessário usar UPDATE (ver seção 3.10).

Alias com AS

A palavra-chave AS permite renomear colunas e tabelas no resultado — o nome alternativo é chamado de alias:

-- Alias em coluna: renomeia colunas no resultado
SELECT nome AS professor, id_escola AS escola_id
FROM   professor
WHERE  id_escola = 31;
3 records
professor escola_id
Gustavo Costa 31
Helena Carvalho 31
Igor Melo 31

Aliases de tabela são especialmente úteis em consultas com múltiplas tabelas:

-- Alias de tabela: p para professor, e para escola
SELECT p.nome, e.nome_escola
FROM   professor AS p, escola AS e
WHERE  p.id_escola = e.id_escola
  AND  p.id_escola = 11;
2 records
nome nome_escola
Bruno Teixeira Escola Superior de Gestão
Carla Pinto Escola Superior de Gestão

Literais no SELECT

É possível incluir valores literais (constantes) na cláusula SELECT:

-- Adiciona uma coluna com o texto fixo 'UnDF'
SELECT 'UnDF' AS instituicao, nome, id_escola
FROM   professor
WHERE  id_escola = 31;
3 records
instituicao nome id_escola
UnDF Gustavo Costa 31
UnDF Helena Carvalho 31
UnDF Igor Melo 31

Resumo da cláusula SELECT:

  • SELECT coluna — projeta uma coluna específica
  • SELECT DISTINCT coluna — elimina duplicatas
  • SELECT * — projeta todas as colunas
  • SELECT expressão AS alias — projeta uma expressão com nome alternativo
  • SELECT 'literal' AS alias — inclui uma constante no resultado

Para Praticar

-- CASE no SELECT: categorizar professores por regime de trabalho
SELECT nome, ch_semanal, salario,
       CASE
           WHEN ch_semanal = 40 THEN 'Regime integral'
           WHEN ch_semanal = 20 THEN 'Regime parcial'
           ELSE                      'Outro'
       END AS regime
FROM   professor
ORDER BY ch_semanal DESC, nome;
7 records
nome ch_semanal salario regime
Bruno Teixeira 40 6500 Regime integral
Carla Pinto 40 6600 Regime integral
Felipe Araujo 40 6400 Regime integral
Helena Carvalho 40 6700 Regime integral
Eduarda Souza 20 3200 Regime parcial
Gustavo Costa 20 3300 Regime parcial
Igor Melo 20 3100 Regime parcial
-- Concatenação de strings: montar identificação completa da turma
SELECT CAST(id_disciplina AS TEXT) || '/' || CAST(ano AS TEXT) || '-' || CAST(semestre AS TEXT) || '/' || CAST(turma AS TEXT) AS id_turma,
       id_prof,
       sala
FROM   ministra
ORDER BY id_turma;
Displaying records 1 - 10
id_turma id_prof sala
1110201/2023-2/1 11400001 ESG-SALA-005
1110201/2024-2/1 11400001 ESG-SALA-013
1110201/2025-2/1 11400001 ESG-SALA-025
1110202/2023-2/1 11400001 ESG-SALA-012
1110202/2024-2/1 11400001 ESG-SALA-001
1110202/2025-2/1 11400002 ESG-SALA-007
1110401/2024-2/1 11400001 ESG-SALA-009
1110401/2025-2/1 11400001 ESG-SALA-021
1110402/2024-2/1 11400001 ESG-SALA-001
1110402/2025-2/1 11400001 ESG-SALA-005
-- DISTINCT com múltiplas colunas: combinações únicas de id_escola e ch_semanal
SELECT DISTINCT id_escola, ch_semanal
FROM   professor
ORDER BY id_escola, ch_semanal;
5 records
id_escola ch_semanal
11 40
21 20
21 40
31 20
31 40
Nota

DISTINCT com múltiplas colunas elimina duplicatas de combinações — não de cada coluna individualmente. A consulta acima retorna cada par (id_escola, ch_semanal) único.