Zum Inhalt springen

6. SQL DML-Funktionen

Zu Zen-Modus wechseln

DML-Funktionen (“Data Manipulation Language”) sind spezielle von SQL bereitgestellte Funktionen, um Operationen auf den Daten innerhalb der Datenbank durchzuführen. Diese Funktionen können in verschiedenen SQL-Anweisungen wie SELECT, INSERT, UPDATE und DELETE verwendet werden, um Daten wirkungsvoll zu verändern und abzurufen.

In diesem Kapitel erkunden wir einige der am häufigsten verwendeten DML-Funktionen in SQL. Nach den grundlegenden Tabellenoperationen sind diese Befehle wesentlich für die Arbeit mit Daten in einer relationalen Datenbank.

Der Ansatz folgt dem bekannten CRUD-Paradigma:

  • Create (Erstellen) - Neue Daten mit der INSERT-Anweisung in Tabellen einfügen.
  • Read (Lesen) - Daten mit der SELECT-Anweisung aus Tabellen abrufen.
  • Update (Aktualisieren) - Bestehende Daten mit der UPDATE-Anweisung in Tabellen ändern.
  • Delete (Löschen) - Daten mit der DELETE-Anweisung aus Tabellen entfernen.

Die Beispieltabelle, die wir in diesem Kapitel durchgehend verwenden, sieht wie folgt aus:

CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(320) UNIQUE NOT NULL,
birth_date DATE,
class VARCHAR(10)
);

Eine Datenbanktabelle kann mit der INSERT INTO-Anweisung mit Daten befüllt werden. Die grundlegende Syntax lautet wie folgt:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...) [, (value1, value2, value3, ...), ...];

Beispiel - Einen neuen Schüler in die Tabelle students einfügen:

INSERT INTO students (first_name, last_name, email, birth_date, class)
VALUES ('Alice', 'Kingsleigh', '[email protected]', '2010-12-17', '4A');

Wenn zum Zeitpunkt des Einfügens nicht alle Werte bekannt sind, können die Spalten weggelassen werden, und die Datenbank vergibt Standardwerte (z. B. NULL oder automatisch hochgezählte IDs):

Beispiel - Einen neuen Schüler nur mit dem Pflichtfeld E-Mail einfügen:

INSERT INTO students (first_name, last_name, email)
VALUES ('Alice', 'Kingsleigh', '[email protected]');

Sie können auch die Reihenfolge der Spalten in der INSERT-Anweisung umstellen, solange die Werte korrekt dazu passen.

Beispiel - Einen neuen Schüler mit umgestellten Spalten einfügen:

INSERT INTO students (email, last_name, first_name, class)
VALUES ('[email protected]', 'Kingsleigh', 'Alice', '4A');

Schließlich können Sie mehrere Zeilen in einer einzigen INSERT-Anweisung einfügen, indem Sie die Wertesätze durch Kommas trennen:

Beispiel - Mehrere Schüler auf einmal einfügen:

INSERT INTO students (first_name, last_name, email, birth_date, class)
VALUES
('Alice', 'Kingsleigh', '[email protected]', '2010-12-17', '4A'),
('Edwin', 'Hatter', '[email protected]', '2011-05-23', '4B'),
('Reginald', 'White-Rabbit', '[email protected]', '2010-08-15', '4A'),
('Quennie', 'Heart', '[email protected]', '2010-11-30', '4B');

Um Daten aus einer Datenbanktabelle abzurufen, wird die SELECT-Anweisung verwendet. Die grundlegende Syntax lautet wie folgt:

SELECT column1, column2, column3, ...
FROM table_name
[WHERE condition];

Beispiel - Alle Schüler auswählen:

SELECT student_id, first_name, last_name, email, birth_date, class
FROM students;

Wenn Sie alle Spalten einer Tabelle auswählen möchten, können Sie den Stern (*) als Platzhalter verwenden:

SELECT *
FROM students;

Die WHERE-Klausel erlaubt es, die Ergebnisse anhand bestimmter Bedingungen zu filtern.

Beispiel - Schüler aus der Klasse ‘4A’ auswählen:

SELECT *
FROM students
WHERE class = '4A';

Die WHERE-Klausel kann auch verschiedene Operatoren wie =, <>, <, >, <=, >=, LIKE, IN, BETWEEN, EXISTS, NOT EXISTS sowie logische Operatoren wie AND, OR und NOT verwenden, um komplexe Bedingungen zu bilden.

Beispiel - Schüler auswählen, die nach dem 1. Januar 2011 geboren wurden und in der Klasse ‘4B’ sind:

SELECT *
FROM students
WHERE birth_date > '2011-01-01' AND class = '4B';

Beispiel - Schüler auswählen, deren Nachname mit ‘K’ beginnt:

SELECT *
FROM students
WHERE last_name LIKE 'K%';

Beispiel - Name und E-Mail von Schülern auswählen, deren Vorname nicht ‘Alice’ ist:

SELECT first_name, last_name, email
FROM students
WHERE first_name <> 'Alice';

