Em ambientes de teste, certos comandos SQL são frequentemente aplicados. A seguir, uma compilação das consultas mais comuns, sem hierarquia de importância.
Consultas Básicas
- Seleção Completa:
SELECT * FROM tabela_exemplo - Contagem de Valores Únicos:
SELECT COUNT(DISTINCT coluna_alvo) FROM tabela_exemplo - Filtro por Padrão:
SELECT * FROM tabela_exemplo WHERE coluna_alvo LIKE 'padrão%' - Atualização de Dados:
UPDATE tabela_exemplo SET coluna_valor = 'novo_valor' WHERE coluna_filtro = 'condição' - Inserção de Registros:
INSERT INTO tabela_exemplo (coluna1, coluna2) VALUES ('valor1', 'valor2') - Ordenação de Resultados:
SELECT nome_empresa, numero_pedido FROM pedidos ORDER BY nome_empresa DESC - Junção de Tabelas:
SELECT p.sobrenome, p.primeiro_nome, ped.numero_pedido FROM pessoas p JOIN pedidos ped ON p.id_pessoa = ped.id_pessoa
Técnicas Avançadas de Consulta
1. Estrutura de Tabela sem Dados (somente estrutura)
Para criar uma tabela nova baseada na estrutrua de outra, sem copiar registros:
Método 1 (SQL Server): SELECT * INTO tabela_destino FROM tabela_origem WHERE 1=0;
Método 2 (genérico): CREATE TABLE tabela_destino AS SELECT * FROM tabela_origem LIMIT 0;
2. Cópia de Dados entre Tabelas
Transferir dados de uma tabela para outra, mapeando colunas específicas:
INSERT INTO tabela_destino (col_a, col_b, col_c)
SELECT col_x, col_y, col_z FROM tabela_origem;
3. Transferência Entre Bancos de Dados Distintos
Utilizando caminhos absolutos ou referências externas (exemplo genérico):
INSERT INTO tabela_local (campo1, campo2)
SELECT campo_remoto1, campo_remoto2 FROM tabela_remota
WHERE condição;
4. Subconsultas para Filtragem
Usar resultados de uma consulta como critério em outra:
SELECT coluna1, coluna2 FROM tabela_principal
WHERE coluna_chave IN (SELECT coluna_referencia FROM tabela_secundária);
5. Dados com Última Atualização
Obter registros com o timestamp mais recente associado:
SELECT a.titulo, a.autor, b.data_atualizacao
FROM artigos a
JOIN (SELECT id_artigo, MAX(data_modificacao) AS data_atualizacao
FROM historico_edicoes
GROUP BY id_artigo) b ON a.id_artigo = b.id_artigo;
6. Junções Externas
Incluir todos os registros da tabela esquerda, mesmo sem correspondência:
SELECT a.identificador, a.descricao, b.detalhe_complementar
FROM tabela_esquerda a
LEFT JOIN tabela_direita b ON a.chave = b.chave;
7. Consultas em Vistas Derivadas
Utilizar uma subconsulta como uma tabela temporária:
SELECT * FROM (
SELECT campo_a, campo_b, campo_c
FROM tabela_base
) AS vista_temporaria
WHERE vista_temporaria.campo_a > 100;
8. Intervalos com BETWEEN
Definir limites inclusivos ou exclusivos para consultas:
SELECT * FROM registros
WHERE data_evento BETWEEN '2023-01-01' AND '2023-12-31';
SELECT * FROM registros
WHERE valor_numerico NOT BETWEEN 10 AND 50;
9. Listas de Valores com IN
Filtrar por múltiplos valores discretos:
SELECT * FROM tabela_teste
WHERE codigo_status IN ('A', 'B', 'C');
10. Remoção Baseada em Correspondência
Excluir registros da tabela principal que não existem em uma tabela relacionada:
DELETE FROM tabela_principal
WHERE NOT EXISTS (
SELECT 1 FROM tabela_relacionada
WHERE tabela_principal.chave = tabela_relacionada.chave
);
11. Junção Múltipla de Tabelas
Combinar dados de quatro tabelas em uma única consulta:
SELECT *
FROM tabela_a a
INNER JOIN tabela_b b ON a.id = b.id_a
LEFT JOIN tabela_c c ON a.id = c.id_a
RIGHT JOIN tabela_d d ON a.id = d.id_a
WHERE a.condicao = 'valor';
12. Alertas Baseados em Tempo
Identificar eventos que ocorrerão em breve (exemplo: lembretes):
SELECT * FROM agenda_eventos
WHERE TIMESTAMPDIFF(MINUTE, NOW(), data_hora_evento) <= 5;
13. Paginação de Resultados
Implementar paginação diretamente na consulta SQL:
-- Para obter a página 2 com 10 registros por página
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY id_registro) AS linha, *
FROM tabela_dados
) AS paginado
WHERE linha BETWEEN 11 AND 20;
14. Limitação de Linhas
Recuperar apenas as primeiras N linhas de um conjunto:
SELECT * FROM tabela_grande
LIMIT 10;
15. Máximo por Grupo
Selecionar o registro com o maior valor em cada grupo (exemplo: ranking):
SELECT a.grupo_id, a.valor_maximo
FROM (
SELECT grupo_id, MAX(valor) AS valor_maximo
FROM tabela_metricas
GROUP BY grupo_id
) a;
16. Diferença entre Conjuntos
Encontrar registros presentes em uma tabela, mas ausentes em outras:
SELECT coluna_id FROM tabela_a
EXCEPT
SELECT coluna_id FROM tabela_b
EXCEPT
SELECT coluna_id FROM tabela_c;
17. Amostragem Aleatória
Obter registros aleatórios para testes de carga ou amostragem:
SELECT * FROM tabela_completa
ORDER BY RANDOM()
LIMIT 10;
18. Identfiicadores Aleatórios
Gerar valores únicos para simulações:
SELECT UUID();
19. Eliminação de Duplicatas
Remover registros duplicados mantendo apenas uma instância:
-- Método 1: Manter o registro com maior ID
DELETE FROM tabela_com_duplicatas
WHERE id_registro NOT IN (
SELECT MAX(id_registro)
FROM tabela_com_duplicatas
GROUP BY coluna1, coluna2
);
-- Método 2: Usar tabela temporária
CREATE TABLE tabela_temp AS SELECT DISTINCT * FROM tabela_com_duplicatas;
TRUNCATE TABLE tabela_com_duplicatas;
INSERT INTO tabela_com_duplicatas SELECT * FROM tabela_temp;
DROP TABLE tabela_temp;
20. Listagem de Tabelas do Banco
Recuperar nomes de todas as tabelas definidas pelo usuário:
SELECT table_name
FROM information_schema.tables
WHERE table_type = 'BASE TABLE';
21. Listagem de Colunas de uma Tabela
Obter informações sobre as colunas de uma tabela específica:
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'nome_da_tabela';
22. Pivoteamento de Dados
Transformar linhas em colunas usando expressões condicionais:
SELECT tipo_produto,
SUM(CASE WHEN fornecedor = 'FornecedorA' THEN quantidade ELSE 0 END) AS qtd_fornecedor_a,
SUM(CASE WHEN fornecedor = 'FornecedorB' THEN quantidade ELSE 0 END) AS qtd_fornecedor_b
FROM estoque
GROUP BY tipo_produto;
23. Limpeza de Tabela
Resetar uma tabela removendo todos os dados rapidamente:
TRUNCATE TABLE tabela_limpar;
24. Paginação com Ordem Inversa
Selecionar um intervalo específico de registros, mantendo a ordem desejada:
SELECT * FROM (
SELECT * FROM tabela_dados
ORDER BY id_registro ASC
LIMIT 15
) AS subconsulta
ORDER BY id_registro DESC
LIMIT 5;