Competições Senac RS · Seletiva 26 · Desenvolvimento de Sistemas
Banco de dados
impecável
Do enunciado ao modelo, do modelo ao banco que roda do zero.
Uma semana pra fechar o banco em nota 3.
10 a 14 de agosto · Módulo 03
Onde a gente vai chegar
Mapa da semana
| Aula | Quando | Assunto | Apostila |
| 1 | Seg 10, manhã | Do enunciado ao modelo | §1 §2 §3 |
| 2 | Seg 10, tarde | Chaves, nomenclatura e DER completo | §3.4 §4 §10 |
| 3 | Ter 11, manhã | Normalização e ligação circular | §5 §6 |
| 4 | Qua 12, manhã | Integridade, constraints e tipos | §7 §8 §9 |
| 5 | Qui 13, manhã | Manipulação, consultas e JOINs | §12 §13 §14 |
| 6 | Sex 14, manhã | Agregação, views, índices e transações | §15 §16 §17 |
| — | Sex 14, tarde | Fechamento: banco nota 3 | §18 §19 §20 |
Módulo 03 · Revisão com aprofundamentoSeletiva 26 · Senac RS
O combinado
A promessa da semana
Ponto de partida
Vocês já sabem
O banco da Regional está feito. Ninguém começa do zero aqui.
O trabalho
Entender o porquê
Sair do "funciona" pro "funciona e eu sei defender cada decisão".
A entrega
Banco nota 3
Sexta à tarde, contra checklist, com o professor de banca.
🎯 Por que agora
Semana que vem começa a API, e ela vai se conectar exatamente nesse banco.
A semana que vem não revisita o banco: ele tem que sair daqui pronto.
AberturaSeletiva 26 · Senac RS
Aula 1 · Segunda 10/08 · manhã
Do enunciado
ao modelo
Por que relacional, os três níveis de modelagem e como achar
as entidades escondidas num enunciado de prova.
01
Aula 1 · Objetivos
Ao fim da manhã, vocês conseguem
- Explicar por que a prova usa banco relacional, com argumento técnico e não "porque sim".
- Percorrer o caminho conceitual → lógico → físico sabendo o que decide em cada etapa.
- Ler um enunciado e sair com a primeira lista de entidades do casamento.
- Escrever cardinalidade com mínimo e máximo, e justificar cada uma em voz alta.
Aula 1 · ObjetivosApostila §1 §2 §3
10 minutos · toda aula começa assim
Aquecimento de inglês
databasetable
rowcolumn
queryrelationship
- Cada uma lê em voz alta e explica em português.
- Depois usa duas palavras numa frase em inglês.
🛠️ Exemplo
"The guests table has a relationship with the weddings table."
Aula 1 · Bloco 110 min
Teoria · §1
Por que a prova não usa MongoDB?
Pensem trinta segundos antes de eu responder.
Motivo 1Dados estruturados
Convidado, mesa, casamento. Todos têm sempre os mesmos campos.
Motivo 2Cheios de relação
Quase toda pergunta do sistema cruza duas ou três tabelas.
Motivo 3Precisa de garantia
Check-in não pode gravar pela metade. Isso tem nome: ACID.
🎯 Frase pra banca
"Escolhi relacional porque o domínio é estruturado, altamente relacional
e exige integridade transacional." Essa frase fica no quadro o dia todo.
Aula 1 · TeoriaApostila §1
Teoria · §2
Os três níveis de modelagem
Nível 1Conceitual
O que existe e como se relaciona. Sem tecnologia nenhuma.
Caixas, linhas e cardinalidade. Papel serve.
Nível 2Lógico
Vira tabela. Chaves definidas, tipos genéricos, N:N virando
tabela associativa.
Nível 3
Físico
O DDL do MySQL. Tipos reais, constraints, engine. É o
schema.sql.
Quem pula do enunciado direto pro CREATE TABLE sempre esquece
uma entidade. O caminho existe pra isso.
Aula 1 · TeoriaApostila §2
Teoria · §2.1
Onde mora a nota do aluno?
Uma escola tem alunos e disciplinas. Um aluno cursa várias
disciplinas, uma disciplina tem vários alunos. A pergunta:
No aluno?
Não. Ele tem uma nota por disciplina, não uma só.
Na disciplina?
Não. Ela tem uma nota por aluno.
Na matrícula
O relacionamento N:N virou tabela. É lá que a nota mora.
🎯 A regra que sai daqui
Todo atributo que só existe quando os dois se encontram pertence à
tabela associativa. Esse é o erro de modelagem número 1 na prova.
Aula 1 · TeoriaApostila §2.1
Teoria · §2.2
Se o preço mudar amanhã, o que acontece com o pedido de ontem?
ErradoSó a FK do produto
O item do pedido aponta pro produto e lê o preço de lá. Reajustou o
produto? Todo o histórico de vendas muda junto.
Certo
Preço congelado no item
O item guarda preco_unitario
no momento da compra. O passado fica preservado.
⚠️ Pega-ratão
Isso volta na aula 3 como campo calculado: em geral não se guarda o
que dá pra calcular, mas valor histórico é exceção legítima. A
diferença é saber explicar por quê.
Aula 1 · TeoriaApostila §2.2
Teoria · §3.1
Como achar entidade num enunciado
Grifa os substantivos. Depois passa cada um pelo teste:
- Tem dados próprios? Se só tem nome, provavelmente é atributo de outro.
- Precisa ser identificado individualmente? Se sim, é entidade.
- Vai existir várias vezes? Entidade é o que se repete em linhas.
🛠️ O teste na prática
"Mesa" tem número, capacidade e localização, e existem várias: entidade.
"Cor do convite" é um valor só: atributo.
Aula 1 · TeoriaApostila §3.1
Teoria · §3.3
Cardinalidade tem mínimo e máximo
Escrever só "1:N" é metade da informação. E é justamente a
outra metade que vira código.
O mínimo decideNOT NULL
Convidado precisa de casamento? Mínimo 1, a FK é
NOT NULL. Pode ficar sem mesa? Mínimo 0, a FK aceita nulo.
O máximo decideOnde vai a FK
No 1:N, a FK mora sempre do lado N. Uma mesa tem vários
convidados, então mesa_id fica no convidado.
🎯 Conexão direta
Na aula 4 a gente volta nesse slide pra decidir os
NOT NULL do DDL. Cardinalidade bem-feita hoje é DDL de graça
na quarta.
Aula 1 · TeoriaApostila §3.3
Teoria · §3.4
Como cada cardinalidade vira tabela
| Tipo | Como resolve | No casamento |
| 1:N | FK do lado N. Sem tabela extra. | Casamento → convidados |
| N:N | Tabela associativa com as duas FKs. Se o
relacionamento tem atributo próprio, ele mora aqui. | Convidado ↔ convite |
| 1:1 | FK UNIQUE num dos lados. Escolhe o
lado opcional pra receber a FK. | Convidado → check-in |
Toda vez que aparecer um N:N, a pergunta seguinte é obrigatória:
essa tabela associativa tem atributos próprios? Quase sempre tem, e
quase sempre é onde está a nota.
Aula 1 · TeoriaApostila §3.4
Bloco 2 · 1h30 · juntos, no quadro
Levantamento das entidades do casamento
- Ler o enunciado da Regional em voz alta. Uma grifa substantivos, a outra anota candidatos.
- Aplicar o teste em cada candidato: tem dados próprios? Precisa de identidade?
- Desenhar o DER conceitual no quadro: caixas, linhas e cardinalidade nas pontas.
- Discutir cada N:N que aparecer: que tabela associativa ele vira?
⚠️ Regra da semana
Sai do enunciado, não do banco de junho. Copiar o modelo antigo não
treina nada, e o exercício é justamente modelar de novo.
Aula 1 · Bloco 2Prática guiada
Checkpoint da aula 1
Antes de seguir, as duas têm que ter
- O mesmo conjunto de entidades no papel: usuário, casamento, mesa e convidado no mínimo.
- Cardinalidade escrita com mínimo e máximo em cada linha do diagrama.
- Capacidade de justificar cada cardinalidade em voz alta, sem olhar a anotação.
🎯 Conexão com a prova
O Módulo B da Seletiva começa exatamente assim: enunciado na mão e
DER em branco. Essa aula é o primeiro passo da prova, em câmera lenta.
Aula 1 · CheckpointAntes do exercício
Bloco 3 · exercício prático
Modelar a clínica
Uma clínica tem médicos, pacientes e consultas. Cada consulta tem
data, valor e um diagnóstico. Um paciente pode ter várias consultas com
médicos diferentes. A clínica quer saber o histórico de preço da
consulta de cada médico ao longo do tempo.
Critérios de nota 3
- Todas as entidades identificadas, sem entidade inventada que o enunciado não pede.
- Cardinalidades com mínimo e máximo, defendidas em uma frase cada.
- O histórico de preço resolvido sem sobrescrever dado (a lição do e-commerce).
Aula 1 · Entrega antes do almoçoApresentação de 3 min na aula 2
Aula 2 · Segunda 10/08 · tarde
Chaves e
nomenclatura
O sistema de identidade do banco, o padrão de nomes do time e
as primeiras tabelas rodando de verdade.
02
Aula 2 · Objetivos
Ao fim da tarde, vocês têm
- O DER lógico do casamento fechado, com todas as chaves decididas.
- Um
convencoes.md versionado com o padrão de nomes do time.
- O
schema.sql começado, rodando de verdade no MySQL.
- O ritual dropa e roda do zero incorporado.
Aula 2 · ObjetivosApostila §3.4 §4 §10
10 minutos · drill invertido
Aquecimento de inglês
primary keyforeign key
uniquenot null
auto incrementconstraint
O professor fala a definição em inglês, elas respondem qual
termo é.
🛠️ Exemplo
"A column that identifies each row." → primary key
Aula 2 · Bloco 110 min
Teoria · §4
Os quatro tipos de chave
| Chave | O que é |
| Candidata | Qualquer coluna (ou conjunto) que poderia identificar a linha sozinha. |
| Primária (PK) | A candidata escolhida pra ser a identidade oficial. Uma por tabela, nunca nula. |
| Estrangeira (FK) | A coluna que aponta pra PK de outra tabela. É o que cria o relacionamento de verdade. |
| Composta | PK formada por duas ou mais colunas. Comum em tabela associativa. |
Relacionamento desenhado no papel não existe pro banco. Só a FK
declarada no script cria a relação.
Aula 2 · TeoriaApostila §4
Teoria · §4
Por que não usar o CPF como chave primária?
Motivo 1Muda
Dado de negócio muda. Chave primária que muda quebra toda FK que aponta pra ela.
Motivo 2Nem todo mundo tem
Criança, estrangeiro, cadastro incompleto. PK não pode ser nula.
Motivo 3Vaza
Dado sensível replicado em toda tabela filha. Problema de LGPD de graça.
🎯 O padrão da prova
Surrogate key: id INT AUTO_INCREMENT PRIMARY KEY. A
identidade interna é uma coisa; o código público é outra.
Aula 2 · TeoriaApostila §4
Teoria · §4 · o caso do convidado
Identidade interna ≠ código público
CREATE TABLE convidado (
id INT AUTO_INCREMENT PRIMARY KEY, -- identidade interna, sequencial
codigo CHAR(8) NOT NULL UNIQUE, -- código público, NÃO sequencial
nome VARCHAR(120) NOT NULL,
casamento_id INT NOT NULL
);
⚠️ Por que o código não pode ser sequencial
Se o convite do convidado 41 tem código 41, qualquer um
digita 42 e cai no convite de outra pessoa. O código público
precisa ser imprevisível. Isso volta em setembro, no RSVP.
Aula 2 · TeoriaApostila §4
Teoria · decisão de time
Combinar o padrão de nomes AGORA
As decisões
- Tabela no singular ou plural: escolher um e nunca misturar.
snake_case em tudo.
- FK sempre
tabela_id.
- Sem acento, sem espaço, um idioma só.
Onde isso vive
Num arquivo convencoes.md
versionado no repositório. Escrito, não combinado de boca.
Quando bater dúvida em outubro, a resposta
está no arquivo, não na memória de ninguém.
🛠️ Gambiarra boa
Padronizar na primeira semana custa 10 minutos. Despadronizar em
outubro custa uma tarde inteira.
Aula 2 · TeoriaDecisão de time
Bloco 2 · prática guiada
O ritual: dropa e roda do zero
DROP DATABASE IF EXISTS wedding;
CREATE DATABASE wedding CHARACTER SET utf8mb4;
USE wedding;
-- ... todas as tabelas, na ordem certa de dependência
- Escrever no arquivo, nunca direto no banco pela interface.
- Rodar, ver as tabelas existirem, dropar tudo e rodar de novo.
- Se rodou duas vezes seguidas sem erro, o script é confiável.
🎯 Por que isso é nota
A prova pede um script que reconstrói o banco do zero em máquina
limpa. Quem só clicou na interface não tem esse script.
Aula 2 · Bloco 2Apostila §10
Checkpoint da aula 2
Fim do dia, as duas têm que ter
schema.sql no Git com todas as tabelas do DER, rodando sem erro.
- Toda tabela com PK; toda FK apontando pra uma PK que existe.
- Nomes 100% dentro do
convencoes.md.
- Script que dropa e recria de uma vez só.
- Commit com mensagem clara. Nada de "att", "ajustes" ou "wip".
Amanhã de manhã a aula 3 começa auditando esse script. Não é
cobrança: é que normalização só faz sentido com um banco real na mesa.
Aula 2 · Entrega até o fim do diaLer §5 e §6 pra amanhã
Aula 3 · Terça 11/08 · manhã
Normalização e
ligação circular
As três formas normais com a tabela errada na mesa, e os três
tipos de ciclo entre tabelas.
03
Aula 3 · Objetivos
Ao fim da manhã, vocês conseguem
- Diagnosticar e corrigir 1FN, 2FN e 3FN numa tabela errada.
- Reconhecer os três tipos de ligação circular e saber qual é problema.
- Auditar o próprio banco com esses dois instrumentos na mão.
🎯 Aquecimento de inglês (10 min)
Ler a página real de FOREIGN KEY constraints na doc do MySQL.
Scanning: 60 segundos pra achar a resposta de
"what happens on DELETE by default?"
Aula 3 · ObjetivosApostila §5 §6
Teoria · §5.1
Por que normalizar: as três anomalias
Anomalia 1Inserção
Não dá pra cadastrar um vendedor novo enquanto ele não fizer
um pedido. O dado depende de outro pra existir.
Anomalia 2Atualização
O cliente mudou de cidade. Agora tem que caçar todas as linhas
onde ela aparece. Esquecer uma = banco inconsistente.
Anomalia 3Exclusão
Apagou o último pedido do vendedor e o vendedor sumiu junto.
Perdeu dado que não queria perder.
🎯 O critério da banca
Não se argumenta "está feio". Argumenta-se "que anomalia isso cria?"
Essa é a diferença entre nota 1 e nota 3 na defesa.
Aula 3 · TeoriaApostila §5.1
Teoria · §5.2
1FN — valores atômicos
Fere a 1FNLista dentro da célula
produtos_lista
"Caneta, Caderno, Mochila"
Como contar quantas mochilas foram vendidas?
Só com gambiarra de texto.
Em 1FN
Uma linha por item
item_pedido
(pedido_id, produto_id, qtd)
Agora dá pra contar, somar, filtrar e agrupar.
⚠️ O sinal de alerta
Nome de coluna no plural ou terminado em _lista quase
sempre é violação de 1FN esperando pra acontecer.
Aula 3 · TeoriaApostila §5.2
Teoria · §5.3
2FN — depender da chave inteira
Só faz sentido quando a chave é composta. Se a chave
é uma coluna só, a 2FN vem de graça.
-- PK composta: (pedido_id, produto_id)
item_pedido(pedido_id, produto_id, quantidade, produto_nome)
^^^^^^^^^^^^^
-- produto_nome depende SÓ de produto_id, não da chave inteira.
-- Dependência parcial: fere a 2FN. Vai pra tabela produto.
A pergunta: "esse campo depende das duas colunas da chave, ou só de
uma?" Se depende só de uma, ele está na tabela errada.
Aula 3 · TeoriaApostila §5.3
Teoria · §5.4
3FN — nada depende de não chave
convidado(id, nome, mesa_id, mesa_capacidade)
^^^^^^^^^^^^^^^
-- mesa_capacidade depende de mesa_id, que NÃO é chave da tabela.
-- Dependência transitiva: id -> mesa_id -> mesa_capacidade
-- Fere a 3FN. A capacidade pertence à tabela mesa.
O sintoma
Mudou a capacidade da mesa e agora
tem que atualizar todos os convidados dela.
A cura
O campo volta pra tabela dona.
Se precisar dele numa consulta, é JOIN, não cópia.
Aula 3 · TeoriaApostila §5.4
Teoria · §5.5 · a parte madura
Desnormalização consciente existe
O padrão3FN sempre
Na prova, o padrão é 3FN. É o que a banca espera encontrar
sem precisar perguntar.
A exceçãoCom justificativa dita
Valor histórico (o preco_unitario da aula 1) é
desnormalização legítima. Mas tem que ser falada em voz
alta, não descoberta pela banca.
🎯 A diferença que vale nota
Desnormalizar sem saber é erro. Desnormalizar sabendo e
explicando é maturidade técnica. O banco fica igual; a nota, não.
Aula 3 · TeoriaApostila §5.5
Teoria · §6.1 · ligação circular, tipo 1 de 3
Auto-relacionamento: legítimo
A tabela aponta pra ela mesma. Não é problema, é elegante.
funcionario(id, nome, gerente_id) -- FK -> funcionario.id, ANULÁVEL
categoria(id, nome, categoria_pai_id) -- árvore de categorias
- A FK precisa aceitar nulo: o presidente não tem gerente, a categoria raiz não tem pai.
- Pra percorrer a hierarquia inteira,
WITH RECURSIVE (MySQL 8).
Aula 3 · TeoriaApostila §6.1
Teoria · §6.2 · ligação circular, tipo 2 de 3
Ciclo A ↔ B: sinal amarelo
Departamento tem um chefe (funcionário). Todo funcionário
pertence a um departamento. Com o banco vazio, quem entra primeiro?
-- A saída: FK anulável + insert-then-update
INSERT INTO departamento (nome, chefe_id) VALUES ('TI', NULL);
INSERT INTO funcionario (nome, depto_id) VALUES ('Ana', 1);
UPDATE departamento SET chefe_id = 1 WHERE id = 1;
⚠️ Pega-ratão de tutorial
DEFERRABLE não existe no MySQL/InnoDB. Quem viu isso
em tutorial de PostgreSQL não pode contar com isso na prova.
Aula 3 · TeoriaApostila §6.2
Teoria · §6.3 · ligação circular, tipo 3 de 3
Ciclo longo A → B → C → A: corta
Convidado aponta pra mesa. Mesa aponta pra casamento. E convidado aponta
pra casamento de novo. Esse é o ciclo do modelo de vocês.
Quase sempreFK redundante
A informação já chega pelo caminho: dá pra saber o casamento
do convidado passando pela mesa. Corta a FK direta.
Às vezesLegítima
Se o convidado pode não ter mesa, o caminho quebra e a FK
direta é necessária. Aí ela fica, com justificativa escrita.
🎯 O teste universal
"Com o banco vazio, qual linha entra primeiro?" Se nenhuma pode
entrar, o ciclo é problemático.
Aula 3 · TeoriaApostila §6.3 §6.4
Bloco 2 · prática guiada · 1h30
Auditoria cruzada dos bancos
- Trocar os scripts. Cada uma audita o
schema.sql da outra.
- Dois checklists no quadro: "fere 1FN/2FN/3FN?" e "existe ciclo? De que tipo?"
- Discutir cada achado em conjunto. O professor arbitra pela anomalia, não pelo gosto.
- Corrigir os dois bancos ao vivo, com a justificativa dita antes de digitar.
🛠️ Regra da auditoria
O erro que aparecer vira caso da turma, sem dono. Ninguém é exposto:
a gente discute o modelo, não quem escreveu.
Aula 3 · Bloco 2Prática guiada
Bloco 3 · exercício · tarde inteira
Duas partes
Parte 1 · normalizar até 3FN
pedido_bagunca(pedido_id, data, cliente_nome, cliente_cpf,
cliente_cidade, produtos_lista, precos_lista,
vendedor_nome, vendedor_comissao_pct)
Parte 2 · resolver o ciclo
Departamento tem um
chefe. Todo funcionário pertence a um departamento. Desenhar a solução
sem travar o banco vazio e escrever os INSERTs que provam que funciona.
- Nota 3 na parte 1: nenhuma lista em célula, nenhuma dependência parcial ou transitiva, e as três anomalias citadas nominalmente no comentário do script.
- Nota 3 na parte 2: FK anulável no lugar certo e o insert-then-update rodando de verdade no MySQL.
Aula 3 · Commit separado por parteLer §7 e §9 pra amanhã
Aula 4 · Quarta 12/08 · manhã
Integridade,
constraints e tipos
Se o pai morrer, o que acontece com os filhos? E como o banco
aprende a dizer "não".
04
Aula 4 · Objetivos
Ao fim da manhã, vocês conseguem
- Decidir ON DELETE / ON UPDATE de cada FK com justificativa.
- Blindar o banco com constraints que impedem estado inválido.
- Escolher o tipo de dado certo pra cada coluna.
- Sair com o DDL completo e o dicionário de dados começado.
🎯 Inglês (10 min) · drill invertido
cascade, restrict, set null, check, default, decimal, timestamp.
Elas explicam em inglês, uma frase cada.
Aula 4 · ObjetivosApostila §7 §8 §9
Teoria · §7
Se o pai morrer, o que acontece com os filhos?
Opção 1CASCADE
Os filhos morrem junto. Use quando o filho não faz sentido
sozinho.
Opção 2SET NULL
Ficam órfãos de propósito. O filho continua existindo, só
perde o vínculo.
Opção 3RESTRICT
O pai não pode morrer enquanto tiver filho. O banco barra a
operação.
⚠️ O erro mais comum
Marcar tudo CASCADE sem pensar. O banco funciona, e a nota é 1.
Nível 3 é cada FK com decisão consciente.
Aula 4 · TeoriaApostila §7
Teoria · §7.1
As decisões do casamento, uma a uma
| Relação | Regra | Por quê |
| convidado → casamento | CASCADE | Convidado não existe sem o casamento dele. |
| convidado → mesa | SET NULL | Apagar a mesa não pode apagar gente. Ficam sem lugar, e tudo bem. |
| convite → convidado | CASCADE | Convite sem convidado não significa nada. |
| mesa → casamento | RESTRICT | Apagar casamento com mesa montada é erro de operação, não intenção. |
🎯 O que vale nota 3
Não é a escolha em si: é a frase de justificativa. "RESTRICT em mesa
porque apagar mesa com gente sentada é erro de operação" é nível 3.
Aula 4 · TeoriaApostila §7.1
Teoria · §8 · defesa em profundidade
O banco dizendo "não"
CREATE TABLE mesa (
id INT AUTO_INCREMENT PRIMARY KEY,
numero INT NOT NULL, -- obrigatório de verdade
capacidade INT NOT NULL CHECK (capacidade > 0), -- regra de negócio
status VARCHAR(20) NOT NULL DEFAULT 'livre', -- padrão sensato
UNIQUE (casamento_id, numero) -- não repete número
);
Validar no formulário é bom. Validar também no banco é o que
impede estado inválido quando alguém insere por fora da aplicação.
CHECK é real desde o MySQL 8.0.16.
Aula 4 · TeoriaApostila §8
Teoria · §8 · o detalhe de nível 3
Uma linha que resolve a dupla entrada
CREATE TABLE checkin (
id INT AUTO_INCREMENT PRIMARY KEY,
convidado_id INT NOT NULL,
entrada_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE (convidado_id) <-- o mesmo convidado não entra duas vezes
);
🎯 Por que isso brilha
O bloqueio de dupla entrada fica garantido pelo banco, antes de
qualquer linha de código. Nem condição de corrida quebra. Esse é o tipo
de detalhe que a apresentação de outubro vai citar.
Aula 4 · TeoriaApostila §8
Teoria · §9 · pontos de graça
Escolher o tipo certo é nota fácil
| Situação | Use | Por quê |
| Dinheiro | DECIMAL(10,2) | FLOAT arredonda errado. 0.1 + 0.2 não dá 0.3. |
| CPF, telefone, CEP | VARCHAR | INT come o zero à esquerda. E ninguém soma CPF. |
| Data com hora local | DATETIME | TIMESTAMP converte fuso e tem limite em 2038. |
| Conjunto que muda | Tabela de domínio | ENUM exige ALTER TABLE pra adicionar um valor novo. |
⚠️ Demonstração ao vivo
Rodar o erro de arredondamento do FLOAT na frente delas. Ver acontecendo
grava melhor que ouvir falar.
Aula 4 · TeoriaApostila §9
Bloco 2 e 3
Fechar o DDL e abrir o dicionário
- FK por FK, decidir ON DELETE/ON UPDATE. Regra: ninguém digita antes de falar a justificativa.
- Adicionar constraints:
NOT NULL conforme a cardinalidade mínima da aula 1, UNIQUE, CHECK, DEFAULT.
- Revisar tipo por tipo. Todo FLOAT de dinheiro vira DECIMAL, todo INT de CPF vira VARCHAR.
- Ritual: dropa tudo, roda o
schema.sql completo, sem erro.
- Só agora abrir o DDL de referência da apostila e comparar. Cada diferença é discutida, não copiada.
Exercício (curto): o dicionario-de-dados.md. Cada coluna
com tipo, obrigatoriedade, regra e descrição de negócio. Descrição
que repete o nome da coluna não conta. Entrega quarta 8h30.
Aula 4 · Bloco 2 e 3Ler §12 e §13 pra amanhã
Aula 5 · Quinta 13/08 · manhã
Manipulação,
consultas e JOINs
Onde o relacional mostra a que veio. E o padrão-ouro que
responde "quem não tem".
05
Aula 5 · Objetivos
Ao fim da manhã, vocês dominam
- INSERT, UPDATE e DELETE com o ritual de segurança.
- SELECT com filtros e funções, datas em especial.
- Todos os JOINs, incluindo o padrão-ouro LEFT JOIN + IS NULL.
🛠️ Inglês (10 min) · erro real
Projetar Cannot add or update a child row: a foreign key constraint
fails. Elas traduzem, explicam a causa e dizem em inglês como
corrigir. Erro de console é aula de inglês grátis, todo dia.
Aula 5 · ObjetivosApostila §12 §13 §14
Teoria · §12
O ritual do UPDATE seguro
-- 1. SELECT com o MESMO WHERE. Confere o que vai ser atingido.
SELECT * FROM convidado WHERE id = 42;
-- 2. Só então o UPDATE, com o WHERE idêntico.
UPDATE convidado SET status = 'confirmado' WHERE id = 42;
-- 3. SELECT de novo pra confirmar que ficou como esperado.
SELECT * FROM convidado WHERE id = 42;
⚠️ Pega-ratão clássico de prova
UPDATE convidado SET status = 'confirmado'; sem WHERE
confirma o casamento inteiro. Acontece na pressa, e não tem
Ctrl+Z. O ritual existe pra isso.
Aula 5 · TeoriaApostila §12
Teoria · §13
As funções que resolvem prova
Filtros
LIKE '%ana%' busca por trecho
IN ('a','b') lista de valores
BETWEEN x AND y faixa
IS NULL nunca = NULL
Datas: o grupo que mais cai
DATE_FORMAT(d,'%d/%m/%Y') saída BR
DATEDIFF(a,b) diferença em dias
CURDATE() só data
NOW() data e hora
🎯 Detalhe que a banca olha
Data em tela brasileira sai dd/mm/aaaa. Deixar
2026-08-10 na interface é ponto perdido de graça.
Aula 5 · TeoriaApostila §13
Teoria · §14
Os JOINs, em conjuntos
InterseçãoINNER JOIN
Só o que casa dos dois lados. Convidado que tem mesa.
Tudo da esquerdaLEFT JOIN
Todos da esquerda, com ou sem par. Sem par vem NULL.
O desastreSem ON
Produto cartesiano. 30 convidados × 6 mesas = 180 linhas de
lixo.
🛠️ Fazer de propósito
Rodar o produto cartesiano na frente delas, ver o estrago, e nunca
mais esquecer o ON.
Aula 5 · TeoriaApostila §14
Teoria · §14 · a query que mais cai
LEFT JOIN + IS NULL: "quem NÃO tem"
-- Convidados que ainda não têm mesa
SELECT c.nome
FROM convidado c
LEFT JOIN mesa m ON m.id = c.mesa_id
WHERE m.id IS NULL;
- O LEFT traz todos os convidados, com ou sem mesa.
- Quem não tem mesa vem com as colunas da mesa em NULL.
- O
IS NULL filtra exatamente esses.
🎯 Por que é padrão-ouro
"Convidado sem mesa", "convite sem resposta", "mesa vazia": toda
pergunta de relatório é uma variação disso.
Aula 5 · TeoriaApostila §14
Bloco 2 · prática guiada · 2h · alternando o teclado
A escada de consultas
- Listar convidados
- Filtrar por status
- Formatar a data do casamento em BR
- Contar convidados por mesa
- Listar mesas com os nomes (INNER JOIN)
- Listar convidados sem mesa (LEFT JOIN + IS NULL)
- O produto cartesiano de propósito, pra ver o estrago
Checkpoint: as duas escrevem sozinhas, sem olhar nada, um LEFT JOIN
que responde "quem não tem X" em menos de 3 minutos.
Aula 5 · Bloco 2Cada degrau em cima do anterior
Bloco 3 · exercício · tarde inteira
12 consultas em consultas-treino.sql
- 1. Confirmados em ordem alfabética
- 2. Convidados por mesa, com nome da mesa
- 3. Mesas sem nenhum convidado
- 4. Convidados sem mesa definida
- 5. Confirmados, pendentes e recusados (uma query)
- 6. Casamentos nos próximos 30 dias, data em BR
- 7. Mesa mais cheia
- 8. Convidados com acompanhante, e o total
- 9. Atualizar status com o ritual do SELECT antes
- 10. Excluir convidado sem quebrar FK
- 11. Nome que contém uma sílaba dada
- 12. Uma inventada por ela: JOIN + função de data
🎯 Nota 3
As 12 rodam no banco recriado do zero. Nenhum UPDATE/DELETE sem
WHERE. E a 12 é genuinamente útil pra quem organiza um casamento.
Aula 5 · Enunciado vira comentário acima da queryLer §15 e §16
Aula 6 · Sexta 14/08 · manhã
Agregação é
o dashboard
As queries que viram gráfico em setembro, o tunning que a UC3
pede e o "tudo ou nada".
06
Aula 6 · Objetivos
Ao fim da manhã, vocês conseguem
- Escrever as queries de agregação do dashboard, incluindo o alerta de 90%.
- Criar view e índice com justificativa, e ler o EXPLAIN.
- Entender transação como tudo ou nada.
🎯 Inglês (10 min) · tradução reversa
Professor fala em português ("agrupa por mesa e conta"), elas escrevem
a query e leem em voz alta em inglês.
Aula 6 · ObjetivosApostila §15 §16 §17
Teoria · §15 · pergunta clássica de banca
WHERE filtra linha. HAVING filtra grupo.
SELECT m.numero, COUNT(c.id) AS total
FROM mesa m
LEFT JOIN convidado c ON c.mesa_id = m.id
WHERE c.status = 'confirmado' -- antes de agrupar: filtra LINHA
GROUP BY m.numero
HAVING total >= 8; -- depois de agrupar: filtra GRUPO
A ordem mental: filtra linha → agrupa → filtra grupo. Tentar usar
COUNT() no WHERE é o erro clássico, porque na hora do WHERE o
grupo ainda não existe.
Aula 6 · TeoriaApostila §15
Teoria · §15 · a query que vira funcionalidade
O alerta de 90% de lotação
SELECT m.numero, m.capacidade, COUNT(c.id) AS ocupados,
ROUND(COUNT(c.id) / m.capacidade * 100, 1) AS pct
FROM mesa m
LEFT JOIN convidado c ON c.mesa_id = m.id
GROUP BY m.id, m.numero, m.capacidade
HAVING pct >= 90;
🎯 Isso não é exercício, é a funcionalidade
Essa query É o alerta do dashboard de setembro. Quem sai dessa
semana com ela pronta chega em setembro com o motor já feito, e só
precisa desenhar a tela em cima.
Aula 6 · TeoriaApostila §15
Teoria · §16 · o tunning da UC3
View organiza. Índice acelera.
View
Consulta com nome. Ajuda quando a mesma query de dashboard se repete
em vários lugares.
O que ela NÃO faz: não acelera nada
por si. É organização, não performance.
Índice
Atalho de leitura. A PK já vem indexada de graça; vale criar em
coluna de busca frequente e em FK usada em JOIN.
O custo: escrita mais lenta. Índice em
tudo é tão errado quanto índice em nada.
🛠️ Demonstração
EXPLAIN numa busca por nome antes do índice, criar o
índice, EXPLAIN depois. Ler a diferença juntas.
Aula 6 · TeoriaApostila §16
Teoria · §17
Transação: tudo ou nada
START TRANSACTION;
SELECT id FROM checkin WHERE convidado_id = 42; -- já entrou?
INSERT INTO checkin (convidado_id) VALUES (42); -- registra
COMMIT; -- ou ROLLBACK, e é como se nada tivesse acontecido
- Verificar e gravar precisam ser atômicos: ou os dois acontecem, ou nenhum.
- Simular no console: BEGIN, UPDATE, conferir na outra sessão que nada mudou, COMMIT, conferir de novo.
🎯 A semente
Em setembro isso vira código no servidor, na validação de check-in.
O conceito nasce aqui.
Aula 6 · TeoriaApostila §17
Bloco 3 · exercício · tarde inteira
O kit SQL do dashboard
- As 6 queries de agregação adaptadas ao banco dela: confirmados por status, ocupação por mesa, percentual com alerta de 90%, check-ins por hora, acompanhantes totais, pendentes com prazo vencendo.
- As 2 views principais, com nome limpo (
vw_ocupacao_mesa).
- Os índices necessários, cada um com um comentário justificando que consulta ele acelera.
- Bônus: uma transação de exemplo comentada, mostrando um check-in atômico.
🎯 Nota 3
O alerta de 90% funciona comprovadamente, com uma mesa de teste
acima do limite. Índice sem justificativa desconta.
Aula 6 · Entrega até o fim da tardeLer §18 e §19
Fechamento · Sexta 14/08 · tarde
Banco nota 3
Não é aula nova. É consolidação, com duas peças finais e o
checklist na mão.
✓
Manhã · teoria curta (40 min) · §18
Backup, restore e senha
# Backup: o banco inteiro vira um arquivo .sql
mysqldump -u user -p wedding > backup.sql
# Restore: o arquivo recria tudo
mysql -u user -p wedding < backup.sql
- Demonstrar ao vivo: dumpar, dropar o banco inteiro na frente delas, restaurar, conferir que voltou.
- A política de recuperação (conceito da UC3): o que salvar, com que frequência, onde guardar.
- Senha: hash sempre, nunca texto puro. O seed já nasce com hash.
Fechamento · ManhãApostila §18
Manhã · prática guiada (2h) · §19
O seed é o palco da demonstração
- Massa com volume de verdade: dezenas de convidados com nomes plausíveis, mesas variadas, status distribuídos.
- E, de propósito, uma mesa acima de 90%, pra fazer o alerta do dashboard acender na demo.
🛠️ Gambiarra boa
Dashboard vazio não demonstra nada. Dashboard aceso brilha. Esse
arquivo vai ser reusado em cada treino avaliativo daqui até a Seletiva.
Checkpoint: schema.sql + seed.sql +
dashboard.sql reconstroem o banco inteiro, povoado e com o
alerta aceso, em menos de 2 minutos, do zero.
Fechamento · ManhãApostila §19
Tarde · o professor de banca
Checklist do banco nota 3
schema.sql reconstrói tudo do zero, de uma vez, sem erro.
- DER e dicionário de dados batem com o schema.
- 3FN, sem ciclo acidental; exceção com justificativa escrita.
- Toda FK com ON DELETE/ON UPDATE defensável em uma frase.
- Constraints de negócio no banco: NOT NULL, UNIQUE do check-in, CHECK de capacidade.
- Tipos certos: DECIMAL pra dinheiro, VARCHAR pra CPF, DATETIME onde faz sentido.
- Seed realista com a mesa acima de 90%; senha com hash.
- Kit dashboard: agregações + views + índices justificados, EXPLAIN conferido.
- Backup: dumpa e restaura em menos de 5 minutos, cronometrado.
- Tudo versionado, com histórico contando a semana.
Cada item que falhar vira tarefa imediata, corrigida na hora, ainda de tarde.
Fechamento · TardeAutoavaliação: as 17 perguntas da §20
Ligação com o CIS
Semana que vem
começa a API
E ela vai se conectar exatamente nesse banco. A semana que vem
não revisita o banco: ele tem que sair daqui pronto.
Módulo 04 · 17 a 21/08