-- Quais professores estão lotados na Escola Superior de Engenharias, Tecnologia e Inovação?
SELECT nome
FROM professor
WHERE id_escola = 31;| nome |
|---|
| Gustavo Costa |
| Helena Carvalho |
| Igor Melo |
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.
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))\)
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.
| 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 |
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.
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:
| 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 |
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:
Sem o qualificador, o SQL lançará um erro de ambiguidade:
ERROR: column reference "id_escola" is ambiguous
| 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 |
| 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;| 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 |
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.