====== LU06b - SQL-DML: Daten einfügen (INSERT) ======
===== Lernziele =====
* Ich kann mit INSERT einen einzelnen Datensatz einfügen.
* Ich kann mit INSERT mehrere Datensätze in einem Statement einfügen.
* Ich kann mit INSERT ... SELECT Daten aus einer anderen Tabelle übernehmen.
* Ich weiss, wie ich einen Apostroph in einem Textwert korrekt schreibe.
===== Einführung =====
In LU05 haben wir die **DDL** (Data Definition Language) kennengelernt, mit der Tabellen angelegt werden. Jetzt geht es an die **DML** (Data Manipulation Language): Wir füllen eine Tabelle mit Daten.
Dafür bauen wir uns eine eigene Tabelle:
CREATE TABLE favourite_film (
film_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
director VARCHAR(50),
released_year YEAR,
star1 VARCHAR(50)
);
^ Spalte ^ Bedeutung ^
| film_id | Automatisch hochzählende ID, eindeutiger Primärschlüssel |
| title | Filmtitel |
| director | Regisseur:in |
| released_year | Veröffentlichungsjahr |
| star1 | Hauptdarsteller:in |
Bisher haben wir neue Datensätze über die WebStorm-Oberfläche eingefügt:
{{:de:modul:m290_guko:learningunits:lu07:theorie:insert_edit_data_coppola.png?direct&700|Datensatz über die WebStorm-Oberfläche einfügen}}
Das funktioniert, ist aber mühsam und fehleranfällig, wenn viele Daten eingetragen oder geändert werden müssen. Darum arbeiten wir ab jetzt **programmatisch mit SQL** – über die DML-Befehle INSERT, UPDATE und DELETE.
===== INSERT Statement =====
Der Befehl INSERT fügt neue Datensätze in eine Tabelle ein. Dabei muss angegeben werden, **in welche Spalten** die Werte eingefügt werden.
==== Variante A: Ein Datensatz ====
INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1, wert2, wert3);
Konkret:
INSERT INTO favourite_film (title, director, released_year, star1)
VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
Resultat:
^ film_id ^ title ^ director ^ released_year ^ star1 ^
| 1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
{{url>https://player.mux.com/tlUUONfDZmV6XUeCdAf02IwPKOnYTo41fEgMbxM00maZc?metadata-video-title=INSERT+INTO+single+Value&video-title=INSERT+INTO+single+Value 1200,675 noscroll noborder center|Screencast: INSERT – ein Datensatz}}
//INSERT mit einer einzelnen Zeile.//
==== Variante B: Mehrere Datensätze auf einmal ====
INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1a, wert2a, wert3a),
(wert1b, wert2b, wert3b);
Konkret:
INSERT INTO favourite_film (title, director, released_year, star1)
VALUES
('Inception', 'Christopher Nolan', 2010, 'Leonardo DiCaprio'),
('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');
Resultat:
^ film_id ^ title ^ director ^ released_year ^ star1 ^
| 1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
| 2 | Inception | Christopher Nolan | 2010 | Leonardo DiCaprio |
| 3 | Arrival | Denis Villeneuve | 2016 | Amy Adams |
**Vorsicht bei Apostrophen im Text.** Mancher Filmtitel enthält ein Hochkomma, z.B. //Five Nights at Freddy's//. Da SQL einfache Anführungszeichen zur Begrenzung von Textwerten nutzt, muss das Hochkomma im Titel **verdoppelt** werden:
'Five Nights at Freddy''s'
==== Variante C: INSERT ... SELECT ====
Mit INSERT ... SELECT können Datensätze direkt aus einer anderen Tabelle kopiert werden – praktisch, um Daten aus //imdb_top_1000// zu übernehmen.
INSERT INTO zieltabelle (spalte1, spalte2, spalte3)
SELECT quelle_spalte1, quelle_spalte2, quelle_spalte3
FROM quelle
WHERE bedingung;
Konkret:
INSERT INTO favourite_film (title, director, released_year, star1)
SELECT Series_Title, Director, Released_Year, Star1
FROM imdb_top_1000
WHERE Released_Year >= 2000;
Mit WHERE können Sie gezielt nur bestimmte Datensätze übernehmen (hier: ab Jahr 2000). Ohne WHERE würden **alle** Zeilen von //imdb_top_1000// übernommen.
{{url>https://player.mux.com/LZECUKtvxFY3whCyLCGQDcTAhSNElU2cvXoRkaPcQ7I?metadata-video-title=INSERT+INTO+SELECT&video-title=INSERT+INTO+SELECT 1200,675 noscroll noborder center|Screencast: INSERT ... SELECT}}
//Daten aus imdb_top_1000 übernehmen.//
----
{{tag>M290-LU06}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Guido Koch