Beispiel - E-Mail-Adressen von Schülern auswählen, die in Klasse 4A oder 4B sind:

SELECT email
FROM students
WHERE class IN ('4A', '4B');

Beispiel - Alle im Jahr 2010 geborenen Schüler auswählen:

SELECT *
FROM students
WHERE birth_date BETWEEN '2010-01-01' AND '2010-12-31';

Standardmäßig kann eine Datenbank die Zeilen in beliebiger Reihenfolge zurückgeben - es gibt keine Garantie, dass sie so zurückkommen, wie sie eingefügt wurden. Um eine vorhersehbare Reihenfolge zu erhalten, fügen Sie am Ende Ihrer Abfrage eine ORDER BY-Klausel hinzu.

SELECT first_name, last_name, birth_date
FROM students
ORDER BY last_name;

Standardmäßig wird aufsteigend sortiert (ASC): A → Z bei Text, klein → groß bei Zahlen, ältestes → neuestes bei Datumswerten. Um dies umzukehren, verwenden Sie DESC (absteigend).

Beispiel - Jüngster Schüler zuerst (neuestes Geburtsdatum oben):

SELECT first_name, last_name, birth_date
FROM students
ORDER BY birth_date DESC;

Sie können auch nach mehreren Spalten sortieren. Das Ergebnis wird nach der ersten Spalte sortiert; Zeilen mit demselben Wert werden anschließend nach der nächsten Spalte sortiert.

Beispiel - Zuerst nach Klasse und innerhalb jeder Klasse alphabetisch nach Nachname sortieren:

SELECT class, last_name, first_name
FROM students
ORDER BY class ASC, last_name ASC;

Manchmal kommt derselbe Wert in vielen Zeilen vor, Sie möchten aber jeden Wert nur einmal sehen. Das Schlüsselwort DISTINCT entfernt doppelte Zeilen aus dem Ergebnis.

Beispiel - Ohne DISTINCT wird die Klasse jedes Schülers aufgelistet, sodass “4A” und “4B” mehrfach erscheinen:

SELECT class
FROM students;

Beispiel - Mit DISTINCT wird jede Klasse nur einmal aufgelistet:

SELECT DISTINCT class
FROM students;

DISTINCT betrachtet alle ausgewählten Spalten gemeinsam. SELECT DISTINCT class, first_name behält jede eindeutige Kombination aus Klasse und Vorname, nicht nur eindeutige Klassen.

Tabellen können Tausende oder sogar Millionen von Zeilen enthalten. Oft möchten Sie nur wenige sehen - zum Beispiel die “Top 3” oder einfach einen kurzen Blick auf die Daten. Die LIMIT-Klausel beschränkt, wie viele Zeilen zurückgegeben werden.

Beispiel - Höchstens 5 Schüler zurückgeben:

SELECT *
FROM students
LIMIT 5;

LIMIT ist besonders zusammen mit ORDER BY nützlich, um “Top-N”-Fragen zu beantworten.

Beispiel - Die drei jüngsten Schüler:

SELECT first_name, last_name, birth_date
FROM students
ORDER BY birth_date DESC
LIMIT 3;

Um bestehende Daten in einer Datenbanktabelle zu ändern, wird die UPDATE-Anweisung verwendet. Die grundlegende Syntax lautet wie folgt:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
[WHERE condition];

Beispiel - Die E-Mail-Adresse eines Schülers aktualisieren:

UPDATE students
SET email = '[email protected]'
WHERE student_id = 1;

Sie können mehr als eine Zeile gleichzeitig aktualisieren, indem Sie in der WHERE-Klausel eine Bedingung angeben, die auf mehrere Datensätze zutrifft.

Beispiel - Die Klasse aller vor 2011 geborenen Schüler auf ‘3A’ aktualisieren:

UPDATE students
SET class = '3A'
WHERE birth_date < '2011-01-01';

Es können auch mehrere Spalten in einer einzigen UPDATE-Anweisung aktualisiert werden.

Beispiel - Sowohl Vor- als auch Nachname eines Schülers aktualisieren:

UPDATE students
SET first_name = 'Alicia', last_name = 'King', email = '[email protected]'
WHERE student_id = 1;

Um Daten aus einer Datenbanktabelle zu entfernen, wird die DELETE-Anweisung verwendet. Die grundlegende Syntax lautet wie folgt:

DELETE FROM table_name
[WHERE condition];

Beispiel - Einen Schüler anhand seiner ID löschen:

DELETE FROM students
WHERE student_id = 1;

Sie können mehrere Zeilen löschen, indem Sie in der WHERE-Klausel eine Bedingung angeben, die auf mehrere Datensätze zutrifft.

Beispiel - Alle Schüler der Klasse ‘4A’ löschen:

DELETE FROM students
WHERE class = '4A';

Bisher haben wir Werte genau so gelesen, wie sie gespeichert sind. Aber SQL kann Werte auch beim Lesen umwandeln. Eine Funktion nimmt einen oder mehrere Eingabewerte entgegen und gibt einen neuen Wert zurück. Funktionen können fast überall dort verwendet werden, wo Sie einen Spaltennamen schreiben können - am häufigsten in der SELECT-Liste (um zu ändern, wie ein Wert angezeigt wird) oder in der WHERE-Klausel (um nach einem berechneten Wert zu filtern).

