8 Werte in Tabellen verändern

8.1 WHERE-Klausel

Die WHERE-Klausel ist ein zentrales Element bei der Änderung und Löschung von Daten. Sie bestimmt, welche Datensätze von einer Operation betroffen sind.

8.1.1 Wie formuliere ich eine einfache Bedingung?

Grundlegende Vergleichsoperatoren:

-- Gleichheit
WHERE abteilung = 'Vertrieb'

-- Ungleichheit
WHERE abteilung != 'Vertrieb'
WHERE abteilung <> 'Vertrieb'  -- Alternative Schreibweise

-- Größer/Kleiner
WHERE gehalt > 50000
WHERE gehalt <= 75000

-- Bereich
WHERE gehalt BETWEEN 50000 AND 75000

-- NULL-Werte
WHERE telefon IS NULL
WHERE telefon IS NOT NULL

-- Mustervergleich
WHERE name LIKE 'Müller%'      -- beginnt mit Müller
WHERE name LIKE '%mann'        -- endet mit mann
WHERE name LIKE '%schmidt%'    -- enthält schmidt

-- IN-Liste
WHERE abteilung IN ('Vertrieb', 'Marketing', 'IT')

8.1.2 Wird zwischen Groß- und Kleinschreibung unterschieden?

Standardmäßig wird bei Zeichenketten nicht zwischen Groß- und Kleinschreibung unterschieden:

-- Diese Bedingungen sind gleichwertig
WHERE name = 'Müller'
WHERE name = 'müller'
WHERE name = 'MÜLLER'

-- Für case-sensitive Vergleiche
WHERE BINARY name = 'Müller'

8.1.3 Wie formuliere ich eine zusammengesetzte Bedingung?

Logische Operatoren für komplexe Bedingungen:

-- UND-Verknüpfung
WHERE abteilung = 'Vertrieb' 
  AND gehalt > 50000

-- ODER-Verknüpfung
WHERE abteilung = 'Vertrieb' 
  OR abteilung = 'Marketing'

-- Kombination mit Klammern
WHERE (abteilung = 'Vertrieb' OR abteilung = 'Marketing')
  AND gehalt > 50000

-- NOT zur Negation
WHERE NOT (abteilung = 'Vertrieb')
WHERE abteilung NOT IN ('Vertrieb', 'Marketing')

8.2 Tabelleninhalte verändern

8.2.1 Szenario 1: Einfache Wertzuweisung

Einfache Änderungen mit UPDATE:

-- Einzelnen Wert ändern
UPDATE mitarbeiter 
SET abteilung = 'Marketing' 
WHERE mitarbeiter_id = 100;

-- Mehrere Werte ändern
UPDATE mitarbeiter 
SET 
    abteilung = 'Marketing',
    gehalt = 60000
WHERE mitarbeiter_id = 100;

-- Alle Datensätze ändern
UPDATE mitarbeiter 
SET aktiv = true;

8.2.2 Szenario 2: Berechnete Werte

Werte können auch berechnet werden:

-- Gehaltserhöhung um 5%
UPDATE mitarbeiter 
SET gehalt = gehalt * 1.05 
WHERE abteilung = 'Vertrieb';

-- Datum aktualisieren
UPDATE bestellungen 
SET letzte_aenderung = CURRENT_TIMESTAMP 
WHERE bestell_id = 500;

-- Mit Fallunterscheidung
UPDATE produkte 
SET preis = 
    CASE 
        WHEN lagerbestand > 100 THEN preis * 0.9
        WHEN lagerbestand < 10 THEN preis * 1.1
        ELSE preis
    END;

8.2.3 Szenario 3: Gebastelte Zeichenketten

Manipulation von Textfeldern:

-- Strings zusammenführen
UPDATE mitarbeiter 
SET vollname = CONCAT(vorname, ' ', nachname);

-- Strings in Großbuchstaben
UPDATE mitarbeiter 
SET email = UPPER(email);

-- Leerzeichen entfernen
UPDATE mitarbeiter 
SET telefon = TRIM(telefon);

8.2.4 Was bedeuten LOW_PRIORITY und IGNORE?

Optionen für UPDATE-Befehle:

-- Niedrige Priorität
UPDATE LOW_PRIORITY mitarbeiter 
SET gehalt = 60000 
WHERE mitarbeiter_id = 100;

-- Fehler ignorieren
UPDATE IGNORE mitarbeiter 
SET email = 'max@firma.de' 
WHERE mitarbeiter_id = 100;

8.3 Tabelleninhalte löschen

8.3.1 Einzelne Datensätze löschen

-- Einzelnen Datensatz löschen
DELETE FROM mitarbeiter 
WHERE mitarbeiter_id = 100;

-- Mehrere Datensätze löschen
DELETE FROM mitarbeiter 
WHERE abteilung = 'Vertrieb';

-- Mit komplexer Bedingung
DELETE FROM mitarbeiter 
WHERE abteilung = 'Vertrieb' 
  AND eintrittsdatum < '2020-01-01';

8.3.2 Und was passiert bei Constraints?

Bei Fremdschlüsselbeziehungen:

-- RESTRICT verhindert Löschen
DELETE FROM abteilungen 
WHERE abteilung_id = 10;  -- Fehler wenn Mitarbeiter existieren

-- CASCADE löscht abhängige Datensätze
DELETE FROM abteilungen 
WHERE abteilung_id = 10;  -- Löscht auch zugehörige Mitarbeiter

8.3.3 Was passiert mit dem AUTO_INCREMENT?

Nach dem Löschen:

-- Zähler zurücksetzen
ALTER TABLE mitarbeiter AUTO_INCREMENT = 1;

8.3.4 Was bedeuten LOW_PRIORITY, QUICK und IGNORE?

Optionen für DELETE:

-- Niedrige Priorität
DELETE LOW_PRIORITY FROM mitarbeiter 
WHERE mitarbeiter_id = 100;

-- Schnelles Löschen (keine Triggers)
DELETE QUICK FROM protokoll 
WHERE datum < '2020-01-01';

-- Fehler ignorieren
DELETE IGNORE FROM mitarbeiter 
WHERE mitarbeiter_id = 100;

8.3.5 Wie kann ich eine Tabelle komplett leeren?

Zwei Möglichkeiten zum Leeren einer Tabelle:

-- Mit DELETE
DELETE FROM mitarbeiter;

-- Mit TRUNCATE (schneller)
TRUNCATE TABLE mitarbeiter;

Unterschiede zwischen DELETE und TRUNCATE:

Tipps für Änderungen und Löschungen:

  1. Testen Sie zuerst mit SELECT:
-- Vor dem UPDATE/DELETE
SELECT * FROM mitarbeiter 
WHERE abteilung = 'Vertrieb';
  1. Verwenden Sie Transaktionen:
START TRANSACTION;
UPDATE mitarbeiter SET ...
-- Ergebnis prüfen
COMMIT;  -- oder ROLLBACK
  1. Erstellen Sie Sicherungen:
-- Vor größeren Änderungen
CREATE TABLE mitarbeiter_backup 
SELECT * FROM mitarbeiter;
  1. Dokumentieren Sie Änderungen:
INSERT INTO changelog 
(datum, benutzer, aktion, beschreibung) 
VALUES 
(NOW(), USER(), 'UPDATE', 'Gehaltserhöhung Vertrieb');