Ein Prepared Statement (auch vorbereitetes Statement genannt) ist eine Technik in der Programmierung, insbesondere bei der Arbeit mit Datenbanken, um SQL-Abfragen sicherer und effizienter auszuführen.
Ein Prepared Statement besteht aus zwei Schritten:
Vorbereitung der SQL-Abfrage mit Platzhaltern
Beispiel in SQL:
SELECT * FROM users WHERE username = ? AND password = ?
(In manchen Sprachen nutzt man auch :username
oder andere Platzhalter)
Bindung der Parameter und Ausführung
Die echten Werte werden später „gebunden“, z. B.:
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
✅ Sicherer vor SQL-Injection:
Benutzereingaben werden nicht direkt in die SQL eingebaut, sondern separat behandelt.
✅ Schneller bei Wiederholungen:
Die SQL-Abfrage wird vom Datenbankserver einmal geparst und kann mehrfach effizient ausgeführt werden (z. B. bei Schleifen).
$conn = new mysqli("localhost", "user", "pass", "database");
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email); // "s" für string
$email = "beispiel@example.com";
$stmt->execute();
$result = $stmt->get_result();
Ein Prepared Statement trennt SQL-Logik von Benutzereingaben und schützt so vor Sicherheitslücken wie SQL-Injection. Es ist eine Best Practice beim Umgang mit Datenbanken.
Ein Outer Join ist ein Begriff aus der Datenbankabfrage (meist in SQL) und bezeichnet eine spezielle Art, zwei Tabellen miteinander zu verknüpfen – auch dann, wenn keine passenden Datensätze in einer der Tabellen vorhanden sind.
LEFT OUTER JOIN (oder einfach: LEFT JOIN):
→ Gibt alle Datensätze aus der linken Tabelle zurück, auch wenn es keine passenden Datensätze in der rechten Tabelle gibt.
→ Nicht passende Werte aus der rechten Tabelle werden mit NULL
aufgefüllt.
RIGHT OUTER JOIN (oder: RIGHT JOIN):
→ Gibt alle Datensätze aus der rechten Tabelle zurück, auch wenn es keine passenden in der linken gibt.
→ Nicht passende Werte aus der linken Tabelle werden mit NULL
ergänzt.
FULL OUTER JOIN:
→ Gibt alle Datensätze aus beiden Tabellen zurück.
→ Wo keine Übereinstimmung vorliegt, wird mit NULL
ergänzt.
Angenommen, du hast zwei Tabellen:
Kunden
Kundennr | Name |
1 | Anna |
2 | Bernd |
3 | Clara |
Bestellungen
Bestellnr | Kundennr | Produkt |
101 | 2 | Buch |
102 | 4 | Lampe |
Kundennr | Name | Bestellnr | Produkt |
---|---|---|---|
1 | Anna | NULL | NULL |
2 | Bernd | 101 | Buch |
3 | Clara | NULL | NULL |
Transaction Control Language (TCL) ist ein Teil der SQL-Sprache, der verwendet wird, um die Kontrolle über Transaktionen in einer Datenbank zu ermöglichen. Eine Transaktion ist eine logische Einheit von Arbeit, die eine oder mehrere SQL-Anweisungen umfasst – oft Insert-, Update- oder Delete-Befehle –, die zusammen ausgeführt werden sollen.
TCL stellt Befehle bereit, um sicherzustellen, dass Transaktionen korrekt abgeschlossen oder im Fehlerfall rückgängig gemacht werden.
Befehl | Beschreibung |
---|---|
COMMIT |
Speichert alle Änderungen der aktuellen Transaktion dauerhaft in der Datenbank. |
ROLLBACK |
Macht alle Änderungen seit dem letzten COMMIT rückgängig. |
SAVEPOINT |
Legt einen Zwischenstand in einer Transaktion fest, zu dem man später zurückkehren kann. |
ROLLBACK TO SAVEPOINT |
Macht alle Änderungen seit einem bestimmten Savepoint rückgängig. |
SET TRANSACTION |
Legt Eigenschaften für eine Transaktion fest (z. B. Isolationsgrad). |
BEGIN;
UPDATE konto SET saldo = saldo - 100 WHERE konto_id = 1;
UPDATE konto SET saldo = saldo + 100 WHERE konto_id = 2;
COMMIT;
→ Beide Updates werden gemeinsam abgeschlossen. Wenn ein Fehler auftritt, könnte man ROLLBACK
ausführen, um beide Änderungen zu verwerfen.
TCL-Befehle wirken nur bei Datenbank-Systemen, die Transaktionen unterstützen (z. B. PostgreSQL, Oracle, MySQL mit InnoDB).
Data Control Language (DCL) ist ein Teilbereich von SQL, der sich mit der Verwaltung von Zugriffsrechten und Berechtigungen in einer Datenbank beschäftigt. Mit DCL-Befehlen wird gesteuert, wer was in der Datenbank tun darf.
Befehl | Beschreibung |
---|---|
GRANT |
Erteilt einem Benutzer Rechte, z. B. zum Lesen oder Ändern von Daten |
REVOKE |
Entzieht einem Benutzer zuvor erteilte Rechte |
GRANT SELECT, INSERT ON Kunden TO Benutzer123;
REVOKE INSERT ON Kunden FROM Benutzer123;
SELECT
– Daten lesen
INSERT
– Daten einfügen
UPDATE
– Daten ändern
DELETE
– Daten löschen
ALL
– Alle Rechte
DCL regelt Sicherheit und Zugriffskontrolle in der Datenbank.
Sie wird meist vom Datenbankadministrator (DBA) verwendet.
Die Rechte können auf Tabellenebene, Spaltenebene oder global vergeben werden.
Änderungen durch DCL-Befehle sind oft transaktionsabhängig und benötigen ggf. ein COMMIT
.
DDL: Datenbankstruktur (z. B. Tabellen erstellen)
DML: Dateninhalte (z. B. Daten einfügen oder ändern)
TCL: Transaktionen steuern (z. B. COMMIT
, ROLLBACK
)
DCL: Rechte und Zugriffe verwalten
Die Data Manipulation Language (DML) ist ein Teilbereich der SQL (Structured Query Language), der für das Bearbeiten von Daten in einer Datenbank verwendet wird. Mit DML können Benutzer Daten einfügen, abfragen, ändern und löschen – also genau das, was man im Alltag mit Daten in einer Datenbank machen möchte.
Befehl | Zweck |
---|---|
SELECT |
Daten aus einer Tabelle abfragen |
INSERT |
Neue Daten einfügen |
UPDATE |
Bestehende Daten ändern |
DELETE |
Daten löschen |
Beispiel:
-- Einfügen
INSERT INTO kunden (name, stadt) VALUES ('Müller', 'Berlin');
-- Abfragen
SELECT * FROM kunden WHERE stadt = 'Berlin';
-- Aktualisieren
UPDATE kunden SET stadt = 'Hamburg' WHERE name = 'Müller';
-- Löschen
DELETE FROM kunden WHERE name = 'Müller';
DML arbeitet mit den Daten innerhalb der Tabellen, nicht mit der Struktur der Tabellen selbst (dafür gibt es die Data Definition Language, DDL).
DML-Befehle können oft rückgängig gemacht werden (z. B. durch ROLLBACK
), sofern Transaktionen unterstützt werden.
Kurz gesagt: DML ist das Werkzeug, mit dem du Daten in einer Datenbank lebendig hältst – also ständig anpasst, liest und veränderst.
DQL steht für Data Query Language und ist ein Teil der SQL-Sprache (Structured Query Language). Sie dient dazu, Daten aus einer Datenbank abzufragen, ohne sie zu verändern.
Nur lesend: Mit DQL werden Daten abgefragt, aber nicht eingefügt, verändert oder gelöscht.
Der zentral verwendete Befehl ist:
SELECT
Beispiel:
SELECT name, geburtsdatum FROM kunden WHERE stadt = 'Berlin';
Dieser Befehl liest die Namen und Geburtsdaten aller Kunden aus, die in Berlin wohnen – verändert aber nichts an den Daten.
Teil | Bedeutung | Hauptfunktion |
---|---|---|
DQL | Data Query Language | Daten lesen |
DML | Data Manipulation Language | Daten einfügen, ändern, löschen (INSERT , UPDATE , DELETE ) |
DDL | Data Definition Language | Tabellen und Strukturen definieren (CREATE , ALTER , DROP ) |
DCL | Data Control Language | Rechte vergeben (GRANT , REVOKE ) |
TCL | Transaction Control Language | Transaktionen steuern (COMMIT , ROLLBACK ) |
Ein INNER JOIN ist ein Begriff aus der Datenbankabfrage (SQL). Er wird verwendet, um Datensätze aus zwei (oder mehr) Tabellen zu kombinieren – und zwar nur die Datensätze, bei denen es in beiden Tabellen passende Werte gibt.
Du hast zwei Tabellen:
Tabelle: Kunden
KundenID | Name |
---|---|
1 | Anna |
2 | Bernd |
3 | Clara |
Tabelle: Bestellungen
BestellID | KundenID | Produkt |
---|---|---|
101 | 1 | Buch |
102 | 2 | Laptop |
103 | 4 | Handy |
Jetzt willst du wissen, welche Kunden Bestellungen gemacht haben. Dafür brauchst du nur die Kunden, die in beiden Tabellen vorkommen.
SELECT Kunden.Name, Bestellungen.Produkt
FROM Kunden
INNER JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID;
Name | Produkt |
---|---|
Anna | Buch |
Bernd | Laptop |
Clara hat nichts bestellt → wird nicht angezeigt.
Die Bestellung mit KundenID 4 hat keinen passenden Kunden → wird ebenfalls ignoriert.
Ein INNER JOIN zeigt nur die Datensätze, bei denen es Übereinstimmungen in beiden Tabellen gibt.
Ein expliziter Join ist eine klare, direkte Formulierung eines Joins in einer SQL-Abfrage, bei der die Join-Art (z. B. INNER JOIN
, LEFT JOIN
, RIGHT JOIN
, FULL OUTER JOIN
) ausdrücklich im SQL-Statement genannt wird.
SELECT *
FROM kunden
INNER JOIN bestellungen
ON kunden.kunden_id = bestellungen.kunden_id;
Hier sieht man deutlich:
Welche Tabellen verbunden werden (kunden
, bestellungen
)
Welche Join-Art verwendet wird (INNER JOIN
)
Welche Bedingung für den Join gilt (ON kunden.kunden_id = bestellungen.kunden_id
)
Ein impliziter Join ist die ältere Schreibweise mit einem Komma in der FROM
-Klausel, wobei die Join-Bedingung in der WHERE
-Klausel steht:
SELECT *
FROM kunden, bestellungen
WHERE kunden.kunden_id = bestellungen.kunden_id;
Diese Variante ist funktional gleich, aber weniger klar und nicht für komplexe Joins geeignet.
Lesbarer und strukturierter, vor allem bei mehreren Tabellen
Klarere Trennung von Join-Bedingungen und Filterbedingungen (ON
vs. WHERE
)
Empfohlen in moderner SQL-Programmierung
Ein impliziter Join ist eine Art, Tabellen in SQL zu verknüpfen, ohne das Schlüsselwort JOIN
explizit zu verwenden. Stattdessen wird der Join über die WHERE-Klausel ausgedrückt.
SELECT *
FROM kunden, bestellungen
WHERE kunden.kunden_id = bestellungen.kunden_id;
In diesem Beispiel werden die Tabellen kunden
und bestellungen
durch die Bedingung in der WHERE
-Klausel miteinander verknüpft.
SELECT *
FROM kunden
JOIN bestellungen ON kunden.kunden_id = bestellungen.kunden_id;
Kriterium | Impliziter Join | Expliziter Join |
---|---|---|
Syntax | Tabellen durch Komma getrennt, Verknüpfung in WHERE |
Nutzung von JOIN und ON |
Lesbarkeit | Weniger übersichtlich bei vielen Joins | Bessere Struktur und Lesbarkeit |
Fehleranfälligkeit | Höher (z. B. versehentliches Kreuzprodukt) | Weniger, da Join-Bedingungen klarer |
ANSI-92-Standard | Nicht konform | Konform |
Früher war das der Standard, aber heute wird der explizite Join empfohlen, da er lesbarer, strukturierter und weniger fehleranfällig ist – besonders bei komplexen Abfragen mit mehreren Tabellen.
Eine Materialized View (auf Deutsch: „materialisierte Sicht“) ist ein spezielles Datenbankobjekt, das das Ergebnis einer SQL-Abfrage dauerhaft speichert – im Gegensatz zu einer normalen View, die bei jeder Abfrage dynamisch berechnet wird.
Speicherung auf Festplatte: Die Daten der Abfrage werden tatsächlich gespeichert, nicht nur die Abfrage selbst.
Schnellere Abfragen: Da die Daten bereits berechnet und gespeichert sind, können Anfragen deutlich schneller beantwortet werden.
Aktualisierung notwendig: Da sich die zugrundeliegenden Daten ändern können, muss die Materialized View explizit oder automatisch aktualisiert (refreshed) werden, um aktuell zu bleiben.
Merkmal | View | Materialized View |
---|---|---|
Speicherung | Nur Abfrage, keine Daten | Abfrage und Daten gespeichert |
Performance | Langsamer bei komplexen Abfragen | Schneller, da Daten vorgerechnet |
Aktualität | Immer aktuell | Kann veraltet sein |
Aktualisierung notwendig | Nein | Ja (manuell oder automatisch) |
-- Erstellen einer Materialized View in PostgreSQL
CREATE MATERIALIZED VIEW top_customers AS
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id;
Um die Daten zu aktualisieren:
REFRESH MATERIALIZED VIEW top_customers;
Bei komplexen Aggregationen, die häufig gebraucht werden
Wenn Performance wichtiger ist als Echtzeit-Aktualität
In Data Warehouses oder Reporting-Systemen