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:57] 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 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)**
- +
-**Syntax (allgemein: Einzelzeile)**  +
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
 INSERT INTO tabellenname (spalte1, spalte2, spalte3) INSERT INTO tabellenname (spalte1, spalte2, spalte3)
 VALUES (wert1, wert2, wert3); VALUES (wert1, wert2, wert3);
 </code></WRAP> </code></WRAP>
-*Erklärung:* Fügt **eine** neue Zeile ein. Spaltenreihenfolge und Werteposition müssen zusammenpassen. 
  
-**Syntax (mehrere Zeilen in einem Statement)**  +**Syntax (mehrere Zeilen auf einmal)**
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
 INSERT INTO tabellenname (spalte1, spalte2, spalte3) INSERT INTO tabellenname (spalte1, spalte2, spalte3)
 VALUES (wert1a, wert2a, wert3a), VALUES (wert1a, wert2a, wert3a),
-       (wert1b, wert2b, wert3b), +       (wert1b, wert2b, wert3b);
-       (wert1c, wert2c, wert3c);+
 </code></WRAP> </code></WRAP>
-*Erklärung:* Effizienter für **Batch-Einfügungen**, spart Rundreisen zur Datenbank. 
  
-**Syntax (INSERT ... SELECT – aus anderer Tabelle übernehmen)**  +**Syntax (INSERT ... SELECT)**
 <WRAP center box 80% round><code sql> <WRAP center box 80% round><code sql>
 INSERT INTO zieltabelle (spalte1, spalte2, spalte3) INSERT INTO zieltabelle (spalte1, spalte2, spalte3)
Zeile 60: Zeile 53:
 WHERE bedingung; WHERE bedingung;
 </code></WRAP> </code></WRAP>
-*Erklärung:* Kopiert Daten **ohne** Zwischenexport direkt von Quelle → Ziel. Mit %%WHERE%% lässt sich filtern. 
  
 --- ---
Zeile 69: Zeile 61:
 VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson'); VALUES ('Lost in Translation', 'Sofia Coppola', 2003, 'Scarlett Johansson');
 </code></WRAP> </code></WRAP>
- 
-Ergebnis in Tabelle //favourite_film//: 
  
 <WRAP center box 80% round> <WRAP center box 80% round>
Zeile 84: Zeile 74:
   ('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');   ('Arrival', 'Denis Villeneuve', 2016, 'Amy Adams');
 </code></WRAP> </code></WRAP>
- 
-Ergebnis in Tabelle //favourite_film//: 
  
 <WRAP center box 80% round> <WRAP center box 80% round>
Zeile 95: Zeile 83:
  
 **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 105: Zeile 93:
 </code></WRAP> </code></WRAP>
  
-> **Hinweise:**   +> **Hinweis:** Mit %%WHERE%% können gezielt nur bestimmte Datensätze übernommen werden (z. B. ab Jahr 2000).
-> • Zahlen/Jahr ohne Anführungszeichen, Texte in Anführungszeichen: //'Inception'//  +
-> • Mit der %%WHERE%%-Bedingung können gezielt nur bestimmte Datensätze übernommen werden (z. B. ab Jahr 2000). +
- +
-===== UPDATE – Daten ändern ===== +
- +
-**Syntax (mit Filter – empfohlen)**   +
-<WRAP center box 80% round><code sql> +
-UPDATE tabellenname +
-SET spalte1 = neuer_wert1, spalte2 = neuer_wert2 +
-WHERE bedingung; +
-</code></WRAP> +
-*Erklärung:* Aktualisiert **nur** Zeilen, die die Bedingung erfüllen (z. B. Identifikator passt). +
- +
-**Syntax (ohne Filter – mit Vorsicht!)**   +
-<WRAP center box 80% round><code sql> +
-UPDATE tabellenname +
-SET spalte1 = neuer_wert1; +
-</code></WRAP> +
-*Erklärung:* Aktualisiert **alle** Zeilen der Tabelle – meist nicht gewünscht. +
- +
---- +
- +
-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> +
- +
-Ergebnis in Tabelle //favourite_film//: +
- +
-<WRAP center box 80% round> +
-^ film_id ^ title               ^ director         ^ released_year ^ star1              ^ +
-| 1       | Lost in Translation | Sofia Coppola    | 2003          | Scarlett Johansson | +
-| 2       | Inception           | C. Nolan         | 2010          | Leonardo DiCaprio +
-| 3       | Arrival             | Denis Villeneuve | 2016          | Amy Adams          | +
-</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> +
- +
-Ergebnis in Tabelle //favourite_film//: +
- +
-<WRAP center box 80% round> +
-^ film_id ^ title                  ^ director         ^ released_year ^ star1             ^ +
-| 1       | Lost in Translation    | Sofia Coppola    | 2003          | Scarlett Johansson| +
-| 2       | Inception              | C. Nolan         | 2010          | Leonardo DiCaprio | +
-| 3       | Arrival (Extended Cut) | Denis Villeneuve | 2016          | Amy Adams         | +
-</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> +
- +
-===== DELETE – Daten löschen ===== +
- +
-**Syntax (mit Filter – empfohlen)**   +
-<WRAP center box 80% round><code sql> +
-DELETE FROM tabellenname +
-WHERE bedingung; +
-</code></WRAP> +
-*Erklärung:* Entfernt **nur** die Zeilen, die die Bedingung erfüllen. +
- +
-**Syntax (ohne Filter – mit Vorsicht!)**   +
-<WRAP center box 80% round><code sql> +
-DELETE FROM tabellenname; +
-</code></WRAP> +
-*Erklärung:* Löscht **alle** Zeilen der Tabelle; die Tabellenstruktur bleibt erhalten. +
- +
---- +
- +
-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> +
- +
-Ergebnis in Tabelle //favourite_film//: +
- +
-<WRAP center box 80% round> +
-^ film_id ^ title                  ^ director         ^ released_year ^ star1             ^ +
-| 2       | Inception              | C. Nolan         | 2010          | Leonardo DiCaprio | +
-| 3       | Arrival (Extended Cut) | Denis Villeneuve | 2016          | Amy Adams         | +
-</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> +
- +
-Ergebnis in Tabelle //favourite_film//: +
- +
-<WRAP center box 80% round> +
-^ film_id ^ title ^ director ^ released_year ^ star1 ^ +
-| (keine Zeilen mehr vorhanden) ||||| +
-</WRAP> +
- +
-===== 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> +
- +
-===== 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>+
  
  • modul/m290_guko/learningunits/lu07/theorie/b_sql_dml.1759078657.txt.gz
  • Zuletzt geändert: 2025/09/28 18:57
  • von gkoch