Comandos para definir e modificar a estrutura do banco de dados
Primeiro passo: criar a estrutura da tabela com colunas, tipos de dados e constraints.
Use quando precisar criar uma nova tabela no banco de dados pela primeira vez.
Defina o nome da tabela, as colunas com seus tipos de dados e a chave primária.
CREATE TABLE pessoas (
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(30) NOT NULL,
nascimento DATE,
sexo ENUM('M', 'F'),
peso DECIMAL(5, 2),
altura DECIMAL(3, 2),
nacionalidade VARCHAR(20) DEFAULT 'Brasil',
PRIMARY KEY (id)
) DEFAULT CHARSET = utf8;
Após criar a tabela, podemos adicionar, remover ou modificar colunas.
Use quando precisar adicionar, remover ou reposicionar colunas em uma tabela existente.
Use ADD COLUMN para adicionar, DROP COLUMN para remover, AFTER/FIRST para posicionar.
-- Adicionando uma nova coluna no final
ALTER TABLE pessoas
ADD COLUMN profissao VARCHAR(10);
-- Removendo uma coluna
ALTER TABLE pessoas
DROP COLUMN profissao;
-- Adicionando coluna em posição específica
ALTER TABLE pessoas
ADD COLUMN profissao VARCHAR(10) AFTER nome;
-- Adicionando coluna como primeira da tabela
ALTER TABLE pessoas
ADD COLUMN codigo INT FIRST;
Modificando tipo, tamanho, NOT NULL e DEFAULT de uma coluna já existente.
ALTER TABLE pessoas
MODIFY COLUMN profissao VARCHAR(20) NOT NULL DEFAULT '';
Alterando o nome de uma coluna (e suas características se necessário).
ALTER TABLE pessoas
CHANGE COLUMN nacionalidade nascionalidade VARCHAR(20);
Alterando o nome da tabela inteira.
DESC familia;
ALTER TABLE pessoas
RENAME TO familia;
SELECT * FROM familia;
Criando tabela com UNIQUE, UNSIGNED e adicionando chave primária depois.
CREATE TABLE IF NOT EXISTS cursos (
nome VARCHAR(30) NOT NULL UNIQUE,
descricao TEXT,
carga INT UNSIGNED,
totaulas INT UNSIGNED,
ano YEAR DEFAULT '2026'
) DEFAULT CHARSET = utf8;
-- Adicionando coluna de ID posteriormente
ALTER TABLE cursos
ADD COLUMN idcursos INT FIRST;
-- Definindo a chave primária após a criação
ALTER TABLE cursos
ADD PRIMARY KEY (idcursos);
Removendo completamente uma tabela (estrutura e dados). ⚠️ Use com cuidado!
CREATE TABLE IF NOT EXISTS teste (
id INT,
nome VARCHAR(10),
idade INT
);
INSERT INTO teste VALUES
('1', 'Pedro', '22'),
('2', 'Maria', '12'),
('3', 'Maricota', '77');
SELECT * FROM teste;
-- CUIDADO: DROP TABLE remove tudo permanentemente!
DROP TABLE IF EXISTS teste;
Comandos para manipular os dados dentro das tabelas
Adicionando registros na tabela usando DEFAULT para valores automáticos.
Use quando precisar adicionar novos registros (linhas) na tabela.
Especifique os valores na ordem das colunas. Use DEFAULT para valores automáticos.
INSERT INTO pessoas VALUES
(DEFAULT, 'Andressa', '2001-04-16', 'F', '45.5', '1.62', DEFAULT);
Visualizando os dados inseridos na tabela.
SELECT * FROM pessoas;
Inserindo múltiplos registros em uma única instrução.
INSERT INTO cursos VALUES
('1', 'HTML4', 'Curso de HTML5', '40', '37', '2014'),
('2', 'Algoritmos', 'Lógica de Programação', '20', '15', '2014'),
('3', 'Photoshop', 'Dicas de Photoshop CC', '10', '8', '2014'),
('4', 'PGP', 'Curso de PHP para iniciantes', '40', '20', '2010'),
('5', 'Jarva', 'Introdução à Linguagem Java', '10', '29', '2000'),
('6', 'MySQL', 'Bancos de Dados MySQL', '30', '15', '2016'),
('7', 'Word', 'Curso completo de Word', '40', '30', '2016'),
('8', 'Sapateado', 'Danças Rítmicas', '40', '30', '2018'),
('9', 'Cozinha Árabe', 'Aprenda a fazer Kibe', '40', '30', '2018'),
('10', 'YouTuber', 'Gerar polêmica e ganhar inscritos', '5', '2', '2018');
Alterando valores de registros já inseridos na tabela.
Use quando precisar alterar dados de registros que já existem na tabela.
Use SET para definir novos valores e WHERE para especificar quais registros alterar.
-- Modificando uma única coluna
UPDATE cursos
SET nome = 'HTML 5'
WHERE idcursos = '1';
-- Modificando múltiplas colunas ao mesmo tempo
UPDATE cursos
SET nome = 'PHP', ano = '2015'
WHERE idcursos = '4';
-- Usando LIMIT para limitar quantas linhas serão afetadas
UPDATE cursos
SET nome = 'Java', carga = '40', ano = '2015'
WHERE idcursos = '5'
LIMIT 1;
Deletando registros da tabela (mantém a estrutura).
-- Deletando um registro específico
DELETE FROM cursos
WHERE idcursos = '9';
-- Deletando múltiplos registros com LIMIT
DELETE FROM cursos
WHERE ano = '2018'
LIMIT 2;
Apagando todos os registros mas mantendo a estrutura da tabela.
TRUNCATE TABLE cursos;
Filtrando, ordenando e selecionando colunas específicas
Em vez de usar * (todas as colunas), podemos selecionar apenas as colunas que precisamos.
-- Selecionando apenas nome e nascimento
SELECT nome, nascimento
FROM gafanhotos;
Usando WHERE para filtrar dados com base em condições específicas.
-- Filtrando por uma condição simples
SELECT nome, nascimento
FROM gafanhotos
WHERE nascimento > '2000-01-01';
BETWEEN permite filtrar valores dentro de um intervalo (inclusive os limites).
-- Selecionando registros entre duas datas
SELECT nome, nascimento
FROM gafanhotos
WHERE nascimento BETWEEN '2000-01-01' AND '2015-12-31';
Ordenando os resultados por uma ou mais colunas (ASC = crescente, DESC = decrescente).
-- Ordenando por nascimento (crescente por padrão)
SELECT nome, nascimento
FROM gafanhotos
ORDER BY nascimento;
-- Ordenando de forma decrescente
SELECT nome, nascimento
FROM gafanhotos
ORDER BY nascimento DESC;
-- Ordenando por múltiplas colunas
SELECT nome, nascimento
FROM gafanhotos
ORDER BY nascimento, nome;
Exemplo completo: selecionando colunas específicas, filtrando por intervalo e ordenando.
-- Lista com nome e nascimento de todos que nasceram entre 2000 e 2015
SELECT nome, nascimento
FROM gafanhotos
WHERE nascimento BETWEEN '2000-01-01' AND '2015-12-31'
ORDER BY nascimento;
Limitando a quantidade de registros retornados pela consulta.
-- Retornando apenas os 5 primeiros registros
SELECT nome, nascimento
FROM gafanhotos
ORDER BY nascimento
LIMIT 5;
-- Pulando os 3 primeiros e retornando os próximos 5 (paginação)
SELECT nome, nascimento
FROM gafanhotos
ORDER BY nascimento
LIMIT 3, 5;
Usando LIKE para buscar registros que correspondem a um padrão (% = qualquer sequência, _ = um caractere).
-- Nomes que começam com 'A'
SELECT nome
FROM gafanhotos
WHERE nome LIKE 'A%';
-- Nomes que terminam com 'a'
SELECT nome
FROM gafanhotos
WHERE nome LIKE '%a';
-- Nomes que contêm 'silva'
SELECT nome
FROM gafanhotos
WHERE nome LIKE '%silva%';
Usando IN para verificar se um valor está em uma lista específica.
-- Selecionando registros de anos específicos
SELECT nome, nascimento
FROM gafanhotos
WHERE YEAR(nascimento) IN (2000, 2005, 2010, 2015);
Exemplos práticos de consultas combinando múltiplos conceitos.
-- Selecionar nome, sexo e profissão de programadores do sexo masculino
SELECT nome, sexo, profissao
FROM gafanhotos
WHERE profissao = 'Programador' AND sexo = 'M';
-- Listar mulheres nascidas no Brasil com nome começando com 'J'
SELECT nome, nacionalidade
FROM gafanhotos
WHERE nome LIKE 'J%'
AND nacionalidade = 'Brasil';
-- Buscar todos entre 2000 e 2015, ordenados por nascimento
SELECT nome, nascimento
FROM gafanhotos
WHERE nascimento BETWEEN '2000-01-01' AND '2015-12-31'
ORDER BY nascimento;
-- Combinar múltiplas condições com AND e OR
SELECT nome, sexo, profissao, nacionalidade
FROM gafanhotos
WHERE (profissao = 'Programador' OR profissao = 'Desenvolvedor')
AND nacionalidade = 'Brasil'
ORDER BY nome;
-- Filtrar por múltiplas condições: sexo, nacionalidade, peso e padrão de nome
SELECT nome, nacionalidade, peso
FROM gafanhotos
WHERE sexo = 'M'
AND nacionalidade != 'Brasil'
AND peso < 100
AND nome LIKE '%Silva%';
Trabalhando com funções MAX, MIN, AVG, COUNT e subconsultas
A função MAX() retorna o maior valor de uma coluna.
-- Encontrando a maior altura
SELECT MAX(altura) FROM pessoas;
-- Encontrando o maior peso
SELECT MAX(peso) FROM pessoas;
A função MIN() retorna o menor valor de uma coluna.
-- Encontrando a menor altura
SELECT MIN(altura) FROM pessoas;
-- Encontrando o menor peso
SELECT MIN(peso) FROM pessoas;
A função AVG() calcula a média dos valores de uma coluna.
-- Calculando a média de altura
SELECT AVG(altura) FROM pessoas;
-- Calculando a média de peso
SELECT AVG(peso) FROM pessoas;
A função COUNT() conta o número de registros.
-- Contando total de registros
SELECT COUNT(*) FROM pessoas;
-- Contando registros com condição
SELECT COUNT(*) FROM pessoas
WHERE sexo = 'F';
Usando uma consulta dentro de outra para filtrar resultados baseados em valores calculados.
-- ❌ INCORRETO: MAX() não identifica a linha inteira corretamente
SELECT nome, altura
FROM pessoas
WHERE altura = MAX(altura);
-- ✅ CORRETO: Usando subconsulta para encontrar a pessoa mais alta
SELECT nome, altura
FROM pessoas
WHERE altura = (SELECT MAX(altura) FROM pessoas);
-- Pessoa com menor peso
SELECT nome, peso
FROM pessoas
WHERE peso = (SELECT MIN(peso) FROM pessoas);
-- Pessoas com altura acima da média
SELECT nome, altura
FROM pessoas
WHERE altura > (SELECT AVG(altura) FROM pessoas);
Boas práticas e observações importantes sobre consultas.
Problema: MAX() encontra o maior valor, mas não identifica corretamente a linha inteira sem subconsulta.
Solução: Use subconsultas para garantir que você obtenha o registro completo correto.
Alternativa: Para pegar a pessoa mais alta, você também pode usar:
SELECT nome, altura FROM pessoas ORDER BY altura DESC LIMIT 1;
Isso normalmente funciona para pegar a pessoa mais alta, mas subconsultas garantem todos os empates.
Agrupando registros e filtrando grupos com condições
GROUP BY agrupa registros que têm valores iguais em colunas específicas, permitindo usar funções de agregação por grupo.
Use quando quiser contar, somar ou calcular médias por categoria (ex: contar pessoas por profissão).
Combine com funções como COUNT(), SUM(), AVG(). Agrupe pela coluna que define as categorias.
-- Contando quantas pessoas existem por profissão
SELECT profissao, COUNT(*)
FROM gafanhotos
GROUP BY profissao
ORDER BY COUNT(profissao);
-- Contando pessoas por sexo (nascidas após 2005)
SELECT sexo, COUNT(*)
FROM gafanhotos
WHERE nascimento > '2005-01-01'
GROUP BY sexo;
HAVING filtra grupos após o agrupamento (diferente de WHERE que filtra antes). Use HAVING para condições com funções de agregação.
-- Contando cursos por ano, apenas anos após 2013, ordenado por quantidade decrescente
SELECT ano, COUNT(*)
FROM cursos
WHERE totaulas > 30
GROUP BY ano
HAVING ano > 2013
ORDER BY COUNT(*) DESC;
ROUND() arredonda números decimais para um número específico de casas decimais.
-- Calculando a média de carga arredondada
SELECT ROUND(AVG(carga)) FROM cursos;
-- Arredondando para 2 casas decimais
SELECT ROUND(AVG(carga), 2) FROM cursos;
Combinando agrupamento com subconsultas para filtros mais complexos.
-- Cursos agrupados por carga, apenas cargas acima da média
SELECT carga, COUNT(*)
FROM cursos
WHERE ano > 2015
GROUP BY carga
HAVING carga > (SELECT ROUND(AVG(carga)) FROM cursos);
Exemplos práticos de agrupamento e filtragem de grupos.
-- Nacionalidades com mais de 3 pessoas (exceto Brasil)
SELECT nome, nacionalidade, COUNT(*)
FROM gafanhotos
WHERE nacionalidade != 'Brasil'
GROUP BY nacionalidade
HAVING COUNT(*) > 3;
-- Alturas de pessoas com peso > 100, apenas alturas acima da média geral
SELECT altura, COUNT(*)
FROM gafanhotos
WHERE peso > 100
GROUP BY altura
HAVING altura > (SELECT AVG(altura) FROM gafanhotos);
Entendendo a diferença entre WHERE e HAVING.
Conectando tabelas através de chaves estrangeiras e consultas relacionadas
Chaves estrangeiras (Foreign Keys) criam relacionamentos entre tabelas, garantindo integridade referencial.
Use quando uma tabela precisa referenciar dados de outra tabela (ex: aluno referenciando um curso).
Adicione uma coluna e crie a foreign key referenciando a chave primária da outra tabela.
-- Adicionando uma coluna para armazenar o curso preferido
ALTER TABLE gafanhotos
ADD cursopreferido INT;
-- Verificando a estrutura da tabela
DESC gafanhotos;
-- Criando a chave estrangeira que referencia a tabela cursos
ALTER TABLE gafanhotos
ADD FOREIGN KEY (cursopreferido)
REFERENCES cursos(idcurso);
Uma Foreign Key (chave estrangeira) é uma coluna que faz referência à chave primária de outra tabela.
Benefícios:
Após criar o relacionamento, podemos atualizar os registros com valores válidos da tabela referenciada.
-- Consultando cursos disponíveis
SELECT * FROM cursos;
-- Consultando gafanhotos
SELECT * FROM gafanhotos;
-- Atualizando o curso preferido do gafanhoto com id 1
UPDATE gafanhotos
SET cursopreferido = '6'
WHERE id = '1';
Foreign Keys impedem a exclusão de registros que estão sendo referenciados por outras tabelas.
-- ❌ Tentando deletar um curso que está sendo referenciado
-- Isso vai FALHAR se algum gafanhoto tiver este curso como preferido
DELETE FROM cursos
WHERE idcurso = '28';
Se você tentar deletar um curso que está sendo usado como "cursopreferido" por algum gafanhoto, o MySQL retornará um erro:
ERROR 1451: Cannot delete or update a parent row: a foreign key constraint fails
Isso é bom! Protege seus dados de inconsistências.
JOIN permite combinar dados de múltiplas tabelas baseado em uma condição de relacionamento.
-- Consultando apenas nomes e IDs dos cursos preferidos
-- Problema: só vemos números, não sabemos qual é o curso!
SELECT nome, cursopreferido
FROM gafanhotos;
-- Resultado: João | 6 (o que é o curso 6?)
-- Combinando as duas tabelas para mostrar nomes legíveis
SELECT gafanhotos.nome, cursos.nome
FROM gafanhotos JOIN cursos
ON cursos.idcurso = gafanhotos.cursopreferido
ORDER BY gafanhotos.nome;
-- Resultado: João | MySQL (muito melhor!)
Passo a passo:
idcurso = cursopreferidoImportante: INNER JOIN só retorna registros que existem em AMBAS as tabelas.
SELECT tabela1.coluna, tabela2.coluna
FROM tabela1 JOIN tabela2
ON tabela1.chave_estrangeira = tabela2.chave_primaria
Nota: Precisamos especificar tabela.coluna quando as duas tabelas têm colunas com o mesmo nome (como "nome" neste caso).
Alias (apelidos) tornam as consultas mais legíveis e menos verbosas, especialmente com JOINs.
-- Escrevendo o nome completo das tabelas toda vez
SELECT gafanhotos.nome, cursos.nome, cursos.ano
FROM gafanhotos JOIN cursos
ON cursos.idcurso = gafanhotos.cursopreferido
ORDER BY gafanhotos.nome;
-- Usando alias "g" para gafanhotos e "c" para cursos
SELECT g.nome AS gafanhoto, c.nome AS curso, c.ano
FROM gafanhotos AS g JOIN cursos AS c
ON c.idcurso = g.cursopreferido
ORDER BY g.nome;
-- Versão ainda mais curta (AS é opcional)
SELECT g.nome gafanhoto, c.nome curso, c.ano
FROM gafanhotos g JOIN cursos c
ON c.idcurso = g.cursopreferido
ORDER BY g.nome;
Dica: Use alias curtos e significativos (g, c, p) para tabelas e nomes descritivos para colunas.
Existem diferentes tipos de JOIN para diferentes necessidades.
Retorna apenas registros que têm correspondência em ambas as tabelas.
Retorna todos os registros da tabela esquerda, mesmo sem correspondência na direita.
Retorna todos os registros da tabela direita, mesmo sem correspondência na esquerda.
-- INNER JOIN: apenas gafanhotos que têm curso preferido cadastrado
SELECT gafanhotos.nome, cursos.nome
FROM gafanhotos JOIN cursos
ON cursos.idcurso = gafanhotos.cursopreferido
ORDER BY gafanhotos.nome;
Mostra: Apenas gafanhotos que escolheram um curso preferido E esse curso existe na tabela cursos.
Não mostra:
Use quando: Você quer apenas dados completos, sem valores NULL.
-- LEFT OUTER JOIN: todos os gafanhotos, mesmo sem curso preferido
SELECT gafanhotos.nome, cursos.nome
FROM gafanhotos LEFT OUTER JOIN cursos
ON cursos.idcurso = gafanhotos.cursopreferido
ORDER BY gafanhotos.nome;
Mostra: TODOS os gafanhotos, independente de terem curso preferido ou não.
Comportamento:
Use quando: A tabela da esquerda (gafanhotos) é a principal e você quer ver todos os seus registros.
Exemplo prático: "Quero ver todos os alunos, incluindo os que ainda não escolheram um curso."
-- RIGHT OUTER JOIN: todos os cursos, mesmo sem gafanhotos preferindo
SELECT gafanhotos.nome, cursos.nome
FROM gafanhotos RIGHT OUTER JOIN cursos
ON cursos.idcurso = gafanhotos.cursopreferido
ORDER BY gafanhotos.nome;
Mostra: TODOS os cursos, independente de terem sido escolhidos ou não.
Comportamento:
Use quando: A tabela da direita (cursos) é a principal e você quer ver todos os seus registros.
Exemplo prático: "Quero ver todos os cursos disponíveis, incluindo os que ninguém se interessou."
Entenda quando usar cada tipo de JOIN com exemplos práticos.
Nota: OUTER é opcional. "LEFT JOIN" e "LEFT OUTER JOIN" são equivalentes.
CREATE, ALTER, DROP, RENAME, MODIFY, CHANGE
INSERT, SELECT, UPDATE, DELETE, TRUNCATE
SELECT, WHERE, BETWEEN, ORDER BY, LIMIT, LIKE, IN
MAX, MIN, AVG, COUNT, Subconsultas
GROUP BY, HAVING, ROUND
FOREIGN KEY, INNER JOIN, LEFT JOIN, RIGHT JOIN
Responda aos exercícios práticos e verifique seu aprendizado
Você precisa criar uma tabela chamada "produtos" com as seguintes colunas:
- id (número inteiro, auto incremento, chave primária)
- nome (texto até 50 caracteres, obrigatório)
- preco (decimal com 2 casas decimais)
- estoque (número inteiro)
Você tem uma tabela "alunos" e precisa selecionar apenas os alunos que nasceram entre 2000 e 2010, ordenados por nome. Qual comando usar?
Você precisa contar quantos funcionários existem em cada departamento, mostrando apenas departamentos com mais de 5 funcionários. Qual comando usar?
Você tem duas tabelas: "clientes" e "pedidos". Precisa mostrar o nome de todos os clientes e seus pedidos (se tiverem). Qual JOIN usar?
Considerando os conceitos de Banco de Dados, relacione os parênteses vazios aos seus conceitos, depois assinale a alternativa que apresenta a sequência correta.
1 - DCL
2 - DDL
3 - DML
( ) permite conceder, retirar e controlar permissões de uso
( ) voltado à manipulação de dados
( ) voltado à definição de dados
Examine as tabelas Empregado e Pagamento do banco de dados a seguir e a instrução SQL, e assinale a opção correta.
Empregado
| id | nome | idade |
|---|---|---|
| 1 | João | 20 |
| 2 | Maria | 30 |
| 3 | José | 22 |
| 4 | Joaquim | 26 |
| 5 | Manoel | 21 |
Pagamento
| empregado_id | data | valor |
|---|---|---|
| 1 | 02-jul-08 | 1000 |
| 2 | 02-jul-08 | 2000 |
| 3 | 02-jul-08 | 1400 |
| 4 | 02-jul-08 | 1200 |
| 5 | 02-jul-08 | 5000 |
SELECT count(*)
FROM Empregado, Pagamento
WHERE Empregado.id = Pagamento.empregado_id
AND Empregado.idade < 25 AND Pagamento.valor > 1500
O resultado da consulta SQL é:
Uma transação representa uma interação entre a aplicação e o sistema de banco de dados tratada de forma única e independente. De acordo com as propriedades da transação, relacione as colunas e, a seguir, assinale a alternativa com a sequência correta.
1 - Atomicidade
2 - Consistência
3 - Isolamento
4 - Durabilidade
( ) Garante que o banco de dados esteja em um estado íntegro depois de a transação ser realizada.
( ) Garante que todas as tarefas da transação sejam cumpridas, ou a mesma seja cancelada como um todo.
( ) Garante que o resultado de uma transação só seja visível para outras transações no momento em que ela é finalizada com sucesso.
( ) Garante que a transação seja persistida assim que finalizada, ou seja, não será desfeita ou perdida mesmo na ocorrência de falhas do sistema.
Escreva código SQL real e execute para verificar se está correto
Você foi contratado para criar um sistema de gerenciamento de uma biblioteca. Siga as instruções abaixo e escreva o código SQL necessário.
Importante: Execute cada comando na ordem correta. O sistema verificará se sua solução está correta!
Crie uma tabela chamada livros com as seguintes colunas:
Insira os seguintes livros na tabela (use DEFAULT para o id):
Selecione o titulo e preco de todos os livros com preço maior que 40.00, ordenados por preço decrescente.
Aumente em 10% o preço de todos os livros publicados antes de 1950.
Adicione uma nova coluna chamada editora do tipo VARCHAR(50) na tabela livros.
Remova a coluna editora da tabela livros.
Delete todos os livros publicados antes de 1900.
Delete todos os livros cujo título começa com a letra 'O'.
Selecione titulo e ano dos livros publicados entre 1940 e 1960.
Selecione todos os campos dos livros cujo autor contém 'Machado' no nome.
Selecione titulo e preco dos 2 livros mais caros (ordenados por preço decrescente).
Selecione titulo e ano dos livros publicados nos anos 1949, 1954 ou 1960.
Conte quantos livros existem agrupados por ano, ordenando por ano.
Calcule a média de preço dos livros agrupados por ano, mostrando apenas anos com média acima de 40.