Estrutura Básica: SELECT-FROM-WHERE

Autor

Douglas Braga

A consulta SQL mais fundamental é composta por três cláusulas obrigatórias: SELECT, FROM e WHERE. Essa estrutura corresponde diretamente às operações da álgebra relacional estudadas no Capítulo 2.

Forma Geral

SELECT  A1, A2, ..., An       -- atributos a serem retornados
FROM    r1, r2, ..., rm       -- tabelas envolvidas
WHERE   condição;             -- critério de filtragem (opcional)

Correspondência com a Álgebra Relacional

Cada cláusula da consulta SQL corresponde a uma operação da álgebra relacional:

Cláusula SQL Operação equivalente Descrição
SELECT A1, A2 Projeção (\(\Pi\)) Escolhe quais colunas exibir
WHERE condição Seleção (\(\sigma\)) Filtra as linhas que satisfazem a condição
FROM r1, r2 Produto cartesiano (\(\times\)) Combina as tabelas listadas

A consulta SELECT A FROM r WHERE condição equivale a: \(\Pi_A(\sigma_{cond}(r))\)

Exemplo 1: Nomes dos Professores da ESETI

-- Quais professores estão lotados na Escola Superior de Engenharias, Tecnologia e Inovação?
SELECT nome
FROM   professor
WHERE  id_escola = 31;
3 records
nome
Gustavo Costa
Helena Carvalho
Igor Melo

Exemplo 2: Nomes e Escola dos Professores da EEMA

-- Quais professores pertencem à Escola de Educação, Magistério e Arte?
SELECT nome, id_escola
FROM   professor
WHERE  id_escola = 21;
2 records
nome id_escola
Eduarda Souza 21
Felipe Araujo 21

Exemplo 3: Produto Cartesiano com Múltiplas Tabelas

Quando duas ou mais tabelas são listadas na cláusula FROM, o SQL produz o produto cartesiano entre elas — cada linha da primeira tabela é combinada com cada linha da segunda. O resultado deve ser filtrado com WHERE para ser significativo.

-- Nomes dos professores com os dados da escola e do centro ao qual pertencem
SELECT p.nome, e.nome_escola, e.id_centro
FROM   professor p, escola e
WHERE  p.id_escola = e.id_escola;
7 records
nome nome_escola id_centro
Eduarda Souza Escola de Educação, Magistério e Arte 2
Felipe Araujo Escola de Educação, Magistério e Arte 2
Gustavo Costa Escola Superior de Engenharias, Tecnologia e Inovação 3
Helena Carvalho Escola Superior de Engenharias, Tecnologia e Inovação 3
Igor Melo Escola Superior de Engenharias, Tecnologia e Inovação 3
Bruno Teixeira Escola Superior de Gestão 1
Carla Pinto Escola Superior de Gestão 1
Nota

A condição p.id_escola = e.id_escola na cláusula WHERE funciona como uma junção entre as tabelas. Sem essa condição, o resultado seria o produto cartesiano completo: 7 professores × 3 escolas = 21 linhas, a maioria sem sentido.

A sintaxe com JOIN explícito — abordada em capítulos posteriores — é a forma preferida para expressar junções com clareza.

Exemplo 4: Junção com Autorreferência (Pré-requisitos)

Quando uma tabela referencia a si mesma, precisamos incluí-la duas vezes na cláusula FROM com aliases distintos. A tabela prereq tem duas FKs para disciplina — usamos d para a disciplina e p para o pré-requisito:

-- Nome de cada disciplina e de seu(s) pré-requisito(s)
SELECT d.nome_disciplina AS disciplina,
       p.nome_disciplina AS prereq
FROM   prereq pr, disciplina d, disciplina p
WHERE  pr.id_disciplina = d.id_disciplina
  AND  pr.id_prereq     = p.id_disciplina
ORDER BY d.id_curso, d.id_disciplina;
Displaying records 1 - 10
disciplina prereq
Microeconomia 2 História Econômica Geral
Economia Brasileira Microeconomia 2
Orçamento e Finanças Públicas Macroeconomia 2
Monografia Orçamento e Finanças Públicas
Monografia Economia Brasileira
Eletiva I Desenvolvimento Humano
Eletiva II Eletiva I
Tecnologia Educacional - Design Eletiva II
Bases da Eng. de Software 4 Bases da Eng. de Software 2
Projeto Aplicado 4 - blockchain Projeto Aplicado 2 - site WEB

Notação com Qualificador de Tabela

Quando o mesmo nome de coluna aparece em mais de uma tabela (como id_escola em professor e em escola), é necessário qualificar o nome da coluna com o nome da tabela ou alias:

p.id_escola   -- coluna id_escola da tabela professor (alias p)
e.id_escola   -- coluna id_escola da tabela escola (alias e)

Sem o qualificador, o SQL lançará um erro de ambiguidade:

ERROR: column reference "id_escola" is ambiguous

Para Praticar

-- Três tabelas em cadeia: nome do professor, escola e centro
SELECT p.nome, e.nome_escola, c.nome_centro
FROM   professor p, escola e, centro c
WHERE  p.id_escola = e.id_escola
  AND  e.id_centro = c.id_centro
ORDER BY c.id_centro, p.nome;
7 records
nome nome_escola nome_centro
Bruno Teixeira Escola Superior de Gestão Ciências Humanas, Cidadania e Meio Ambiente
Carla Pinto Escola Superior de Gestão Ciências Humanas, Cidadania e Meio Ambiente
Eduarda Souza Escola de Educação, Magistério e Arte Centro de Educação, Magistério e Artes
Felipe Araujo Escola de Educação, Magistério e Arte Centro de Educação, Magistério e Artes
Gustavo Costa Escola Superior de Engenharias, Tecnologia e Inovação Centro de Engenharias, Tecnologia e Inovação
Helena Carvalho Escola Superior de Engenharias, Tecnologia e Inovação Centro de Engenharias, Tecnologia e Inovação
Igor Melo Escola Superior de Engenharias, Tecnologia e Inovação Centro de Engenharias, Tecnologia e Inovação
-- Produto cartesiano completo: quantas linhas gera professor × escola?
-- (7 × 3 = 21 — sem filtro WHERE)
SELECT COUNT(*) AS total_produto_cartesiano
FROM   professor, escola;
1 records
total_produto_cartesiano
21
-- Alunos cujo ano de ingresso coincide com o ano da disciplina que cursaram
-- (caso limite: comparação entre atributos de tabelas diferentes)
SELECT DISTINCT a.nome, a.ano_ingresso, md.id_disciplina
FROM   aluno a, matricula_disciplina md
WHERE  a.id_aluno     = md.id_aluno
  AND  a.ano_ingresso = md.ano
ORDER BY a.nome;
Displaying records 1 - 10
nome ano_ingresso id_disciplina
Amanda Moreira 2023 2110201
Amanda Moreira 2023 2110202
Beatriz Carvalho 2023 1110201
Beatriz Carvalho 2023 1110202
Camila Teixeira 2025 1110201
Camila Teixeira 2025 1110202
Carolina Lima 2024 2110201
Carolina Lima 2024 2110202
Diego Correia 2025 3110201
Diego Correia 2025 3110202
Nota

A última consulta compara aluno.ano_ingresso com matricula_disciplina.ano — um predicado entre atributos de tabelas diferentes, perfeitamente válido em SQL. Ela retorna alunos que cursaram disciplinas no mesmo ano em que ingressaram no curso.