====== LU07b – SQL-DML: Einführung & Daten einfügen ======
===== Einführung =====
In LU05 haben wir die **DDL** (Data Definition Language) kennengelernt, mit der Tabellen angelegt werden.
Folgender SQL-Code erzeugt eine **leere** Tabelle //favourite_film// mit den Spalten //film_id//((Automatisch hochzählende ID, eindeutiger Primärschlüssel)), //title//((Filmtitel)), //director//((Regisseur:in)), //released_year//((Veröffentlichungsjahr, vierstellig)), //star1//((Hauptdarsteller:in)):
CREATE TABLE favourite_film
(
film_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
director VARCHAR(50),
released_year YEAR,
star1 VARCHAR(50)
);
> **Wichtig:** //film_id// ist der **Primärschlüssel** → jeder Datensatz erhält automatisch eine eindeutige ID.
> **DML** = **Data Manipulation Language**: %%INSERT%%, %%UPDATE%%, %%DELETE%%. (//Read// erfolgt mit %%SELECT%% und gehört streng genommen zur **DQL**, wird im Alltag bei CRUD((Create, Read, Update, Delete Operationen)) aber mitgemeint.)
Bisher haben wir neue Datensätze über die **Webstorm-Oberfläche** eingefügt (//Edit Data > "+"//):
{{:modul:m290_guko:learningunits:lu07:theorie:insert_edit_data_coppola.png?nolink&500}}
Das funktioniert, ist aber mühsam und fehleranfällig, wenn viele Daten eingetragen oder geändert werden müssen.
Darum machen wir das ab jetzt **programmatisch mit SQL**.
Die CRUD-Operationen aus der vorherigen Lektion setzen wir dabei direkt mit den Befehlen der **DML** (Data Manipulation Language) um:
%%INSERT%% entspricht **Create**, %%SELECT%% entspricht **Read**, %%UPDATE%% entspricht **Update** und %%DELETE%% entspricht **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.
**Syntax (Einzelzeile)**
INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1, wert2, wert3);
**Syntax (mehrere Zeilen auf einmal)**
INSERT INTO tabellenname (spalte1, spalte2, spalte3)
VALUES (wert1a, wert2a, wert3a),
(wert1b, wert2b, wert3b);
**Syntax (INSERT ... SELECT)**
INSERT INTO zieltabelle (spalte1, spalte2, spalte3)
SELECT quelle_spalte1, quelle_spalte2, quelle_spalte3
FROM quelle
WHERE bedingung;
---
**Variante A: Spalten explizit angeben**
INSERT INTO favourite_film (title, director, released_year, star1)
VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
^ film_id ^ title ^ director ^ released_year ^ star1 ^
| 1 | Lost in Translation | Sofia Coppola | 2003 | Scarlett Johansson |
**Variante B: Mehrere Zeilen auf einmal**
INSERT INTO favourite_film (title, director, released_year, star1)
VALUES
('Inception', 'Christopher Nolan', 2010, 'Leonardo DiCaprio'),
('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');
^ 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 |
**Variante C: INSERT ... SELECT (Daten aus einer anderen Tabelle übernehmen)**
Mit %%INSERT ... SELECT%% können Datensätze direkt aus einer anderen Tabelle kopiert werden.
Das ist z. B. praktisch, wenn Daten aus //imdb_top_1000// übernommen werden sollen.
INSERT INTO favourite_film (title, director, released_year, star1)
SELECT Series_Title, Director, Released_Year, Star1
FROM imdb_top_1000
WHERE Released_Year >= 2000;
> **Hinweis:** Mit %%WHERE%% können gezielt nur bestimmte Datensätze übernommen werden (z. B. ab Jahr 2000).