# SQL INSERT INTO SELECT: Daten von einer Tabelle in eine andere kopieren

Die Anweisung SQL INSERT INTO SELECT wird genutzt, um Daten von einer Tabelle in eine andere zu übertragen. Dafür muss diese neue Tabelle allerdings bereits angelegt sein. Spalten ohne Inhalt erhalten auch in der neuen Tabelle den Wert NULL.

## Was ist SQL INSERT INTO SELECT?

Die [Structured Query Language](https://www.ionos.at/digitalguide/server/knowhow/was-ist-sql/) erlaubt es Ihnen, innerhalb einer Datenbank zahlreiche Tabellen anzulegen und diese mit Daten zu füttern. Dabei kann es vorkommen, dass Sie die Daten einer Tabelle ganz oder teilweise **in eine andere übertragen** möchten. Statt sämtliche Einträge erneut einzugeben, haben Sie die Möglichkeit, Daten zu kopieren und an der gewünschten Stelle einzusetzen. Die passende Anweisung für dieses Vorhaben ist SQL INSERT INTO SELECT. Diese kopiert Daten nach Ihren Wünschen und setzt sie in die neue Tabelle ein. Dabei werden bereits bestehende Einträge nicht überschrieben. Die Voraussetzung ist, dass die Datentypen der ursprünglichen und der neuen Tabelle übereinstimmen.

## Syntax und Funktionsweise

Die Syntax von SQL INSERT INTO SELECT unterscheidet sich, je nachdem, ob Sie **sämtliche Spalten** von einer zu einer anderen Tabelle kopieren möchten oder ob lediglich **einige ausgewählte Spalten** übernommen werden sollen. Für einen vollständigen Übertrag ist dies der Aufbau:

```sql
INSERT INTO neue_tabelle
SELECT * FROM alte_tabelle
WHERE bedingung;
```

Die Bedingung `WHERE` ist dabei optional.

Falls Sie lediglich ausgewählte Spalten übertragen möchten, ist dies die passende Syntax:

```sql
INSERT INTO neue_tabelle (spalte1, spalte2, spalte3, …)
SELECT spalte1, spalte2, spalte3, … FROM alte_tabelle
WHERE bedingung;
```

Hier spezifizieren Sie also die einzelnen Spalten und nutzen dann ebenfalls den [SQL-Befehl](https://www.ionos.at/digitalguide/server/konfiguration/sql-befehle/) `SELECT`, um diese auszuwählen. Wichtig ist in beiden Fällen, dass die Tabelle `neue_tabelle` **bereits in der Datenbank angelegt** ist. Außerdem müssen die Bezeichnungen für sämtliche Spalten der alten und der neuen Tabelle übereinstimmen. Spalten, für die keine Daten vorhanden sind, werden den Wert NULL enthalten.

## Gesamte Tabelle kopieren und einfügen

Um Ihnen zu zeigen, wie SQL INSERT INTO SELECT in der Praxis funktioniert, erstellen wir eine beispielhafte Tabelle namens „Kundenliste\_2023“. Diese enthält Angaben zur Kundennummer, dem Namen, dem Standort und der Anzahl der bestellten Artikel. Sie sieht so aus:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
      <th>Artikel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Berlin</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

Dazu gibt es eine neue Tabelle mit dem Namen „Kundenliste\_2024“. Diese ist bisher leer.

Wenn wir die Einträge der Tabelle „Kundenliste\_2023“ komplett in die neue Tabelle „Kundenliste\_2024“ einfügen möchten, gehen wir folgendermaßen vor:

```sql
INSERT INTO Kundenliste_2024
SELECT * FROM Kundenliste_2023;
```

Nun befinden sich alle Einträge aus der alten Kundenliste auch in der neuen Kundenliste:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
      <th>Artikel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Berlin</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

## Ausgewählte Spalten übertragen

Es kann aber auch vorkommen, dass Sie lediglich bestimmte Spalten übernehmen möchten. Beispielsweise könnte in unserem Fall die Anzahl der bestellten Artikel für die neue Tabelle nicht von Relevanz sein. Daher wählen wir jetzt nur bestimmte Spalten zum Übertrag aus:

```sql
INSERT INTO Kundenliste_2024 (Kundennummer, Name, Standort)
SELECT Kundennummer, Name, Standort FROM Kundenliste_2023;
```

Dadurch erhalten wir diese neue Tabelle:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
      <th>Artikel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
      <td></td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
      <td></td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
      <td></td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
      <td></td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Berlin</td>
      <td></td>
    </tr>
  </tbody>
</table>

Die Artikel-Spalte enthält somit lediglich Einträge mit dem Wert NULL.

## Bedingungen für den Übertrag einbauen

Zusätzlich können Sie eine `WHERE`-Bedingung nutzen, um lediglich ausgewählte Zeilen zu kopieren. Für unsere Tabelle möchten wir zum Beispiel nur Kundinnen und Kunden aus Hamburg übertragen. Der passende Code ist dieser:

```sql
INSERT INTO Kundenliste_2024
SELECT * FROM Kundenliste_2023
WHERE Standort = 'Hamburg';
```

Unsere neue Tabelle ist dadurch diese:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
      <th>Artikel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
      <td>15</td>
    </tr>
  </tbody>
</table>

## Alternative zu SQL INSERT INTO SELECT

Eine Alternative für SQL INSERT INTO SELECT ist `SELECT INTO`. Beide Anweisungen werden verwendet, um Daten von einer Tabelle in eine andere zu übertragen. Außerdem agieren sie als Teil eines größeren Befehls. Während SQL INSERT INTO SELECT allerdings eine bereits existierende Tabelle benötigt, in die sie die Daten übertragen kann, erstellt `SELECT INTO` eine neue Tabelle.

Tipp Sie haben die Wahl! Mit [SQL-Server-Hosting](https://www.ionos.at/cloud/sql-server-hosting "SQL-Server-Hosting von IONOS") von IONOS nutzen Sie MSSQL, MySQL oder MariaDB. Top-Performance, starke Sicherheitsfeatures und persönliche Beratung sind in jedem Fall garantiert.


This is a markdown version of: [https://www.ionos.at/digitalguide/server/konfiguration/sql-insert-into-select/](https://www.ionos.at/digitalguide/server/konfiguration/sql-insert-into-select/) for AI/LLM consumption.