Conteúdos da cadeira

Consultas SQL

SELECT, junções, agregação e subconsultas sobre a loja.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

A DML de leitura é o SELECT, e a sua estrutura segue a álgebra relacional: filtra linhas (WHERE), combina tabelas (JOIN), agrupa (GROUP BY), filtra grupos (HAVING) e projeta colunas (SELECT). A ordem de escrita é fixa, SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY, mesmo quando só usas metade das cláusulas.

Filtrar e ordenar

“Produtos com preço acima de 30, do mais caro ao mais barato”:

SELECT nome, preco FROM Produto
WHERE preco > 30
ORDER BY preco DESC;

Resultado: Monitor 180.0, Teclado 45.0. O WHERE é a seleção σ\sigma, a lista do SELECT é a projeção π\pi. Repara que o Rato ficou de fora pelo filtro e a ordem é decrescente pelo DESC.

Juntar e agregar

“Total gasto por cada cliente, incluindo quem nunca comprou”:

SELECT Cliente.nome, COALESCE(SUM(Item.qtd * Produto.preco), 0) AS total
FROM Cliente
LEFT JOIN Encomenda ON Encomenda.idCliente = Cliente.id
LEFT JOIN Item ON Item.idEncomenda = Encomenda.id
LEFT JOIN Produto ON Produto.id = Item.idProduto
GROUP BY Cliente.nome
ORDER BY total DESC;

O LEFT JOIN mantém os clientes sem encomendas, onde a soma seria nula e o COALESCE a converte em 0. Contas: Ana, 2 Teclados (90) mais 1 Rato (25) mais 1 Monitor (180), total 295; Rui, 3 Ratos, total 75; Mia, sem linhas, total 0. Resultado: Ana 295.0, Rui 75.0, Mia 0.0.

Duas armadilhas habituais: agregar sem GROUP BY quando há colunas soltas, e filtrar grupos com WHERE em vez de HAVING. WHERE filtra linhas antes de agrupar; HAVING filtra grupos depois. “Clientes com total acima de 100” acrescenta HAVING total > 100 e devolve só a Ana.

Subconsultas

“Clientes que compraram o Monitor”, com uma subconsulta que primeiro descobre quem:

SELECT nome FROM Cliente
WHERE id IN (
  SELECT Encomenda.idCliente FROM Encomenda
  JOIN Item ON Item.idEncomenda = Encomenda.id
  JOIN Produto ON Produto.id = Item.idProduto
  WHERE Produto.nome = 'Monitor'
);

A consulta interior devolve o cliente 1 (a encomenda 101 leva o produto 12) e a exterior traduz para Ana. Sempre que a pergunta tem um “os X que …” com condição noutra tabela, uma subconsulta com IN é a formulação direta.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.