A instrução SQL INSERT INTO SELECT é usada para trans­fe­rir dados de uma tabela para outra. No entanto, a nova tabela deve já estar criada. Colunas que não forem pre­en­chi­das receberão o valor NULL na nova tabela.

O que é SQL INSERT INTO SELECT?

SQL (Struc­tu­red Query Language) permite criar várias tabelas dentro de um banco de dados e preenchê-las com dados. Pode haver casos em que você deseja trans­fe­rir os dados de uma tabela total ou par­ci­al­mente para outra tabela. Em vez de inserir todas as entradas novamente, você pode copiar os dados e inseri-los no local desejado. A instrução adequada para essa tarefa é o SQL INSERT INTO SELECT. Ela copia os dados conforme o ne­ces­sá­rio e os insere na nova tabela. As entradas já exis­ten­tes não são so­bres­cri­tas. É ne­ces­sá­rio que os tipos de dados da tabela original e da nova tabela sejam com­pa­tí­veis.

VPS Hosting (Virtual Private Servers)
World-class VPS at America’s lowest price

Hos­pe­da­gem VPS poderosa e de baixo custo para rodar suas apli­ca­ções sob medida, com as­sis­tente pessoal e suporte 24 horas.

  • Save 50% or more vs leading hosts
  • Unlimited traffic & no setup fees 
  • 99.99% uptime gua­ran­teed
  • Free 24/7 premium support 

Sintaxe e fun­ci­o­na­mento de SQL INSERT INTO SELECT

A sintaxe do SQL INSERT INTO SELECT varia de­pen­dendo se você deseja copiar todas as colunas de uma tabela para outra ou se deseja trans­fe­rir apenas algumas colunas se­le­ci­o­na­das. Para uma trans­fe­rên­cia completa, a estrutura é a seguinte:

INSERT INTO nova_tabela
SELECT * FROM tabela_antiga
WHERE condição;
sql

A condição WHERE é opcional.

Se você deseja trans­fe­rir apenas colunas se­le­ci­o­na­das, a sintaxe apro­pri­ada é:

INSERT INTO nova_tabela (coluna1, coluna2, coluna3, …)
SELECT coluna1, coluna2, coluna3, … FROM tabela_antiga
WHERE condição;
sql

Aqui, você es­pe­ci­fica as colunas in­di­vi­du­ais e usa o comando SQL SELECT para selecioná-las. Em ambos os casos, é im­por­tante que a tabela nova_tabela já esteja criada no banco de dados. Além disso, os nomes de todas as colunas da tabela antiga e da nova tabela devem cor­res­pon­der. Colunas para as quais não há dados serão pre­en­chi­das com o valor NULL.

Copiar e colar tabela inteira com SQL INSERT INTO SELECT

Para ilustrar como SQL INSERT INTO SELECT funciona na prática, criaremos uma tabela de exemplo chamada “Lista_de_Clientes_2023”. Esta tabela contém in­for­ma­ções sobre o número do cliente, nome, lo­ca­li­dade e quan­ti­dade de itens en­co­men­da­dos. Ela se parece com isto:

Número do Cliente Nome Lo­ca­li­dade Itens
1427 Souza São Paulo 13
1377 Sales Vitória 9
1212 Peters Vitória 15
1431 Barbosa Praia Grande 22
1118 Costa São Paulo 10

Para isso, temos uma nova tabela chamada “Lista_de_Clientes_2024”. Esta tabela está vazia por enquanto.

Se quisermos inserir todos os registros da tabela “Lista_de_Clientes_2023” na nova tabela “Lista_de_Clientes_2024”, faremos o seguinte:

INSERT INTO Lista_de_Clientes_2024
SELECT * FROM Lista_de_Clientes_2023;
sql

Agora, todos os registros da antiga lista de clientes também estarão na nova lista de clientes:

Número do Cliente Nome Lo­ca­li­dade Itens
1427 Souza São Paulo 13
1377 Sales Vitória 9
1212 Peters Vitória 15
1431 Barbosa Praia Grande 22
1118 Costa São Paulo 10

Trans­fe­rir colunas se­le­ci­o­na­das com SQL INSERT INTO SELECT

No entanto, pode ser que você queira trans­fe­rir apenas algumas colunas es­pe­cí­fi­cas. Por exemplo, no nosso caso, a quan­ti­dade de itens pedidos pode não ser relevante para a nova tabela. Portanto, se­le­ci­o­na­mos agora apenas algumas colunas para trans­fe­rên­cia:

INSERT INTO Lista_de_Clientes_2024 (Número_do_Cliente, Nome, Localidade)
SELECT Número_do_Cliente, Nome, Localidade FROM Lista_de_Clientes_2023;
sql

Isso resulta na seguinte nova tabela:

Número do Cliente Nome Lo­ca­li­dade Itens
1427 Souza São Paulo
1377 Sales Vitória
1212 Peters Vitória
1431 Barbosa Praia Grande
1118 Costa São Paulo

A coluna de Itens contém apenas entradas com o valor NULL.

Adicionar condições para trans­fe­rên­cia com SQL INSERT INTO SELECT

Além disso, você pode usar uma condição WHERE para copiar apenas linhas se­le­ci­o­na­das. Para a nossa tabela, por exemplo, gos­ta­ría­mos de trans­fe­rir apenas clientes de Vitória. O código apro­pri­ado é o seguinte:

INSERT INTO Lista_de_Clientes_2024
SELECT * FROM Lista_de_Clientes_2023
WHERE Localidade = 'Vitória';
sql

Nossa nova tabela fica assim:

Número do Cliente Nome Lo­ca­li­dade Itens
1377 Sales Vitória 9
1212 Peters Vitória 15

Al­ter­na­tiva a SQL INSERT INTO SELECT

Uma al­ter­na­tiva ao SQL INSERT INTO SELECT é o SELECT INTO. Ambas as ins­tru­ções são usadas para trans­fe­rir dados de uma tabela para outra e também fazem parte de um comando maior. Enquanto o SQL INSERT INTO SELECT requer uma tabela já existente para trans­fe­rir os dados, o SELECT INTO cria uma nova tabela.

Dica

Você tem poder de escolha! Com o SQL Server Hosting da IONOS, você pode usar MSSQL, MySQL ou MariaDB. Alta per­for­mance, fortes recursos de segurança e aten­di­mento per­so­na­li­zado são ga­ran­ti­dos.

Ir para o menu principal