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.

Competições Senac 10 a 14 de agosto · Módulo 03

Onde a gente vai chegar

Mapa da semana

AulaQuandoAssuntoApostila
1Seg 10, manhãDo enunciado ao modelo§1 §2 §3
2Seg 10, tardeChaves, nomenclatura e DER completo§3.4 §4 §10
3Ter 11, manhãNormalização e ligação circular§5 §6
4Qua 12, manhãIntegridade, constraints e tipos§7 §8 §9
5Qui 13, manhãManipulação, consultas e JOINs§12 §13 §14
6Sex 14, manhãAgregação, views, índices e transações§15 §16 §17
—Sex 14, tardeFechamento: 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 1

Dados estruturados

Convidado, mesa, casamento. Todos têm sempre os mesmos campos.

Motivo 2

Cheios de relação

Quase toda pergunta do sistema cruza duas ou três tabelas.

Motivo 3

Precisa 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 1

Conceitual

O que existe e como se relaciona. Sem tecnologia nenhuma. Caixas, linhas e cardinalidade. Papel serve.

Nível 2

Ló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?

Errado

Só 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 decide

NOT 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 decide

Onde 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

TipoComo resolveNo casamento
1:NFK do lado N. Sem tabela extra.Casamento → convidados
N:NTabela associativa com as duas FKs. Se o relacionamento tem atributo próprio, ele mora aqui.Convidado ↔ convite
1:1FK 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

ChaveO que é
CandidataQualquer 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.
CompostaPK 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 1

Muda

Dado de negócio muda. Chave primária que muda quebra toda FK que aponta pra ela.

Motivo 2

Nem todo mundo tem

Criança, estrangeiro, cadastro incompleto. PK não pode ser nula.

Motivo 3

Vaza

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 1

Inserção

Não dá pra cadastrar um vendedor novo enquanto ele não fizer um pedido. O dado depende de outro pra existir.

Anomalia 2

Atualização

O cliente mudou de cidade. Agora tem que caçar todas as linhas onde ela aparece. Esquecer uma = banco inconsistente.

Anomalia 3

Exclusã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 1FN

Lista 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ão

3FN sempre

Na prova, o padrão é 3FN. É o que a banca espera encontrar sem precisar perguntar.

A exceção

Com 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 sempre

FK redundante

A informação já chega pelo caminho: dá pra saber o casamento do convidado passando pela mesa. Corta a FK direta.

Às vezes

Legí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 1

CASCADE

Os filhos morrem junto. Use quando o filho não faz sentido sozinho.

Opção 2

SET NULL

Ficam órfãos de propósito. O filho continua existindo, só perde o vínculo.

Opção 3

RESTRICT

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çãoRegraPor quê
convidado → casamentoCASCADEConvidado não existe sem o casamento dele.
convidado → mesaSET NULLApagar a mesa não pode apagar gente. Ficam sem lugar, e tudo bem.
convite → convidadoCASCADEConvite sem convidado não significa nada.
mesa → casamentoRESTRICTApagar 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çãoUsePor quê
DinheiroDECIMAL(10,2)FLOAT arredonda errado. 0.1 + 0.2 não dá 0.3.
CPF, telefone, CEPVARCHARINT come o zero à esquerda. E ninguém soma CPF.
Data com hora localDATETIMETIMESTAMP converte fuso e tem limite em 2038.
Conjunto que mudaTabela de domínioENUM 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ção

INNER JOIN

Só o que casa dos dois lados. Convidado que tem mesa.

Tudo da esquerda

LEFT JOIN

Todos da esquerda, com ou sem par. Sem par vem NULL.

O desastre

Sem 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.

Competições Senac Módulo 04 · 17 a 21/08
1 / 1

Todos os slides