Ramos da InformáticaBanco de DadosGuia Definitivo do INSERT INTO SELECT

Guia Definitivo do INSERT INTO SELECT

Aprenda a usar o comando SQL INSERT INTO SELECT para inserir dados de forma eficiente. Descubra exemplos práticos e avançados, dicas, casos de uso e estratégias de otimização neste guia completo.

-

No universo dos bancos de dados relacionais, o comando INSERT INTO desempenha um papel crucial ao permitir a inserção de dados em tabelas. Uma das abordagens mais poderosas e versáteis para usar este comando é combiná-lo com SELECT, permitindo inserir dados de uma tabela (ou consulta) diretamente em outra. Este artigo detalha como aproveitar essa funcionalidade, explora casos de uso práticos e avança para cenários mais complexos.

O Básico do INSERT INTO SELECT

A sintaxe fundamental do comando INSERT INTO SELECT é a seguinte:

INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM another_table
WHERE condition;

Descrição dos elementos:

Dica de Leitura: Se você está explorando maneiras de otimizar e automatizar tarefas relacionadas a bancos de dados, como o uso do comando INSERT INTO SELECT, pode ser útil aprender sobre ferramentas e tecnologias que facilitam esses processos. Uma abordagem interessante é o uso de inteligência artificial (IA) para melhorar a eficiência no desenvolvimento de software, como mostrado no artigo Guia para usar o OpenAI Codex com mais eficiência, que pode ajudar a simplificar tarefas complexas.

VAI GOSTAR:

  • table_name: A tabela onde os dados serão inseridos.
  • column1, column2, ...: As colunas de destino, que devem corresponder em número e tipo aos dados selecionados.
  • another_table: A origem dos dados a serem inseridos.
  • WHERE condition: Opcional, define critérios para filtrar os dados a serem selecionados.

Exemplo Prático: Populando uma Tabela com Dados de Outra

Imagine que você tenha duas tabelas: employees e archived_employees. Sua tarefa é mover todos os funcionários inativos para a tabela de arquivamento.

Estrutura das tabelas:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    status VARCHAR(20)
);

