# SQL INSERT INTO SELECT: Copiar dados entre tabelas

A instrução SQL INSERT INTO SELECT é usada para transferir dados de uma tabela para outra. No entanto, a nova tabela deve já estar criada. Colunas que não forem preenchidas receberão o valor NULL na nova tabela.

## O que é SQL INSERT INTO SELECT?

[SQL (*Structured Query Language*)](https://www.ionos.com/pt-br/digitalguide/servidor/conhecimento/o-que-e-sql/) permite criar várias tabelas dentro de um banco de dados e preenchê-las com dados. Pode haver casos em que você deseja transferir os dados de uma tabela total ou parcialmente **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 necessário e os insere na nova tabela. As entradas já existentes não são sobrescritas. É necessário que os tipos de dados da tabela original e da nova tabela sejam compatíveis.

## Sintaxe e funcionamento de SQL INSERT INTO SELECT

A sintaxe do SQL INSERT INTO SELECT varia dependendo se você deseja **copiar todas as colunas** de uma tabela para outra ou se deseja **transferir apenas algumas colunas selecionadas**. Para uma transferência completa, a estrutura é a seguinte:

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

A condição `WHERE` é opcional.

Se você deseja transferir apenas colunas selecionadas, a sintaxe apropriada é:

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

Aqui, você especifica as colunas individuais e usa o comando SQL `SELECT` para selecioná-las. Em ambos os casos, é importante 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 corresponder. Colunas para as quais não há dados serão preenchidas 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 informações sobre o número do cliente, nome, localidade e quantidade de itens encomendados. Ela se parece com isto:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localidade</th>
      <th>Itens</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Souza</td>
      <td>São Paulo</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Sales</td>
      <td>Vitória</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Vitória</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Barbosa</td>
      <td>Praia Grande</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Costa</td>
      <td>São Paulo</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

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:

```sql
INSERT INTO Lista_de_Clientes_2024
SELECT * FROM Lista_de_Clientes_2023;
```

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

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localidade</th>
      <th>Itens</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Souza</td>
      <td>São Paulo</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Sales</td>
      <td>Vitória</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Vitória</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Barbosa</td>
      <td>Praia Grande</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Costa</td>
      <td>São Paulo</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

## Transferir colunas selecionadas com SQL INSERT INTO SELECT

No entanto, pode ser que você queira transferir apenas algumas colunas específicas. Por exemplo, no nosso caso, a quantidade de itens pedidos pode não ser relevante para a nova tabela. Portanto, selecionamos agora apenas algumas colunas para transferência:

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

Isso resulta na seguinte nova tabela:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localidade</th>
      <th>Itens</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Souza</td>
      <td>São Paulo</td>
      <td></td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Sales</td>
      <td>Vitória</td>
      <td></td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Vitória</td>
      <td></td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Barbosa</td>
      <td>Praia Grande</td>
      <td></td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Costa</td>
      <td>São Paulo</td>
      <td></td>
    </tr>
  </tbody>
</table>

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

## Adicionar condições para transferência com SQL INSERT INTO SELECT

Além disso, você pode usar uma condição `WHERE` para copiar apenas linhas selecionadas. Para a nossa tabela, por exemplo, gostaríamos de transferir apenas clientes de Vitória. O código apropriado é o seguinte:

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

Nossa nova tabela fica assim:

<table>
  <thead>
    <tr>
      <th>Número do Cliente</th>
      <th>Nome</th>
      <th>Localidade</th>
      <th>Itens</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1377</td>
      <td>Sales</td>
      <td>Vitória</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Vitória</td>
      <td>15</td>
    </tr>
  </tbody>
</table>

## Alternativa a SQL INSERT INTO SELECT

Uma alternativa ao SQL INSERT INTO SELECT é o `SELECT INTO`. Ambas as instruções são usadas para transferir 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 transferir os dados, o `SELECT INTO` cria uma nova tabela.

Dica Você tem poder de escolha! Com o [SQL Server Hosting](https://www.ionos.com/cloud/sql-server-hosting "SQL Server Hosting — IONOS") da IONOS, você pode usar MSSQL, MySQL ou MariaDB. Alta performance, fortes recursos de segurança e atendimento personalizado são garantidos.


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-insert-into-select/](https://www.ionos.com/pt-br/digitalguide/servidor/configuracao/sql-insert-into-select/) for AI/LLM consumption.