====== 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