CREATE TABLE archived_employees (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

Inserindo dados da tabela employees na tabela archived_employees:

INSERT INTO archived_employees (id, name)
SELECT id, name
FROM employees
WHERE status = 'inactive';

Este comando copia todos os funcionários inativos para a tabela de arquivamento.

Casos de Uso Comuns

  1. Migração de Dados Entre Tabelas
    • Usado em ETLs para transformar e mover dados entre sistemas.
  2. Backup ou Arquivamento
    • Copiar dados antigos para uma tabela de histórico.
  3. Integração de Dados
    • Combinar informações de diferentes fontes em uma tabela central.
  4. Conversão de Estruturas
    • Reorganizar dados de uma tabela para uma nova estrutura.

Exemplos Avançados

1. Inserção com Transformação de Dados

É possível transformar os dados antes de inseri-los na tabela de destino.

Exemplo: Criar uma tabela com nomes em maiúsculas.

CREATE TABLE uppercase_employees (
    id INT PRIMARY KEY,
    name_upper VARCHAR(100)
);

INSERT INTO uppercase_employees (id, name_upper)
SELECT id, UPPER(name)
FROM employees;

O uso da função UPPER() converte os nomes para letras maiúsculas antes da inserção.

2. Inserção Condicional com Subconsultas

Você pode usar subconsultas para condicionar a inserção de dados.

Exemplo: Inserir apenas funcionários cujos gerentes estão ativos.

INSERT INTO active_manager_employees (id, name)
SELECT e.id, e.name
FROM employees e
WHERE e.manager_id IN (
    SELECT id FROM employees WHERE status = 'active'
);

3. Inserção com JOIN

Combinar dados de múltiplas tabelas antes da inserção é uma técnica poderosa.

Exemplo: Criar uma tabela de relatórios contendo informações de funcionários e departamentos.

CREATE TABLE employee_reports (
    employee_id INT,
    employee_name VARCHAR(100),
    department_name VARCHAR(100)
);

INSERT INTO employee_reports (employee_id, employee_name, department_name)
SELECT e.id, e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;

Este comando combina dados de employees e departments para popular a tabela employee_reports.

4. Inserção com Funções de Janela

As funções de janela permitem cálculos avançados no SELECT.

Exemplo: Inserir o ranking de salários em uma tabela.

CREATE TABLE employee_salaries (
    employee_id INT,
    salary DECIMAL(10, 2),
    salary_rank INT
);

INSERT INTO employee_salaries (employee_id, salary, salary_rank)
SELECT id, salary,
       RANK() OVER (ORDER BY salary DESC)
FROM employees;

A função RANK() calcula a posição do salário de cada funcionário em relação aos demais.

Dicas e Boas Práticas

  1. Validação de Tipos de Dados
    • Certifique-se de que os tipos de dados das colunas de origem e destino sejam compatíveis.
  2. Cuidados com Restrições
    • Verifique se as tabelas têm restrições, como PRIMARY KEY ou FOREIGN KEY, que possam impedir a inserção.
  3. Uso de Transações
    • Para grandes volumes de dados, utilize transações para garantir consistência:
BEGIN TRANSACTION;

INSERT INTO table_name
SELECT ...;

COMMIT;

Testes com Cópias

  • Antes de executar o comando em produção, teste-o em tabelas de cópia para evitar perdas de dados.

Desafios e Considerações Avançadas

1. Inserções em Grandes Volumes

Ao inserir milhões de registros, pode ocorrer degradação no desempenho. Algumas estratégias incluem:

  • Dividir a inserção em lotes (BATCH INSERT).
  • Desativar índices temporariamente.
  • Usar instruções como INSERT IGNORE ou ON CONFLICT em bancos de dados como MySQL e PostgreSQL, respectivamente, para evitar duplicatas.

2. Gerenciamento de Duplicatas

Evitar duplicatas ao inserir registros é essencial. No PostgreSQL:

INSERT INTO target_table (col1, col2)
SELECT col1, col2
FROM source_table
ON CONFLICT (unique_column) DO NOTHING;

3. Inserção em Várias Tabelas

Para inserir dados em múltiplas tabelas simultaneamente, use TRIGGERS ou STORED PROCEDURES.

Outro exemplo:

— Exemplo Otimizado (PostgreSQL): Copiando dados e ignorando quem já existe
INSERT INTO clientes_ativos (id, nome, email, data_migracao)
SELECT
id,
nome,
email,
CURRENT_DATE
FROM clientes_antigos
WHERE status = ‘ATIVO’
ON CONFLICT (email) DO NOTHING; — O segredo para não quebrar a query!

Tabela Comparativa de Sintaxe (PostgreSQL vs MySQL vs SQL Server)

 

Comparativo: Tratamento de Duplicatas no INSERT INTO SELECT

Sintaxe otimizada para PostgreSQL, MySQL e SQL Server.

Cenário / Operação PostgreSQL MySQL SQL Server (T-SQL)
Inserção Simples
(Sem validação extra)
INSERT INTO destino (col1, col2) SELECT col1, col2 FROM origem;
Ignorar Duplicatas
(Pular quem já existe)

ON CONFLICT (id)
DO NOTHING;
INSERT IGNORE INTO destino… … SELECT …
WHERE NOT EXISTS
(SELECT 1 FROM destino)
Atualizar Existente
(O Famoso “Upsert”)

ON CONFLICT (id)
DO UPDATE SET
col1 = EXCLUDED.col1;

ON DUPLICATE KEY UPDATE
col1 = VALUES(col1);
Utilizar comando MERGE INTO destino USING origem ON…
Dica de Performance: No SQL Server, para migrações massivas complexas, o uso do comando MERGE é recomendado em substituição ao INSERT INTO SELECT tradicional para garantir a integridade sem travar a tabela.

Conclusão

O comando INSERT INTO SELECT é uma ferramenta poderosa que vai além do básico, permitindo movimentar, transformar e gerenciar dados em escala. Este artigo abordou desde os fundamentos até casos avançados, como uso de funções de janela e JOINs. Dominar este comando é essencial para qualquer profissional que lida com bancos de dados, pois ele oferece flexibilidade e eficiência na manipulação de dados.

Próximos passos:

  • Pratique os exemplos no seu banco de dados.
  • Explore outros operadores e funções SQL para aprimorar suas consultas.
  • Combine INSERT INTO SELECT com scripts e automações para casos de uso avançados.

Com isso, você estará preparado para enfrentar desafios em cenários reais!

VAI GOSTAR: O que é normalização de banco de dados? – Descubra tudo sobre a normalização de banco de dados, incluindo as explicações detalhadas da 5NF e 2NF com exemplos práticos. Aprenda como melhorar a organização e a eficiência dos seus dados e otimize seus sistemas de forma profissional.

LEITURAS COMPLEMENTARES

Aqui está uma lista de fontes confiáveis e abrangentes para aprofundar o aprendizado sobre SQL, bancos de dados e a aplicação avançada de comandos como INSERT INTO SELECT:

1. Documentação Oficial de Bancos de Dados

As documentações oficiais são sempre o melhor ponto de partida, pois apresentam detalhes completos sobre a sintaxe, funções e práticas recomendadas.

2. Livros Recomendados

Para quem gosta de se aprofundar com leitura, livros oferecem uma visão mais técnica e estruturada.

3. Ambientes Práticos

A prática é essencial para dominar SQL. Aqui estão algumas ferramentas para experimentar e executar consultas.

4. Certificações

Obter certificações pode validar seu conhecimento e abrir portas no mercado de trabalho.

  • Microsoft Certified: Azure Data Engineer Associate
  • Oracle Database SQL Certified Associate
  • Google Cloud Professional Data Engineer
  • AWS Certified Database – Specialty

VAI GOSTAR:

Já vi aplicações inteiras saírem do ar porque um desenvolvedor rodou um INSERT INTO SELECT sem filtros numa tabela de log com 50 milhões de registros em pleno horário de pico. Em 2026, a regra é clara: se vai mover mais de 100 mil linhas, não faça isso numa única transação. Quebre em lotes (batches), crie índices temporários na tabela de destino e use o comando ON CONFLICT para garantir a idempotência da sua query. O seu DBA (e as noites de sono) agradecem.


✦ Recomendação do Editor

Eleve o seu nível no assunto

Se você está procurando aprender mais sobre técnicas avançadas de banco de dados após ler nosso artigo sobre o INSERT INTO SELECT, eu recomendo procurar por ‘tutoriais de banco de dados SQL’.

Compreensão profunda da linguagem SQL e suas funcionalidades como o INSERT INTO SELECT pode impulsionar a sua carreira na área de tecnologia e desenvolvimento de software. Isso lhe permite criar soluções eficientes e escaláveis, otimizar processos críticos e melhorar a produtividade da equipe. Além disso, dominar essas habilidades aumenta suas chances de se tornar um profissional altamente requisitado e valorizado no mercado de trabalho.

 

Ver ofertas em destaque na Amazon


Ajude a manter este projeto, a Ramos da Informática pode ganhar uma comissão sobre as vendas qualificadas.

FAQ Avançado: Evitando Locks, Quedas e Gargalos de Performance

1. Por que o INSERT INTO SELECT trava (Table Lock) todo o meu banco em produção?

Bancos relacionais (ACID) garantem consistência bloqueando os dados sendo lidos/escritos. Ao tentar inserir milhões de linhas numa única transação, o motor de banco de dados (para economizar memória) faz o “Lock Escalation”: ele desiste de bloquear linha por linha e bloqueia a tabela inteira. Pior ainda: a tabela de origem também sofre um Shared Lock. Isso significa que a sua aplicação não conseguirá ler nem gravar nada nessas tabelas até a query terminar, causando timeouts na sua API.

2. Hack de Produção: Como copiar milhões de linhas sem derrubar a aplicação?

A regra de ouro em 2026 é: Use Batching (Processamento em Lotes). Nunca rode a query de uma vez. Crie um script (pode ser no seu backend Node.js/NestJS ou uma Stored Procedure) que quebre a cópia em blocos. Exemplo: WHERE id BETWEEN 1 AND 10000. Insira 10 mil linhas, faça o commit, insira uma pausa de 1 ou 2 segundos (ex: pg_sleep(1) no Postgres) para liberar a fila de acessos da aplicação principal, e continue. É um pouco mais demorado, mas 100% seguro contra downtime.

3. Deletar os índices antes do INSERT INTO SELECT realmente deixa mais rápido?

Sim! Esse é o maior hack de DBAs. Se você vai inserir um volume colossal de dados, cada nova linha obriga o banco a recalcular e reescrever a árvore de índices (B-Tree), o que consome um I/O gigantesco de disco. O segredo é: faça um DROP INDEX nos índices não essenciais da tabela destino, rode a sua query INSERT INTO SELECT de forma bruta e veloz, e ao final, recrie os índices (CREATE INDEX). O tempo total da operação cai drasticamente.

4. O que é o estouro de Transaction Log (WAL) e como evitá-lo?

Toda linha inserida é salva no log de transações do disco para garantir a recuperação em caso de falha (Rollback). Inserir milhões de linhas de uma vez pode encher o seu HD inteiro e travar o servidor. Dica avançada: No SQL Server, você pode alterar temporariamente o banco para o modelo de recuperação Bulk-Logged. No PostgreSQL, se os dados forem apenas para uma tabela temporária (Staging), crie a tabela como UNLOGGED TABLE. Isso desliga a gravação no log e a query executa voando.

5. Posso usar a cláusula WITH (CTE) para limpar os dados antes de inserir?

Sim, e essa é a melhor prática para arquitetar um “Mini-ETL” direto no banco. Em vez de inserir dados sujos e depois rodar um UPDATE pesado (o que gera o dobro de trabalho para o disco e aumenta a chance de locks), você usa a CTE (WITH dados_limpos AS (...)) para formatar strings, recalcular valores e deduplicar os registros tudo em memória. O INSERT INTO final só escreve no disco o dado já perfeitamente lapidado.

Ramos Souza J
Ramos Souza Jhttps://ramosdainformatica.com.br/sobre/
Ramos de Souza Janones é Senior FullStack Engineer na ReDraw, com mais de 26 anos de trajetória no desenvolvimento de software. Especialista em arquiteturas escaláveis com React e TypeScript, sua jornada percorreu desde o Clipper até o ecossistema moderno de IA e microsserviços. Com passagens por grandes players como Wipro (Bradesco PIX), Ramos também atuou na Fiocruz em um projeto estratégico para o Ministério da Saúde, desenvolvendo o sistema de acompanhamento da saúde da mulher para a prevenção do câncer de colo, do monitoramento na infância à maturidade. Unindo visão técnica profunda, liderança e foco em performance, ele é o criador do portal Ramos da Informática, onde compartilha conhecimento sobre desenvolvimento Full Stack e as tendências de IA aplicadas à engenharia de software.

Mais recentes

Como aprender a programar, um guia definitivo

Última atualização em 23/04/2026. Guia completo sobre: Como aprender a programar. Espero que este “guia” ou “manifesto”, como prefiro chamar, seja...

Stream Deck para Desenvolvedores: o Console de Comando do Futuro

Esqueça os streamers. Descubra como o Stream Deck se tornou o hardware essencial para Engenheiros de IA e Full...

Como Usar o Skills in Chrome no Brasil: Tutorial Completo de IA

A inteligência artificial já faz parte do nosso fluxo de trabalho, mas ter que reescrever os mesmos prompts repetidamente...

Context Engineering: Como Arquitetar Dados para LLMs e RAG

Na edição desta newsletter intitulada “Engenharia de Prompt: Não é só mais uma buzzword“: https://www.linkedin.com/pulse/engenharia-de-prompt-n%C3%A3o-%C3%A9-s%C3%B3-mais-uma-buzzword-de-souza-janones-tpkxf tratei sobre o tema...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Aprender Idiomas com Google Tradutor: Na Prática

O Google está lançando um novo recurso experimental com tecnologia de IA no Google Tradutor, projetado para ajudar as...

Comunidades Internacionais de Desenvolvedores

Descubra as melhores comunidades internacionais de devs para 2026: GitHub, Stack Overflow, Discord e mais. Comparativo de salários Brasil vs. exterior e guia de carreira remota.

Mais Lidos

Meta Sobe a Jogada: Java é Substituído por Kotlin

A Meta, controladora do Facebook, migrou o código Java...

O que muda com o Gemini 2.0? Novidades para Desenvolvedores

O Google anunciou recentemente uma atualização revolucionária em sua...

Hiperautomação e RPA: Automação com IA

Transformação digital. A expressão que se tornou recorrente durante...

Desenvolvimento de Blockchain: Trunfos da Cardano

A Cardano emergiu como a rede blockchain com a atividade...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.