Die ursprünglichen Daten in der Tabelle werden durch diese Funktionen niemals verändert - nur das Ergebnis der Abfrage ist betroffen.

Diese Funktionen arbeiten mit Zeichenketten (Text).

FunktionBeschreibungBeispielErgebnis
UPPER(text)Wandelt in Großbuchstaben umUPPER('Alice')'ALICE'
LOWER(text)Wandelt in Kleinbuchstaben umLOWER('Alice')'alice'
LENGTH(text)Anzahl der ZeichenLENGTH('Alice')5
TRIM(text)Entfernt führende/abschließende LeerzeichenTRIM(' hi ')'hi'
SUBSTRING(text, start, length)Extrahiert einen Teil einer ZeichenketteSUBSTRING('Database', 1, 4)'Data'

Das Verbinden (Verketten) zweier Zeichenketten ist so häufig, dass es einen eigenen Operator hat. In PostgreSQL, MariaDB und MySQL können Sie || verwenden; viele Systeme (und der SQL-Standard) bieten zudem die Funktion CONCAT(...):

-- show the full name as a single column
SELECT first_name || ' ' || last_name AS full_name
FROM students;
-- same with CONCAT (works in MariaDB/MySQL and PostgreSQL)
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM students;

Beispiel - Schüler finden, deren Nachname mit “k” beginnt, unabhängig von Groß- und Kleinschreibung:

SELECT first_name, last_name
FROM students
WHERE LOWER(last_name) LIKE 'k%';

Diese Funktionen arbeiten mit Zahlen.

FunktionBeschreibungBeispielErgebnis
ROUND(num, digits)Rundet auf eine Anzahl von NachkommastellenROUND(3.14159, 2)3.14
ABS(num)Absolutwert (entfernt das Vorzeichen)ABS(-7)7
CEIL(num)Rundet auf zur nächsten GanzzahlCEIL(4.1)5
FLOOR(num)Rundet ab zur nächsten GanzzahlFLOOR(4.9)4
MOD(a, b)Rest einer DivisionMOD(10, 3)1

Beispiel - Jeden Produktpreis auf ganze Euro gerundet anzeigen (mit einer Tabelle products):

SELECT name, ROUND(price, 0) AS rounded_price
FROM products;

Diese Funktionen helfen Ihnen, mit Datumswerten zu arbeiten - zum Beispiel das Jahr aus einem Datum auszulesen oder das heutige Datum zu ermitteln.

FunktionBeschreibung
CURRENT_DATEDas heutige Datum
NOW()Aktuelles Datum und Uhrzeit
EXTRACT(YEAR FROM date)Liest einen Teil (Jahr, Monat, Tag) aus einem Datum

Das Auslesen des Jahres aus einem Datum ist ein gutes Beispiel für einen Dialektunterschied:

-- PostgreSQL (SQL standard)
SELECT first_name, EXTRACT(YEAR FROM birth_date) AS birth_year
FROM students;
-- MariaDB / MySQL (shorter helper function)
SELECT first_name, YEAR(birth_date) AS birth_year
FROM students;

Beispiel - Alle im Jahr 2010 geborenen Schüler finden:

-- PostgreSQL
SELECT first_name, last_name
FROM students
WHERE EXTRACT(YEAR FROM birth_date) = 2010;
-- MariaDB / MySQL
SELECT first_name, last_name
FROM students
WHERE YEAR(birth_date) = 2010;

Damit endet unsere Einführung in die Datenmanipulation in SQL. Sie können nun Daten einfügen, lesen (einschließlich Sortieren mit ORDER BY, Entfernen von Duplikaten mit DISTINCT und Begrenzen der Ergebnisse mit LIMIT), aktualisieren und löschen - und Werte mit eingebauten Funktionen im Handumdrehen umformen. In den folgenden Kapiteln erkunden wir fortgeschrittenere SQL-Funktionen und -Techniken für die Arbeit mit relationalen Datenbanken.

Lernergebnisse: Was Sie nach diesem Kapitel können sollten

Abschnitt betitelt „Lernergebnisse: Was Sie nach diesem Kapitel können sollten“

Nach Abschluss dieses Kapitels sollten Schülerinnen und Schüler in der Lage sein:

  • Nennen: die DML-Befehle INSERT, SELECT, UPDATE und DELETE nennen.
  • Beschreiben: den Aufbau einer SELECT-Abfrage und die Wirkung der DML-Befehle beschreiben.
  • Anwenden: Daten einfügen, abfragen, aktualisieren und löschen sowie SQL-Funktionen (String-, Datums- und Zahlenfunktionen) anwenden.
  • Analysieren: die Auswirkung einer UPDATE- oder DELETE-Anweisung ohne WHERE-Bedingung analysieren.
  • Beurteilen: beurteilen, welche SQL-Funktion für eine gegebene Datenaufbereitung geeignet ist.