6. SQL DML-Funktionen
DML-Funktionen in SQL
Abschnitt betitelt „DML-Funktionen in SQL“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));CREATE TABLE students ( student_id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(320) UNIQUE NOT NULL, birth_date DATE, class VARCHAR(10));Daten einfügen
Abschnitt betitelt „Daten einfügen“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)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)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)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)VALUESDaten lesen
Abschnitt betitelt „Daten lesen“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, classFROM 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 studentsWHERE 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 studentsWHERE birth_date > '2011-01-01' AND class = '4B';Beispiel - Schüler auswählen, deren Nachname mit ‘K’ beginnt:
SELECT *FROM studentsWHERE last_name LIKE 'K%';Beispiel - Name und E-Mail von Schülern auswählen, deren Vorname nicht ‘Alice’ ist:
SELECT first_name, last_name, emailFROM studentsWHERE first_name <> 'Alice';Beispiel - E-Mail-Adressen von Schülern auswählen, die in Klasse 4A oder 4B sind:
SELECT emailFROM studentsWHERE class IN ('4A', '4B');Beispiel - Alle im Jahr 2010 geborenen Schüler auswählen:
SELECT *FROM studentsWHERE birth_date BETWEEN '2010-01-01' AND '2010-12-31';Ergebnisse sortieren mit ORDER BY
Abschnitt betitelt „Ergebnisse sortieren mit ORDER BY“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_dateFROM studentsORDER 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_dateFROM studentsORDER 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_nameFROM studentsORDER BY class ASC, last_name ASC;Duplikate entfernen mit DISTINCT
Abschnitt betitelt „Duplikate entfernen mit DISTINCT“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 classFROM students;Beispiel - Mit DISTINCT wird jede Klasse nur einmal aufgelistet:
SELECT DISTINCT classFROM 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.
Anzahl der Zeilen begrenzen mit LIMIT
Abschnitt betitelt „Anzahl der Zeilen begrenzen mit LIMIT“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 studentsLIMIT 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_dateFROM studentsORDER BY birth_date DESCLIMIT 3;Daten aktualisieren
Abschnitt betitelt „Daten aktualisieren“Um bestehende Daten in einer Datenbanktabelle zu ändern, wird die UPDATE-Anweisung verwendet. Die grundlegende Syntax lautet wie folgt:
UPDATE table_nameSET column1 = value1, column2 = value2, ...[WHERE condition];Beispiel - Die E-Mail-Adresse eines Schülers aktualisieren:
UPDATE studentsWHERE 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 studentsSET 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 studentsWHERE student_id = 1;Daten löschen
Abschnitt betitelt „Daten löschen“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 studentsWHERE 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 studentsWHERE class = '4A';SQL-Funktionen
Abschnitt betitelt „SQL-Funktionen“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.
Textfunktionen
Abschnitt betitelt „Textfunktionen“Diese Funktionen arbeiten mit Zeichenketten (Text).
| Funktion | Beschreibung | Beispiel | Ergebnis |
|---|---|---|---|
UPPER(text) | Wandelt in Großbuchstaben um | UPPER('Alice') | 'ALICE' |
LOWER(text) | Wandelt in Kleinbuchstaben um | LOWER('Alice') | 'alice' |
LENGTH(text) | Anzahl der Zeichen | LENGTH('Alice') | 5 |
TRIM(text) | Entfernt führende/abschließende Leerzeichen | TRIM(' hi ') | 'hi' |
SUBSTRING(text, start, length) | Extrahiert einen Teil einer Zeichenkette | SUBSTRING('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(...):
-- Den vollständigen Namen als eine einzige Spalte anzeigenSELECT first_name || ' ' || last_name AS full_nameFROM students;
-- Dasselbe mit CONCAT (funktioniert in MariaDB/MySQL und PostgreSQL)SELECT CONCAT(first_name, ' ', last_name) AS full_nameFROM students;Beispiel - Schüler finden, deren Nachname mit “k” beginnt, unabhängig von Groß- und Kleinschreibung:
SELECT first_name, last_nameFROM studentsWHERE LOWER(last_name) LIKE 'k%';Numerische Funktionen
Abschnitt betitelt „Numerische Funktionen“Diese Funktionen arbeiten mit Zahlen.
| Funktion | Beschreibung | Beispiel | Ergebnis |
|---|---|---|---|
ROUND(num, digits) | Rundet auf eine Anzahl von Nachkommastellen | ROUND(3.14159, 2) | 3.14 |
ABS(num) | Absolutwert (entfernt das Vorzeichen) | ABS(-7) | 7 |
CEIL(num) | Rundet auf zur nächsten Ganzzahl | CEIL(4.1) | 5 |
FLOOR(num) | Rundet ab zur nächsten Ganzzahl | FLOOR(4.9) | 4 |
MOD(a, b) | Rest einer Division | MOD(10, 3) | 1 |
Beispiel - Jeden Produktpreis auf ganze Euro gerundet anzeigen (mit einer Tabelle products):
SELECT name, ROUND(price, 0) AS rounded_priceFROM products;Datums- und Zeitfunktionen
Abschnitt betitelt „Datums- und Zeitfunktionen“Diese Funktionen helfen Ihnen, mit Datumswerten zu arbeiten - zum Beispiel das Jahr aus einem Datum auszulesen oder das heutige Datum zu ermitteln.
| Funktion | Beschreibung |
|---|---|
CURRENT_DATE | Das 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_yearFROM students;
-- MariaDB / MySQL (kürzere Hilfsfunktion)SELECT first_name, YEAR(birth_date) AS birth_yearFROM students;Beispiel - Alle im Jahr 2010 geborenen Schüler finden:
-- PostgreSQLSELECT first_name, last_nameFROM studentsWHERE EXTRACT(YEAR FROM birth_date) = 2010;
-- MariaDB / MySQLSELECT first_name, last_nameFROM studentsWHERE 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,UPDATEundDELETEnennen. - 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- oderDELETE-Anweisung ohneWHERE-Bedingung analysieren. - Beurteilen: beurteilen, welche SQL-Funktion für eine gegebene Datenaufbereitung geeignet ist.