INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN com exemplos práticos.
GROUP BY, HAVING, funções de agregação COUNT, SUM, AVG, MIN, MAX.
Subconsultas correlacionadas e funções de janela ROW_NUMBER, RANK.
Ao final, o aluno deve combinar tabelas com JOINs e produzir relatórios com agrupamentos.
Uma relação está em 1FN quando todos os atributos são atômicos: cada interseção de linha e coluna armazena exatamente um valor do domínio, sem coleções, listas ou estruturas aninhadas.
| id | nome | telefones |
|---|---|---|
| 1 | Ana | 9999-1, 9999-2 |
| 2 | Bruno | 8888-3 |
Coluna telefones guarda múltiplos valores → inviabiliza filtros, joins e índices.
| usuario_id | telefone |
|---|---|
| 1 | 9999-1 |
| 1 | 9999-2 |
| 2 | 8888-3 |
Cada telefone vira uma linha própria → consultas previsíveis e indexáveis.
Uma relação está em 2FN se está em 1FN e nenhum atributo não-chave depende parcialmente da chave primária. A 2FN só faz diferença quando há chave composta — com chave simples, 1FN ⇒ 2FN automaticamente.
pedido_itens(pedido_id, produto_id, nome_produto, preco_unit, quantidade)
nome_produto e preco_unit dependem só de produto_id — parte da chaveprodutos(id, nome, preco_unit)
pedido_itens(pedido_id, produto_id, quantidade)
produtospedido_itens guarda só o que depende da chave inteiraUma relação está em 3FN se está em 2FN e nenhum atributo não-chave depende transitivamente da chave (cadeia chave → A → B, onde A e B são não-chave). Cada atributo deve descrever diretamente a chave primária.
pedidos(id, cliente_id, cep, cidade, estado)
cidade e estado dependem de cep, não da chave idid → cep → cidadeenderecos(cep, cidade, estado)
pedidos(id, cliente_id, cep)
enderecosSistemas reais têm dezenas de tabelas relacionadas. O JOIN permite combinar linhas de duas ou mais tabelas com base em uma coluna em comum — normalmente uma chave estrangeira (usuario_id) ligada à chave primária (id).
NULL se não houver correspondência.NULL se não houver correspondência.NULL onde não há correspondência em nenhum dos lados.O INNER JOIN e o LEFT JOIN são os mais usados no dia a dia. O RIGHT JOIN é equivalente ao LEFT JOIN com as tabelas invertidas. O FULL OUTER JOIN é raro mas útil para auditorias de dados.
| nome | pedido_id | total | status |
|---|---|---|---|
| Ana Lima | 10 | 249.90 | aprovado |
| Ana Lima | 11 | 89.00 | aprovado |
| Bruno Costa | 12 | 510.50 | aprovado |
LEFT JOIN retorna NULL para colunas da tabela direita quando não há correspondência. Use COALESCE(coluna, 0) para substituir NULL por zero.
"Mostre clientes que compraram mais de 5 vezes e gastaram mais de R$ 1.000" — isso é um HAVING, não um WHERE, pois os valores são calculados por grupo.
WHERE id = ?.BETWEEN).Sabemos guardar e consultar dados.
Vamos estruturar o sistema que usa esses dados.
A pergunta-chave agora: como desenhar as entidades de software que vão acessar essas tabelas? Como elas se comunicam, herdam comportamento e compõem outras? É aí que a UML entra como ponte entre o ER de dados e o código do back-end.
Três compartimentos: nome (topo), atributos (estado, no meio) e operações (comportamento, embaixo). A visibilidade controla quem enxerga cada elemento.
| Associação | A — B | Relação genérica entre duas classes |
| Agregação | A ◇— B | Todo–parte fraco (parte sobrevive) |
| Composição | A ◆— B | Todo–parte forte (parte morre com o todo) |
| Generalização | A ◁— B | Herança: B é especialização de A |
| Realização | A ◁┄ B | B implementa a interface A |
| Dependência | A ┄→ B | A usa B de forma transiente |
Multiplicidade nas pontas: 1, 0..1, *, 1..* — equivale à cardinalidade do ER e ao "1:1, 1:N, N:M" do banco. Cada associação UML será um JOIN no SQL.
+ listarPedidos()) vira um método que executa um JOINON DELETE CASCADE e estratégia transacionalJá temos os dados (estática) e o fluxo (dinâmica): conceitual = o que existe · lógico = como cada coisa é · sequência = quando e em que ordem · SQL = exatamente como. Falta o diagrama de classes — como tudo isso vira código orientado a objetos.
Esta aula: Visão Information — modelamos como dados de múltiplas tabelas se relacionam e como consultá-los com eficiência via JOINs.
Consultar dados compostos necessários às funcionalidades do sistema — JOINs entre tabelas relacionadas.
| DES Desempenho | ✅ Índices + EXPLAIN |
| CONF Confiabilidade | ✅ FK + integridade |
| USAB Usabilidade | — N/A |
| SUP Suportabilidade | → Consultas documentadas |
| SEG Segurança | → Acesso controlado ao DB |
Cenário: cliente confirma pedido com N produtos · sistema valida estoque · cria pedido · registra itens · reduz estoque — tudo em uma única transação ACID.
As cardinalidades já contam tudo: 1:N entre cliente e pedido, 1:N com composição entre pedido e itens (não vivem sozinhos), N:1 entre itens e produto.
Decisões-chave: email UK impede contas duplicadas · preco_un em itens_pedido congela o valor da venda (RN-02) · cada FK vira um JOIN no SQL final.
O que muda do ER: classes ganham operações (+confirmar(), +reduzirEstoque()) e a relação Pedido ◆-- ItemPedido é composição — o item morre com o pedido (= ON DELETE CASCADE). É a ponte para os Models do Back-End.