Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m290_guko:learningunits:lu07:theorie:b_sql_dml [2025/09/28 18:38] gkochmodul:m290_guko:learningunits:lu07:theorie:b_sql_dml [2025/09/28 20:07] (aktuell) gkoch
Zeile 1: Zeile 1:
-====== LU07b – SQL-DML: Daten einfügen, ändern, löschen ====== +====== 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. In LU05 haben wir die **DDL** (Data Definition Language) kennengelernt, mit der Tabellen angelegt werden.
  
Zeile 17: Zeile 17:
  
 > **Wichtig:** //film_id// ist der **Primärschlüssel** → jeder Datensatz erhält automatisch eine eindeutige ID.   > **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)) aber mitgemeint.)+> **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 > "+"//):   Bisher haben wir neue Datensätze über die **Webstorm-Oberfläche** eingefügt (//Edit Data > "+"//):  
Zeile 23: Zeile 23:
 {{:modul:m290_guko:learningunits:lu07:theorie:insert_edit_data_coppola.png?nolink&500}}  {{: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 werden müssen.  +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**.   Darum machen wir das ab jetzt **programmatisch mit SQL**.  
  
Zeile 29: Zeile 29:
 %%INSERT%% entspricht **Create**, %%SELECT%% entspricht **Read**, %%UPDATE%% entspricht **Update** und %%DELETE%% entspricht **Delete**.   %%INSERT%% entspricht **Create**, %%SELECT%% entspricht **Read**, %%UPDATE%% entspricht **Update** und %%DELETE%% entspricht **Delete**.  
  
-Mit DML können wir Daten also gezielt **einfügen**, **ändern** oder **löschen** – schnell, präzise und reproduzierbar. 
  
-===== Lernziele ===== +===== INSERT Statement ===== 
-  * Ich kann Daten **einfügen** (//INSERT//), **ändern** (//UPDATE//) und **löschen** (//DELETE//) – und mit %%WHERE%% korrekt einschränken. +Der Befehl %%INSERT%% fügt neue Datensätze in eine Tabelle einDabei muss angegeben werden, **in welche Spalten** die Werte eingefügt werden.
-  Ich erkenne typische **Fehlerquellen** (fehlendes %%WHERE%%, falsche Datentypen, Schlüsselverletzungen).+
  
-===== INSERT – Daten einfügen =====+**Syntax (Einzelzeile)** 
 +<WRAP center box 80% round><code sql> 
 +INSERT INTO tabellenname (spalte1, spalte2, spalte3) 
 +VALUES (wert1, wert2, wert3); 
 +</code></WRAP> 
 + 
 +**Syntax (mehrere Zeilen auf einmal)** 
 +<WRAP center box 80% round><code sql> 
 +INSERT INTO tabellenname (spalte1, spalte2, spalte3) 
 +VALUES (wert1a, wert2a, wert3a), 
 +       (wert1b, wert2b, wert3b); 
 +</code></WRAP> 
 + 
 +**Syntax (INSERT ... SELECT)** 
 +<WRAP center box 80% round><code sql> 
 +INSERT INTO zieltabelle (spalte1, spalte2, spalte3) 
 +SELECT quelle_spalte1, quelle_spalte2, quelle_spalte3 
 +FROM quelle 
 +WHERE bedingung; 
 +</code></WRAP> 
 + 
 +---
  
 **Variante A: Spalten explizit angeben** **Variante A: Spalten explizit angeben**
Zeile 42: Zeile 61:
 VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson'); VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
 </code></WRAP> </code></WRAP>
 +
 +<WRAP center box 80% round>
 +^ film_id ^ title               ^ director        ^ released_year ^ star1              ^
 +| 1       | Lost in Translation | Sofia Coppola   | 2003          | Scarlett Johansson |
 +</WRAP>
  
 **Variante B: Mehrere Zeilen auf einmal** **Variante B: Mehrere Zeilen auf einmal**
Zeile 50: Zeile 74:
   ('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');   ('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');
 </code></WRAP> </code></WRAP>
 +
 +<WRAP center box 80% round>
 +^ 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         |
 +</WRAP>
  
 **Variante C: INSERT ... SELECT (Daten aus einer anderen Tabelle übernehmen)**   **Variante C: INSERT ... SELECT (Daten aus einer anderen Tabelle übernehmen)**  
-Mit %%INSERT ... SELECT%% können Datensätze direkt **aus einer bestehenden Tabelle** in eine andere kopiert werden.   +Mit %%INSERT ... SELECT%% können Datensätze direkt aus einer anderen Tabelle kopiert werden.   
-Das ist besonders nützlich, wenn wir Daten aus einer grossen Tabelle (z. B. //imdb_top_1000//) in unsere eigene Tabelle übernehmen möchten +Das ist z. B. praktisch, wenn Daten aus //imdb_top_1000// übernommen werden sollen.
  
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
Zeile 62: Zeile 93:
 </code></WRAP> </code></WRAP>
  
-> **Hinweis:** Mit der %%WHERE%%-Bedingung können gezielt nur bestimmte Datensätze übernommen werden (z. B. nur Filme ab dem Jahr 2000)+> **Hinweis:** Mit %%WHERE%% können gezielt nur bestimmte Datensätze übernommen werden (z. B. ab Jahr 2000).
- +
-> **Tipps:**   +
-> Zahlen/Jahr ohne Anführungszeichen, Texte in Anführungszeichen: //'Inception'//  +
- +
-===== UPDATE – Daten ändern ===== +
-Sind bereits Daten in der Tabelle vorhanden, können wir sie mit dem //UPDATE//-Befehl aktualisieren. +
- +
-**Wichtig: Immer mit %%WHERE%% einschränken!** Das Statement würde auch ohne %%WHERE%%-Clause funktionieren, aber dann würden **alle** Datensätze in der ganzen Tabelle überschrieben. +
- +
-<WRAP center box 80% round><code sql> +
--- Regie-Credit korrigieren (gezielt über Primärschlüssel) +
-UPDATE favourite_film +
-SET director = 'C. Nolan' +
-WHERE film_id = 2; +
-</code></WRAP> +
- +
-**Mehrere Spalten in einem Datensatz auf einmal ändern** +
-<WRAP center box 80% round><code sql> +
-UPDATE favourite_film +
-SET title = 'Arrival (Extended Cut)', star1 = 'Amy Adams' +
-WHERE film_id = 3; +
-</code></WRAP> +
- +
-**Semantische Updates (vorsichtig!)** +
-<WRAP center box 80% round><code sql> +
--- Alle Filme mit leerem Hauptdarsteller:in mit einem Standardwert füllen (Beispiel) +
-UPDATE favourite_film +
-SET star1 = 'TBD' +
-WHERE star1 IS NULL; +
-</code></WRAP> +
- +
-> **Warnung:** Ohne %%WHERE%% werden **alle Zeilen** geändert. Prüfen Sie Updates immer zuerst mit einem entsprechenden %%SELECT%% (Dry-Run). +
- +
-===== DELETE – Daten löschen ===== +
-Mit dem //DELETE//-Befehl können Datensätze (= Zeilen) aus der Tabelle gelöscht werden. +
- +
-**Gezielt löschen (über Primärschlüssel)** +
-<WRAP center box 80% round><code sql> +
-DELETE FROM favourite_film +
-WHERE film_id = 1; +
-</code></WRAP> +
- +
-**Mehrere Datensätze in einem Schritt (IN-Liste)** +
-<WRAP center box 80% round><code sql> +
-DELETE FROM favourite_film +
-WHERE film_id IN (2, 3); +
-</code></WRAP> +
- +
-**Aufräumen nach Import (z. B. fehlerhafte Jahrgänge)** +
-<WRAP center box 80% round><code sql> +
-DELETE FROM favourite_film +
-WHERE released_year < 1900 OR released_year IS NULL; +
-</code></WRAP> +
- +
-> **Warnung:** //DELETE// ohne %%WHERE%% leert die **gesamte** Tabelle. +
- +
-===== TRUNCATE – Tabelle schnell leeren (ohne WHERE) ===== +
-%%TRUNCATE%% entfernt **alle** Zeilen einer Tabelle **sehr schnell**. Im Unterschied zu //DELETE//: +
-  * Keine %%WHERE%%-Bedingung möglich (immer die **ganze** Tabelle). +
-  * Setzt den AUTO_INCREMENT-Zähler zurück. +
-  * Kann durch Fremdschlüssel-Constraints blockiert sein. +
-  * Gilt in vielen Systemen als DDL-Operation (ähnlich wie Tabellendefinitionen). +
- +
-<WRAP center box 80% round><code sql> +
-TRUNCATE TABLE favourite_film; +
-</code></WRAP> +
- +
-> **Merke:** Nutzen Sie %%TRUNCATE%% nur, wenn Sie die Tabelle **vollständig leeren** wollen. Für selektives Löschen bleibt //DELETE// die richtige Wahl. +
- +
- +
-===== Praxis: Sicher arbeiten (SELECT-Variante & Dry-Run) ===== +
-Vor jedem //UPDATE// bzw. //DELETE// zuerst mit **SELECT testen**, ob die **gleiche WHERE-Bedingung** die gewünschten Zeilen trifft: +
- +
-<WRAP center box 80% round><code sql> +
--- Dry-Run: Welche Zeilen wären betroffen? +
-SELECT film_id, title FROM favourite_film +
-WHERE released_year >= 2020; +
-</code></WRAP> +
- +
-Wenn korrekt: erst dann %%UPDATE%%/%%DELETE%% mit derselben %%WHERE%%-Bedingung ausführen.+
  
  • modul/m290_guko/learningunits/lu07/theorie/b_sql_dml.1759077510.txt.gz
  • Zuletzt geändert: 2025/09/28 18:38
  • von gkoch