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.
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')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'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')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;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;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);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;-- 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';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 MitarbeiterNach dem Löschen:
-- Zähler zurücksetzen
ALTER TABLE mitarbeiter AUTO_INCREMENT = 1;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;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:
-- Vor dem UPDATE/DELETE
SELECT * FROM mitarbeiter
WHERE abteilung = 'Vertrieb';START TRANSACTION;
UPDATE mitarbeiter SET ...
-- Ergebnis prüfen
COMMIT; -- oder ROLLBACK-- Vor größeren Änderungen
CREATE TABLE mitarbeiter_backup
SELECT * FROM mitarbeiter;INSERT INTO changelog
(datum, benutzer, aktion, beschreibung)
VALUES
(NOW(), USER(), 'UPDATE', 'Gehaltserhöhung Vertrieb');