Curso
Já reparou que MySQL aparece em praticamente toda descrição de vaga ligada a bancos de dados? Não é à toa — o MySQL está por trás de tudo, das suas redes sociais favoritas aos apps que você usa no dia a dia.
Preparei este guia para ajudar você a mandar bem nas perguntas de entrevista sobre MySQL. Vou cobrir do básico, que todo júnior precisa saber, até tópicos mais avançados exigidos em posições sênior. Também compartilho dicas para você se apresentar com confiança nas próximas entrevistas na área de dados.
O que é MySQL?
MySQL é um SGBDR (sistema de gerenciamento de banco de dados relacional) open source, baseado em SQL, que organiza dados em tabelas estruturadas. Ele é desenvolvido pela Oracle Corporation.
Ele ficou em primeiro lugar como o DBMS open source mais popular em 2024. Porém, a pesquisa Stack Overflow Developer Survey de 2025 mostrou que o PostgreSQL passou a ser o banco de dados mais usado entre desenvolvedores profissionais, superando o MySQL pela primeira vez.
Mas não se engane: o MySQL continua extremamente popular — com 40,5% de uso entre desenvolvedores em 2025 — e ainda alimenta incontáveis aplicações web, sistemas de gestão de conteúdo e ferramentas corporativas. Especialmente se você trabalha com aplicações web ou com o stack LAMP, MySQL é uma habilidade de altíssimo valor.

