Comandos SQL Essenciais para Testes de Software

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;

Tags: SQL Testes de Software banco de dados Consultas SQL gerenciamento de dados

Publicado em 7-27 04:06