Inserção de Registros
Para adicionar dados utilizamos o comando INSERT INTO. A estrutura básica permite informar campos específicos ou todos na ordem da tabela.
-- Criação da tabela de exemplo
CREATE TABLE usuarios (
cod INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(30) NOT NULL,
genero ENUM('M','F') DEFAULT 'M',
interesses SET('leitura','esportes','musica')
);
-- Inserção completa
INSERT INTO usuarios VALUES (1,'Carlos','M','leitura,esportes');
-- Inserção parcial com campos nomeados
INSERT INTO usuarios (nome, interesses) VALUES ('Ana','leitura,musica');
-- Inserção múltipla
INSERT INTO usuarios VALUES
(2,'Bruno','M','musica'),
(3,'Diana','F','esportes,musica');
-- Inserção via subconsulta
INSERT INTO usuarios_backup (cod, nome) SELECT cod, nome FROM usuarios;
Exclusão de Registros
Antes de remover registros, recomenda-se executar um SELECT com a mesma condição para validar o que será apagado.
-- Verificação prévia
SELECT * FROM usuarios WHERE cod = 2;
-- Exclusão condicional
DELETE FROM usuarios WHERE cod = 2;
-- Exclusão total (mantém o AUTO_INCREMENT atual)
DELETE FROM usuarios;
-- Truncar (zera a tabela e o AUTO_INCREMENT)
TRUNCATE TABLE usuarios;
Importante: DELETE sem cláusula WHERE remove todas as linhas, porém o contador de auto incremento não é reiniciado. Já o TRUNCATE limpa completamente a tabela e reinicia esse contador.
Atualização de Registros
-- Atualização de um campo
UPDATE usuarios SET genero = 'F' WHERE cod = 3;
-- Atualização de múltiplos campos
UPDATE usuarios SET nome = 'Carlos Eduardo', interesses = 'leitura' WHERE cod = 1;
Consulta de Dados
A cláusula SELECT é o coração das consultas. É fundamental compreender a ordem lógica de execução:
FROM— identifica a tabela de origemWHERE— filtra linhas individualmenteGROUP BY— agrupa as linhas filtradasHAVING— filtra os grupos formadosSELECT— projeta as colunas finais (com renomeação e cálculos)ORDER BY— ordena o resultadoLIMIT— restringe a quantidade de linhas retornadas
Por essa razão, WHERE não consegue enxergar alias criados no SELECT, enquanto HAVING e ORDER BY podem utilizá-los.
-- Consulta simples
SELECT * FROM usuarios;
-- Seleção de colunas específicas
SELECT nome, genero FROM usuarios;
-- Renomeação temporária de colunas
SELECT nome AS nome_completo FROM usuarios;
SELECT nome titulo FROM usuarios;
-- Remoção de duplicatas
SELECT DISTINCT genero FROM usuarios;
SELECT DISTINCT idade, genero FROM funcionarios;
-- Operações aritméticas
SELECT funcionario, salario * 12 AS salario_anual FROM folha;
-- Concatenação de strings
SELECT CONCAT('Sr. ', nome) FROM usuarios;
SELECT CONCAT_WS(' | ', nome, idade, cargo) FROM funcionarios;
-- Estrutura condicional CASE
SELECT
CASE
WHEN cargo = 'gerente' THEN nome
WHEN cargo = 'diretor' THEN CONCAT(nome, '_CHEFE')
ELSE CONCAT(nome, '_FUNC')
END AS nome_exibicao
FROM funcionarios;
Filtros com WHERE
A cláusula WHERE atua sobre cada linha individualmente, antes do agrupamanto.
Operadores de Comparação
SELECT * FROM folha WHERE salario > 5000;
SELECT * FROM folha WHERE salario <> 3000;
Intervalos e Conjuntos
-- BETWEEN inclui os extremos
SELECT * FROM folha WHERE salario BETWEEN 8000 AND 15000;
-- IN verifica valores exatos em uma lista
SELECT * FROM folha WHERE salario IN (8000, 15000, 20000);
Busca por Padrões
-- LIKE com curingas: % (vários caracteres) e _ (um caractere)
SELECT * FROM funcionarios WHERE nome LIKE 'A%'; -- nomes iniciados em A
SELECT * FROM funcionarios WHERE nome LIKE '%sil%'; -- nomes contendo "sil"
SELECT * FROM funcionarios WHERE nome LIKE '_o%'; -- segunda letra é 'o'
-- REGEXP para expressões regulares simples
SELECT * FROM funcionarios WHERE nome REGEXP '^A';
SELECT * FROM funcionarios WHERE nome REGEXP 'o$';
Operadores Lógicos
SELECT * FROM folha WHERE salario NOT IN (8000, 15000) AND idade = 30;
SELECT * FROM funcionarios WHERE cargo = 'dev' OR cargo = 'analista';
Verificação de Nulos
SELECT * FROM funcionarios WHERE observacao IS NOT NULL;
SELECT * FROM funcionarios WHERE observacao IS NULL;
Agrupamento e Funções Agregadas
O GROUP BY organiza os registros em grupos. Ao agrupar, as colunas selecionadas devem ser o próprio campo de agrupamanto ou o resultado de uma função agregada.
-- Agrupar por departamento
SELECT departamento, COUNT(*) AS total_func
FROM funcionarios
GROUP BY departamento;
-- Maior salário por cargo
SELECT cargo, MAX(salario) AS maior_salario
FROM folha
GROUP BY cargo;
-- Outras funções: MIN, SUM, AVG
SELECT cargo, MIN(salario), MAX(salario), SUM(salario), AVG(salario)
FROM folha
GROUP BY cargo;
Filtragem de Grupos (HAVING) e Ordenação
HAVING
Diferente do WHERE, o HAVING filtra grupos já formados e acieta funções agregadas em suas condições.
-- Departamentos com média salarial acima de 10000
SELECT departamento, AVG(salario) AS media
FROM folha
GROUP BY departamento
HAVING AVG(salario) > 10000;
ORDER BY
Por padrão a ordenação é ascendente (ASC). Use DESC para ordem decrescente.
-- Ordenação simples
SELECT * FROM folha ORDER BY salario; -- crescente
SELECT * FROM folha ORDER BY salario DESC; -- decrescente
-- Ordenação composta
SELECT * FROM folha ORDER BY salario DESC, idade ASC;
Limitação de Resultados
A cláusula LIMIT restringe a quantidade de registros retornados.
-- Sintaxe: LIMIT offset, quantidade
SELECT * FROM folha ORDER BY salario DESC LIMIT 3; -- 3 maiores salários
SELECT * FROM folha ORDER BY salario DESC LIMIT 2, 1; -- 3º maior salário
-- Sintaxe alternativa com OFFSET
SELECT * FROM folha ORDER BY salario DESC LIMIT 1 OFFSET 2; -- equivalente ao anterior