Guia essencial de SQL em português para iniciantes. Conceitos fundamentais com exemplos práticos de banco de dados.
1-- Comentários em SQL começam com dois hífens (ou /* ... */ para blocos) 2-- Cada comando é encerrado com um ponto e vírgula (;) 3 4/* SQL não diferencia maiúsculas de minúsculas para palavras-chave, 5 mas é convenção escrevê-las em MAIÚSCULAS para melhor legibilidade */ 6 7
1-- Criar um novo banco de dados 2CREATE DATABASE loja_online; 3 4-- Listar todos os bancos de dados disponíveis 5SHOW DATABASES; 6 7-- Usar um banco de dados específico 8USE loja_online; 9 10-- Deletar um banco de dados (cuidado!) 11DROP DATABASE loja_online; 12 13-- Verificar qual banco de dados está em uso 14SELECT DATABASE();
1-- Usar banco de dados para os exemplos 2USE loja_online; 3 4-- Selecionar todas as colunas de uma tabela 5SELECT * FROM produtos; 6 7-- Selecionar apenas colunas específicas 8SELECT id, nome, preco FROM produtos; 9 10-- Selecionar com alias (renomear) para melhor legibilidade 11SELECT 12 id AS produto_id, 13 nome AS nome_do_produto, 14 preco AS valor_unitario 15FROM produtos; 16 17-- Limitar o número de resultados 18SELECT * FROM clientes LIMIT 10; 19 20-- Pular linhas e depois limitar (offset) 21SELECT * FROM pedidos LIMIT 10 OFFSET 20;
1-- Filtrar linhas por uma condição simples 2SELECT * FROM produtos WHERE preco > 100; 3 4-- Múltiplas condições com AND e OR 5SELECT * FROM produtos 6WHERE categoria = 'eletrônicos' AND preco < 500; 7 8SELECT * FROM clientes 9WHERE cidade = 'São Paulo' OR cidade = 'Rio de Janeiro'; 10 11-- Operadores de comparação 12SELECT * FROM pedidos WHERE data_pedido = '2024-01-15'; 13SELECT * FROM produtos WHERE estoque >= 50; 14SELECT * FROM usuarios WHERE ativo != 0; 15 16-- Padrões com LIKE (wildcards: % para múltiplos caracteres, _ para um) 17SELECT * FROM clientes WHERE nome LIKE 'Maria%'; -- Começa com Maria 18SELECT * FROM clientes WHERE nome LIKE '%Silva'; -- Termina com Silva 19SELECT * FROM produtos WHERE descricao LIKE '%azul%'; -- Contém azul 20 21-- Verificar se está em uma lista 22SELECT * FROM produtos WHERE categoria IN ('livros', 'ebooks', 'audiobooks'); 23 24-- Verificar valores nulos 25SELECT * FROM usuarios WHERE telefone IS NULL; 26SELECT * FROM usuarios WHERE data_cancelamento IS NOT NULL; 27 28-- Intervalo de valores 29SELECT * FROM vendas WHERE valor BETWEEN 1000 AND 5000;
1-- Contar linhas 2SELECT COUNT(*) FROM pedidos; 3 4-- Contar com condição 5SELECT COUNT(*) FROM pedidos WHERE status = 'entregue'; 6 7-- Valores únicos (sem duplicatas) 8SELECT DISTINCT cidade FROM clientes; 9SELECT DISTINCT categoria FROM produtos ORDER BY categoria; 10 11-- Contar valores únicos 12SELECT COUNT(DISTINCT categoria) FROM produtos; 13 14-- Operações matemáticas 15SELECT SUM(valor) FROM pedidos; -- Soma total 16SELECT AVG(preco) FROM produtos; -- Média 17SELECT MAX(data_pedido) FROM pedidos; -- Valor máximo 18SELECT MIN(estoque) FROM produtos; -- Valor mínimo 19 20-- Agrupar dados com GROUP BY 21SELECT categoria, COUNT(*) as quantidade FROM produtos GROUP BY categoria; 22 23SELECT cidade, SUM(total) as vendas_totais 24FROM pedidos 25GROUP BY cidade 26ORDER BY vendas_totais DESC; 27 28-- Filtrar grupos com HAVING 29SELECT 30 categoria, 31 COUNT(*) as quantidade_produtos, 32 AVG(preco) as preco_medio 33FROM produtos 34GROUP BY categoria 35HAVING COUNT(*) > 5;
1-- Ordenar resultados 2SELECT * FROM produtos ORDER BY nome; -- Ascendente (padrão) 3SELECT * FROM produtos ORDER BY preco DESC; -- Descendente 4SELECT * FROM produtos ORDER BY categoria ASC, preco DESC; -- Múltiplas colunas 5 6-- Remover duplicatas 7SELECT DISTINCT email FROM usuarios; 8 9-- Operações entre colunas 10SELECT 11 nome, 12 preco, 13 estoque, 14 preco * estoque as valor_total_estoque 15FROM produtos; 16 17-- Concatenação de strings 18SELECT CONCAT(primeiro_nome, ' ', sobrenome) as nome_completo FROM usuarios; 19SELECT primeiro_nome || ' ' || sobrenome as nome_completo FROM usuarios; -- PostgreSQL 20 21-- Operações com strings 22SELECT UPPER(nome) as nome_maiusculo FROM clientes; 23SELECT LENGTH(descricao) as quantidade_caracteres FROM produtos;
1-- INNER JOIN - apenas registros com correspondência em ambas as tabelas 2SELECT 3 c.nome, 4 p.numero_pedido, 5 p.valor 6FROM clientes c 7INNER JOIN pedidos p ON c.id = p.cliente_id; 8 9-- LEFT JOIN - todos os registros da tabela esquerda, mesmo sem correspondência 10SELECT 11 c.nome, 12 COUNT(p.id) as total_pedidos 13FROM clientes c 14LEFT JOIN pedidos p ON c.id = p.cliente_id 15GROUP BY c.id, c.nome; 16 17-- RIGHT JOIN - todos os registros da tabela direita 18SELECT 19 c.nome, 20 p.numero_pedido 21FROM clientes c 22RIGHT JOIN pedidos p ON c.id = p.cliente_id; 23 24-- FULL OUTER JOIN - todos os registros de ambas as tabelas 25SELECT 26 c.nome, 27 p.numero_pedido 28FROM clientes c 29FULL OUTER JOIN pedidos p ON c.id = p.cliente_id; 30 31-- Múltiplos JOINs 32SELECT 33 c.nome, 34 p.numero_pedido, 35 i.nome_produto, 36 i.quantidade 37FROM clientes c 38INNER JOIN pedidos p ON c.id = p.cliente_id 39INNER JOIN itens_pedido i ON p.id = i.pedido_id;
1-- Inserir uma nova linha 2INSERT INTO usuarios (nome, email, data_criacao) 3VALUES ('João Santos', 'joao@email.com', '2024-01-15'); 4 5-- Inserir múltiplas linhas 6INSERT INTO categorias (nome, descricao) VALUES 7 ('Eletrônicos', 'Produtos eletrônicos em geral'), 8 ('Livros', 'Livros de diversos gêneros'); 9 10-- Atualizar dados existentes 11UPDATE produtos SET preco = 150 WHERE id = 5; 12 13-- Atualizar múltiplas colunas 14UPDATE usuarios 15SET data_atualizacao = '2024-01-20', ativo = 1 16WHERE email = 'usuarios@example.com'; 17 18-- Atualizar com condição 19UPDATE pedidos 20SET status = 'enviado' 21WHERE data_pedido < '2024-01-10' AND status = 'preparando'; 22 23-- Deletar registros 24DELETE FROM carrinho WHERE session_id = 'abc123'; 25 26-- Deletar com condição 27DELETE FROM logs WHERE data_criacao < DATE_SUB(NOW(), INTERVAL 30 DAY); 28 29-- Deletar todos os registros de uma tabela (deixando estrutura intacta) 30DELETE FROM tabela_temporaria;
1-- Criar uma tabela com tipos de dados e constraints 2CREATE TABLE usuarios ( 3 id INT PRIMARY KEY AUTO_INCREMENT, 4 nome VARCHAR(100) NOT NULL, 5 email VARCHAR(100) UNIQUE NOT NULL, 6 data_criacao DATETIME DEFAULT CURRENT_TIMESTAMP, 7 ativo BOOLEAN DEFAULT 1 8); 9 10-- Criar tabela com chave estrangeira 11CREATE TABLE pedidos ( 12 id INT PRIMARY KEY AUTO_INCREMENT, 13 numero_pedido VARCHAR(50) UNIQUE, 14 usuario_id INT NOT NULL, 15 valor DECIMAL(10, 2), 16 status VARCHAR(20) DEFAULT 'pendente', 17 data_pedido DATETIME DEFAULT CURRENT_TIMESTAMP, 18 FOREIGN KEY (usuario_id) REFERENCES usuarios(id) 19); 20 21-- Adicionar uma nova coluna 22ALTER TABLE usuarios ADD COLUMN telefone VARCHAR(20); 23 24-- Modificar tipo de dados de uma coluna 25ALTER TABLE usuarios MODIFY COLUMN nome VARCHAR(150); 26 27-- Remover uma coluna 28ALTER TABLE usuarios DROP COLUMN telefone; 29 30-- Adicionar uma constraint 31ALTER TABLE usuarios ADD CONSTRAINT uq_email UNIQUE (email); 32 33-- Deletar uma tabela (estrutura e dados) 34DROP TABLE usuarios; 35 36-- Ver estrutura de uma tabela 37DESCRIBE usuarios; 38SHOW COLUMNS FROM usuarios;
1-- Subconsultas (Subqueries) 2SELECT nome, preco FROM produtos 3WHERE preco > (SELECT AVG(preco) FROM produtos); 4 5-- Subconsulta com IN 6SELECT * FROM clientes 7WHERE id IN (SELECT cliente_id FROM pedidos WHERE valor > 1000); 8 9-- CASE - Condicional dentro do SELECT 10SELECT 11 nome, 12 preco, 13 CASE 14 WHEN preco < 50 THEN 'Barato' 15 WHEN preco < 200 THEN 'Moderado' 16 ELSE 'Caro' 17 END as faixa_preco 18FROM produtos; 19 20-- UNION - Combinar resultados de múltiplas queries 21SELECT nome, 'Cliente' as tipo FROM clientes 22UNION 23SELECT nome, 'Fornecedor' as tipo FROM fornecedores; 24 25-- VIEW - Consulta salva como tabela virtual 26CREATE VIEW clientes_premium AS 27SELECT c.* FROM clientes c 28INNER JOIN pedidos p ON c.id = p.cliente_id 29GROUP BY c.id 30HAVING SUM(p.valor) > 10000; 31 32-- Usar a view como tabela normal 33SELECT * FROM clientes_premium; 34 35-- Transações - garantir integridade dos dados 36START TRANSACTION; 37 38UPDATE contas SET saldo = saldo - 100 WHERE id = 1; 39UPDATE contas SET saldo = saldo + 100 WHERE id = 2; 40 41COMMIT; -- Salva as mudanças 42-- ROLLBACK; -- Desfaz as mudanças se algo der errado