Em 2024, o MySQL foi o DBMS open source mais popular do mundo, com pontuação 1061. Fonte: Statista.
Perguntas básicas sobre MySQL
Na fase inicial da entrevista, o recrutador costuma fazer perguntas fundamentais para avaliar seu entendimento de conceitos básicos de banco de dados e de MySQL.
1. O que é um banco de dados e qual a diferença para um SGBD?
Um banco de dados é um repositório que armazena dados aos quais podemos acessar, modificar e analisar. Por exemplo, redes sociais guardam quem curtiu nossos posts em bancos de dados.
Um SGBD (Sistema de Gerenciamento de Banco de Dados) é o software que permite interagir e gerenciar esses dados, criando usuários e controlando acessos. MySQL é um dos SGBDs mais populares. Outros exemplos incluem PostgreSQL, MongoDB e Microsoft SQL Server.
2. Como o MySQL difere de outros sistemas de banco de dados relacionais?
MySQL é um SGBDR open source que usa SQL para gerenciar dados. Ele é conhecido por sua facilidade de uso, velocidade e alta compatibilidade com aplicações web.
Veja como o MySQL se diferencia de outros SGBDRs:
- Simplicidade e performance: o MySQL é frequentemente elogiado por sua simplicidade e desempenho otimizado, sendo a escolha de muitos desenvolvedores web e startups.
- Recursos avançados: embora seja fácil de usar, o MySQL pode carecer de recursos mais avançados presentes em outros SGBDRs, como o PostgreSQL — por exemplo, suporte mais abrangente a transações ACID, indexação avançada e um conjunto mais amplo de tipos de dados.
- Engines de armazenamento: o MySQL permite escolher diferentes engines para tabelas (ex.: InnoDB, MyISAM), oferecendo flexibilidade para casos de uso específicos.
MySQL é ideal para cenários que exigem velocidade e escalabilidade; já para recursos mais complexos e corporativos, o PostgreSQL pode ser a melhor escolha.
3. Quais são os principais tipos de dados disponíveis no MySQL?
O MySQL oferece diversos tipos de dados, categorizados como:
-
Numéricos:
INT,DECIMAL,FLOAT,DOUBLEetc. -
Texto:
CHAR,VARCHAR,TEXT,BLOB. -
Data/hora:
DATE,DATETIME,TIMESTAMP,TIME. -
JSON: para armazenar objetos JSON.
4. Qual a diferença entre os tipos de dados INT e DECIMAL?
INT armazena números inteiros, sem casas decimais. Use quando não há necessidade de frações. Já DECIMAL armazena valores financeiros e é indicado para cálculos precisos com decimais.
5. Em MySQL, qual a diferença entre DATE e DATETIME?
O tipo DATE armazena a data nos formatos de ano, mês e dia:
YYYY-MM-DD
Já o tipo DATETIME armazena data e hora, neste formato:
YYYY-MM-DD HH:MM:SS
6. O que é uma chave estrangeira (foreign key) e como usá-la em bancos de dados?
Uma chave estrangeira é um campo em uma tabela que referencia a chave primária de outra tabela.
Por exemplo, em uma tabela customers que guarda informações de clientes, cada cliente tem um customer_id único — em outra tabela chamada transactions (que registra compras), usamos customer_id como chave estrangeira. O customer_id na tabela de transações vincula cada compra a um cliente específico na tabela customers .
Veja como isso fica em SQL:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE transactions (
transaction_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
7. Quais as diferenças entre INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN?
Joins combinam linhas de duas ou mais tabelas com base em colunas relacionadas. As diferenças são:
-
INNER JOIN: retorna linhas quando há correspondência em ambas as tabelas.
-
LEFT JOIN: retorna todas as linhas da tabela da esquerda e as que casam na tabela da direita. Se não houver correspondência, as colunas da direita vêm como
NULL. -
RIGHT JOIN: semelhante ao
LEFT JOIN, mas retorna todas as linhas da tabela da direita e as correspondentes da esquerda. -
FULL JOIN: combina os resultados de
LEFT JOINeRIGHT JOIN, incluindo linhas sem correspondência de ambas as tabelas. Observação: o MySQL não suporta nativamente a sintaxe deFULL JOIN. Para obter o mesmo resultado, use umUNIONentre umLEFT JOINe umRIGHT JOIN
8. Qual a diferença entre DELETE, TRUNCATE e DROP no MySQL?
Comandos como DELETE, TRUNCATE e DROP podem parecer semelhantes, mas se comportam de forma diferente:
DELETE: remove linhas de uma tabela com base em uma condição. Pode ser desfeito se estiver dentro de uma transação. Exemplo:
DELETE FROM employees WHERE department_id = 5;
TRUNCATE: apaga todas as linhas de uma tabela, mas mantém a estrutura. É mais rápido que DELETE e não pode ser desfeito. Exemplo:
TRUNCATE TABLE employees;
DROP: remove completamente a tabela e seus dados, além de dependências como índices. Exemplo:
DROP TABLE employees;
9. Como criar e modificar uma tabela no MySQL? Dê exemplos.
Para criar tabelas, use a instrução CREATE TABLE; para modificar, geralmente ALTER TABLE. Exemplos:
Criar tabela:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
Adicionar uma coluna:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
10. O que é uma tabela temporária em SQL?
Uma tabela temporária existe apenas durante a sessão atual do banco. Ao encerrar a sessão, ela é excluída. Esse tipo de tabela armazena resultados intermediários temporariamente, servindo para testes, filtragens ou preparação de dados antes de inseri-los em uma tabela permanente.
Exemplo:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;
11. O que é uma subquery no MySQL? Explique com um exemplo.
Uma subquery (também chamada de consulta aninhada) é uma consulta dentro de outra. Ela ajuda a decompor operações complexas em etapas mais gerenciáveis. Por exemplo, para encontrar funcionários que ganham acima da média:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Dividindo a lógica:
-
A consulta interna
SELECT AVG(salary) FROM employeescalcula a média salarial. -
A consulta externa usa essa média para filtrar quem ganha acima dela.
12. Como usar o INSERT no MySQL para adicionar dados a uma tabela? Tem boas práticas?
Usamos a instrução INSERT para incluir dados em uma tabela. A sintaxe básica é:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Algumas boas práticas ao usar INSERT:
-
Liste as colunas explicitamente. O código fica mais claro e evita erros quando a estrutura muda.
-
Para colunas
AUTO_INCREMENT(como IDs), omita-as noINSERT. O MySQL cuida disso e evita IDs duplicados. -
Seja consistente nas aspas de strings. Eu prefiro aspas simples, mas ambas funcionam.
-
Para inserir várias linhas, faça em uma única instrução para melhor performance.
13. Qual a importância do atributo AUTO_INCREMENT no MySQL?
O AUTO_INCREMENT gera números únicos e sequenciais para uma coluna, normalmente a chave primária da tabela.
Exemplo de criação de tabela com coluna AUTO_INCREMENT:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
E para inserir linhas:
INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');
14. O que é uma view no MySQL?
Uma view é uma consulta salva que funciona como uma tabela virtual. Você pega uma query complexa, dá um nome a ela e passa a usá-la como se fosse uma tabela em futuras consultas — sem precisar reescrever tudo toda vez.
Por exemplo, para facilitar a consulta de dados do funcionário com o nome do departamento, crie uma view:
CREATE VIEW employee_details AS
SELECT
e.id,
e.name,
d.department_name,
e.salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
Agora você pode consultar employee_details como se fosse uma tabela:
SELECT * FROM employee_details;
No entanto, não podemos usar views para inserir ou atualizar dados em muitos casos. A maioria é somente leitura e restringe o acesso direto às tabelas, aumentando a segurança. Em alguns cenários, views podem deixar as consultas mais lentas, pois executam a query subjacente a cada acesso.
Aprimoramento de SQL para iniciantes
Perguntas intermediárias sobre MySQL
Nesta seção, vamos cobrir tópicos de nível intermediário. Essas perguntas avaliam principalmente seu conhecimento de tipos de dados e estrutura no MySQL.
15. O que são tabelas com versionamento pelo sistema (system-versioned) e como funcionam?
Tabelas com versionamento pelo sistema mantêm um histórico completo das alterações feitas em uma tabela. Como guardam versões anteriores de cada linha, podemos usá-las para auditoria e recuperação de dados.
Elas funcionam adicionando duas colunas extras — StartTime e EndTime — para registrar quando cada linha é válida. Ao inserir, atualizar ou excluir, esses timestamps são atualizados:
-
Insert: cria uma nova linha com
StartTimeno timestamp atual eEndTimecomo9999-12-31 23:59:59— o maior valor deDATETIMEno MySQL, usado como sentinela para indicar "linha ativa". -
Update: atualiza o
EndTimeda linha original para o timestamp atual, marcando-a como inválida. Em seguida, cria uma nova linha com os dados atualizados,StartTimeatual eEndTime"para sempre". -
Delete: atualiza o
EndTimeda linha existente para o timestamp atual, indicando que não é mais válida.
Usando a cláusula FOR SYSTEM_TIME, você pode consultar o estado da tabela em um ponto específico no tempo ou em um intervalo. Por exemplo:
-
FOR SYSTEM_TIME AS OF '2024-01-01': recupera o estado da tabela em 1º de janeiro de 2024. -
FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': mostra todas as linhas válidas nesse período.
16. O que são transações no MySQL e como utilizá-las?
Transações são um conjunto de operações executadas como uma unidade. Elas garantem a integridade dos dados, permitindo que tudo seja confirmado ou desfeito em conjunto.
Exemplo de uso:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Salva as alterações permanentemente
-- ou
ROLLBACK; -- Reverte as alterações
17. O que é uma restrição de valor padrão (default) no MySQL? Como definir um valor padrão para uma coluna?
Uma restrição default atribui um valor padrão a uma coluna quando nenhum valor é informado durante um INSERT. Isso garante que a coluna permaneça válida mesmo se o usuário omitir esse campo.
Veja como criar uma tabela com valor padrão:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
Depois, você pode inserir uma linha sem especificar status:
INSERT INTO employees (name) VALUES ('John Doe');
Essa abordagem reduz a chance de NULL ou dados inválidos em colunas críticas e simplifica as consultas, dispensando o tratamento explícito de casos padrão.
|
Campo |
Tipo |
Nulo |
Chave |
Padrão |
Extra |
|
id |
INT |
NÃO |
PRI |
NULL |
AUTO_INCREMENT |
|
name |
VARCHAR(50) |
SIM |
NULL |
||
|
status |
VARCHAR(10) |
SIM |
active |
Esse comando é útil porque:
- Ajuda desenvolvedores a entender o schema antes de escrever queries.
- Serve para depuração, especialmente em bancos pouco conhecidos.
- Identifica rapidamente restrições, como chaves primárias e valores padrão.
18. Qual a diferença entre CHAR e VARCHAR no MySQL?
Ambos armazenam textos, mas tratam o armazenamento de forma diferente:
-
CHAR(n)sempre guarda exatamentencaracteres, preenchendo com espaços se o valor for menor. É de tamanho fixo, o que pode ser um pouco mais rápido para colunas com comprimento constante, como códigos de país ou flags de status. -
VARCHAR(n)guarda apenas os caracteres informados, até o máximo den. Usa menos espaço para dados de tamanho variável, com pequena sobrecarga para armazenar o comprimento.
CREATE TABLE example (
country_code CHAR(2), -- Sempre 2 chars, ex.: 'US', 'UK'
email VARCHAR(255) -- Tamanho variável até 255 chars
);
Regra prática: use CHAR para valores de tamanho fixo e VARCHAR para os demais.
19. Como você usaria funções de string em SQL para tratar texto?
Várias funções de string ajudam a trabalhar com nomes e outros textos. Por exemplo:
-
A função
LENGTH()mostra a quantidade de caracteres em um nome. -
UPPER()eLOWER()convertem textos para maiúsculas ou minúsculas. -
CONCAT()junta nome e sobrenome em uma coluna. -
SUBSTRING()extrai partes específicas do texto. Por exemplo, para separar o mês da data de nascimento.
Exemplo de query:
SELECT
UPPER(first_name) AS upper_name,
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTRING(birthdate, 6, 2) AS birth_month,
TRIM(last_name) AS trimmed_last_name,
REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;
Essa consulta:
-
Converte nomes para maiúsculas.
-
Combina nome e sobrenome em nome completo.
-
Extrai o mês de nascimento da coluna
birthdate. -
Remove espaços extras dos sobrenomes.
-
Substitui todas as ocorrências de "a" por "@" nos primeiros nomes.
20. Como atualizar uma linha específica em um banco de dados com SQL?
Use a instrução UPDATE com a cláusula WHERE para identificar o registro que deseja alterar.
Por exemplo, para atualizar o gênero do filme “Inception” (2010) para “Sci-Fi”:
UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;
Aqui, UPDATE movies especifica a tabela a ser atualizada, e a cláusula WHERE mira a linha cujo título é “Inception” e o ano é “2010”.
Perguntas avançadas sobre MySQL
Perguntas avançadas avaliam sua capacidade de lidar com cenários complexos no MySQL e dão uma ideia de como você toma decisões técnicas.
21. O que é um trigger no MySQL? Como implementá-lo?
No MySQL, um trigger é um conjunto de ações executadas quando ocorre um evento no banco. Eles podem rodar antes ou depois de eventos como INSERT, UPDATE ou DELETE.
Por exemplo, considere a tabela orders, onde novos pedidos são inseridos. Podemos criar um trigger que registre cada novo pedido na tabela order_history:
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, timestamp)
VALUES (NEW.order_id, 'inserted', NOW());
END;
Após o trigger rodar, a tabela order_history is é atualizada automaticamente:
|
history_id |
order_id |
action |
timestamp |
|
1 |
1 |
inserted |
2024-12-24 10:00:00 |
|
2 |
2 |
inserted |
2024-12-24 11:00:00 |
22. Por que adicionar um índice deixa as consultas SQL mais rápidas?
Sem índice, o banco precisa varrer linha por linha para achar o registro. Um índice funciona como um sumário, permitindo acesso direto às linhas relevantes. Assim, o tempo de busca cai e as queries rodam mais rápido.
Índices geralmente usam estruturas como B-trees ou hash tables, que tornam buscas, lookups e varreduras por intervalo eficientes.
Exemplo de criação de índice:
-- Sem índice:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Adicionando um índice na coluna last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- Com o índice, o banco localiza rapidamente linhas com 'Smith' em last_name.
Índices têm desvantagens, por exemplo:
-
Escritas mais lentas:
INSERT,UPDATEeDELETEficam mais lentos porque o índice precisa ser atualizado a cada mudança. -
Custo de armazenamento: índices ocupam espaço adicional.
23. Que tipo de dado usar para peso e preço de produto em uma tabela SQL e por quê?
Para peso, DECIMAL é geralmente a escolha mais segura. Embora FLOAT e REAL armazenem valores decimais, usam aritmética de ponto flutuante, podendo introduzir pequenos erros de arredondamento.
Para pesos de produto em que a precisão importa (ex.: frete, estoque), DECIMAL(8, 3) dá controle preciso com 3 casas decimais e sem surpresas. FLOAT só é aceitável quando uma pequena margem de erro é tolerável.
24. Como encontrar linhas duplicadas em SQL usando função de janela?
Veja como identificar duplicatas usando ROW_NUMBER():
WITH DuplicateCheck AS (
SELECT product_name,
category,
ROW_NUMBER() OVER(
PARTITION BY product_name, category
ORDER BY id
) AS row_num
FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;
Como funciona:
1. ROW_NUMBER() atribui um número a cada linha do resultado.
2. PARTITION BY agrupa por product_name e category.
3. Dentro de cada grupo, as linhas são numeradas a partir de 1.
4. Qualquer row_num maior que 1 indica duplicata.
Por exemplo, se tivermos:
- Produto A, Categoria X, row_num = 1
- Produto A, Categoria X, row_num = 2 (duplicado)
- Produto B, Categoria Y, row_num = 1
A query retornará a segunda linha, pois seu row_num é maior que 1.
25. Como criar e usar uma stored procedure com parâmetros no MySQL? Explique com exemplo.
Stored procedures permitem salvar e reutilizar queries complexas, tornando operações mais eficientes e fáceis de manter. Vamos criar e usar com parâmetros em um exemplo prático.
Suponha um banco de alunos e queremos filtrar por idade. Primeiro, criamos uma procedure simples que recebe a idade:
CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
SELECT * FROM student WHERE student.age = age;
END;
Para usá-la, basta CALL com a idade desejada:
CALL get_student_info(21);
Podemos deixá-la mais sofisticada com parâmetros de saída. Por exemplo, contar alunos de uma idade específica:
CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;
Para obter o resultado desta procedure:
SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;
26. Por que a integridade referencial é importante em um banco de dados?
A integridade referencial mantém corretos os relacionamentos entre tabelas. Ao criar uma chave estrangeira, garantimos que os valores em uma tabela existam como valores únicos na tabela referenciada.
Exemplo prático: em um e-commerce, há a tabela Customers e a tabela Orders. Cada pedido precisa pertencer a um cliente real. A integridade referencial, via chave estrangeira, assegura que:
- Você não crie um pedido para um cliente inexistente.
- Você não exclua um cliente com pedidos existentes (a menos que configure o que acontece com esses pedidos).
- Você não altere o ID de um cliente que já tem pedidos.
Então, ao criar uma restrição de chave estrangeira assim:
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
O banco passa a impor automaticamente as regras:
-
Todo
CustomerIDemOrdersdeve existir emCustomers. -
Qualquer tentativa de violá-las (como inserir
CustomerIDinválido) será rejeitada.
Isso evita inconsistências sérias, como pedidos que não podem ser associados a clientes reais ou relatórios com informações faltantes.
Perguntas de MySQL para administradores de banco de dados
Se você está se candidatando a uma vaga de administrador de banco de dados, aqui estão algumas perguntas comuns.
27. Por que uma aplicação grande usaria sharding de banco de dados? Quais os desafios?
Aplicações grandes usam sharding para dividir grandes volumes de dados em vários servidores. Cada shard contém uma parte do conjunto. Ao distribuir a carga, reduz-se a necessidade de hardware robusto. Embora a velocidade e a escalabilidade melhorem, há desafios:
- Algumas consultas, como joins, podem deixar de funcionar ou ficar mais complexas, dificultando a gestão.
- Com o crescimento dos dados, shards podem sobrecarregar, criando hotspots e degradando a performance.
28. Explique o papel dos redo logs na recuperação de falhas do MySQL.
Sempre que dados são modificados no MySQL, é preciso gravar em disco. Escrever diretamente nos arquivos de dados é lento e arriscado. Por isso, antes de modificar qualquer arquivo de dados, o MySQL primeiro registra o que fará no redo log. Isso é mais seguro do que atualizar arquivos de dados diretamente.
Vamos dizer que você atualiza o endereço de um cliente:
- O MySQL primeiro grava essa mudança no redo log.
- Em seguida, confirma a transação como concluída.
- Depois, aplica a mudança nos arquivos de dados.
A recuperação de falhas importa se o MySQL cair após o passo 1 ou 2, mas antes do 3. Ao reiniciar, ele lê os redo logs e conclui o trabalho pendente, reproduzindo as mudanças registradas. Isso garante que transações confirmadas não sejam perdidas, mesmo se o crash ocorrer no pior momento.
29. Quais são as diferentes engines de armazenamento no MySQL e como elas diferem?
O MySQL suporta múltiplas engines de armazenamento, cada uma otimizada para usos distintos. Comparativo das mais comuns:
| Engine de armazenamento | Principais recursos | Melhor para |
|---|---|---|
| InnoDB | Padrão. Compatível com ACID, bloqueio em nível de linha, transações e chaves estrangeiras. | E-commerce, finanças, qualquer cenário que exija integridade de dados. |
| MyISAM | Leituras rápidas, bloqueio em nível de tabela. Sem transações nem chaves estrangeiras. | Apps com leitura intensa, onde velocidade importa mais que integridade. |
| Memory | Dados em RAM. Extremamente rápida, mas perde os dados ao reiniciar. | Cache, sessões, dados temporários. |
| CSV | Armazena como arquivos CSV. Sem indexação. | Troca de dados entre apps ou armazenamento plano simples. |
| Archive | Alta compactação. Apenas INSERT e SELECT. Sem índices. | Logs ou históricos raramente consultados. |
| NDB (Clustered) | Armazenamento distribuído, alta disponibilidade, tolerância a falhas, suporta transações. | Apps distribuídas em larga escala com performance em tempo real. |
30. Como definir a engine de armazenamento padrão no MySQL?
Primeiro, verifique a engine padrão atual:
SHOW ENGINES;
InnoDB é recomendada como padrão, pois oferece recursos como:
- Transações compatíveis com ACID
- Chaves estrangeiras
- Recuperação de falhas
- Bloqueio em nível de linha
Para mudar temporariamente a engine padrão na sessão atual:
SET default_storage_engine = 'InnoDB';
Para alterar permanentemente, edite o arquivo de configuração do MySQL adicionando esta linha na seção [mysqld]:
default-storage-engine = InnoDB
31. Como reparar tabelas corrompidas no MySQL?
Primeiro, verifique todos os bancos com o comando:
mysqlcheck --check --all-databases -u root -p
Ele escaneia as tabelas e informa se há corrupção. Depois, rode para reparar a tabela:
mysqlcheck --repair database_name table_name -u root -p
Reparos podem levar à perda de dados em casos graves, então faça backup antes.
Perguntas de MySQL baseadas em cenários e resolução de problemas
Essas perguntas avaliam sua vivência em cenários reais e sua capacidade de resolver problemas.
32. Explique um cenário em que você usou subqueries no MySQL.
Uma forma de responder:
Eu gerenciei o banco de um e-commerce no meu último trabalho e precisei preparar um relatório de produtos. O objetivo era encontrar produtos com vendas acima da média, o que exigia subqueries para uma análise em múltiplas etapas.
A query que desenvolvi foi:
SELECT
p.product_id,
p.product_name,
s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
SELECT AVG(sales_amount)
FROM sales
)
ORDER BY s.sales_amount DESC;
Primeiro, calculei a média de vendas de todos os produtos com uma subquery no WHERE (AVG(sales_amount) em sales). Essa subquery virou um limite dinâmico para medir o desempenho de cada produto.
A query principal então juntou products e sales para trazer os detalhes relevantes, enquanto o WHERE filtrou os que ficaram abaixo da média.
Com isso, consegui identificar os produtos de alta performance em uma única operação, sem executar várias consultas separadas.
33. Você pode explicar uma situação em que usou joins para combinar dados de múltiplas tabelas?
Um exemplo de resposta:
Recentemente, trabalhei em um projeto com duas tabelas principais — uma com dados de vendas e outra com detalhes dos produtos. Minha tarefa era criar um relatório com sales, product name, category e price.
Para combinar os dados, usei um INNER JOIN na coluna em comum, product_id, ligando as transações aos detalhes do produto:
SELECT
s.sales_date,
p.product_name,
p.category,
s.quantity_sold,
p.price
FROM
sales s
INNER JOIN
products p
ON
s.product_id = p.product_id;
O relatório deu uma visão clara das tendências de vendas, ajudando as áreas de negócio a identificar categorias com melhor desempenho e as que precisavam de atenção.
34. Você tem experiência com triggers? Explique como você os utilizou.
Exemplo de resposta:
Sim, tenho ampla experiência com triggers. No meu último cargo, implementei um trigger AFTER UPDATE para auditoria de alterações de preço.
A implementação: criei um trigger que captura automaticamente o histórico sempre que o preço de um produto muda. Eis o script SQL:
CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
-- Só registra se o preço realmente mudou
IF OLD.UnitPrice <> NEW.UnitPrice THEN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
VALUES (
NEW.ProductID,
OLD.UnitPrice,
NEW.UnitPrice,
CURRENT_USER(),
NOW(),
ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
);
END IF;
END;
O que tornou a solução eficaz:
- Só dispara quando há mudança de preço de fato.
- Captura o usuário que fez a alteração com
SYSTEM_USER. - Calcula a variação percentual para relatórios.
- Inclui uma condição para ignorar não-mudanças decorrentes de updates em outras colunas.
Também adicionamos tratamento de erros e logging após notar casos de borda com preços NULL.
Dicas para se preparar para uma entrevista de MySQL
Se você está começando a carreira, aqui vão algumas dicas para arrasar na entrevista:
Domine os conceitos centrais do MySQL: aprenda os fundamentos de banco de dados como indexação, transações e otimizador de queries. Entenda como o MySQL processa consultas e gerencia armazenamento. Isso ajuda a escrever queries eficientes e a defender suas soluções na entrevista.
Mão na massa: instale o MySQL no seu computador e pratique regularmente. Crie bancos de teste, escreva diferentes tipos de queries e tente otimizá-las. Prática real é a melhor forma de aprender e ganhar confiança.
Para reforçar seus conhecimentos, confira os recursos da DataCamp:
- Para introdução a SQL: Introduction to SQL Course
- Para praticar SQL: Applying SQL to real-world problems
Conheça ferramentas e integrações do MySQL: familiarize-se com o MySQL Workbench e outras ferramentas de gestão e monitoramento básico. Você também pode explorar como o MySQL funciona com Python e frameworks relevantes, mostrando que você atua bem em ambientes reais de desenvolvimento.
Conclusão
É isso! Reuni as 34 principais perguntas de entrevista sobre MySQL para ajudar você a conquistar sua próxima vaga. Seja para posições de entrada ou para cargos de administração de dados avançados, dominar fundamentos do MySQL, otimização de queries e gestão de bancos é essencial para se destacar.
Para expandir seu conhecimento em outros sistemas de gerenciamento de banco de dados, confira os cursos de SQL da DataCamp.
Torne-se certificado em SQL
Sou um estrategista de conteúdo que adora simplificar tópicos complexos. Ajudei empresas como Splunk, Hackernoon e Tiiny Host a criar conteúdo envolvente e informativo para seus públicos.



