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 |
PDO steht für PHP Data Objects und ist eine Datenbank-Abstraktionsschicht in PHP. Es handelt sich um eine objektorientierte Schnittstelle, mit der du auf verschiedene Datenbanken zugreifen kannst – z. B. MySQL, PostgreSQL, SQLite – ohne den Datenbankspezifischen Code stark ändern zu müssen.
✅ Einheitliche API:
Egal ob MySQL, SQLite oder PostgreSQL – du benutzt denselben Code-Stil.
✅ Prepared Statements:
Sicherer Schutz vor SQL-Injektionen durch gebundene Parameter:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $userId]);
✅ Transaktionen:
PDO unterstützt Transaktionen (wichtig z. B. bei Bankbuchungen).
✅ Fehlerbehandlung per Exception:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
✅ Flexibler Datenbankwechsel:
Möchtest du von MySQL auf PostgreSQL wechseln? Meist nur der DSN-String und Treiber müssen geändert werden.
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';
try {
$pdo = new PDO($dsn, $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Verbindung erfolgreich!";
} catch (PDOException $e) {
echo "Verbindung fehlgeschlagen: " . $e->getMessage();
}
PDO ist der empfohlene Weg, um in modernen PHP-Anwendungen mit Datenbanken zu arbeiten – besonders wegen der Sicherheit und Flexibilität.
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
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 Entity Manager ist ein zentraler Bestandteil von ORM-Frameworks (Object-Relational Mapping), vor allem im Zusammenhang mit Java (JPA – Java Persistence API), aber auch in anderen Sprachen wie PHP (Doctrine ORM).
Hier ist eine verständliche Erklärung:
Ein Entity Manager ist eine Komponente, die sich um die Verwaltung von Datenbank-Entities (also Objekten/Datensätzen) kümmert. Er bildet die Schnittstelle zwischen der objektorientierten Welt des Codes und der relationalen Welt der Datenbank.
Persistieren (Speichern):
Finden/Laden:
Holt ein Objekt anhand seiner ID oder anderer Kriterien.
Beispiel: $entityManager->find(User::class, 1);
Aktualisieren:
Änderungen an einem Objekt werden verfolgt und in die Datenbank geschrieben (z. B. beim flush()
).
Entfernen/Löschen:
Löscht ein Objekt aus der Datenbank.
Beispiel: $entityManager->remove($user);
Transaktionen verwalten:
Beginnt, commitet oder rollt Transaktionen zurück.
Query-Handling:
Führt eigene Abfragen aus, oft mit DQL (Doctrine Query Language) oder JPQL.
Der Entity Manager verwaltet den „Zustand“ von Objekten:
managed (verfolgt Änderungen),
detached (nicht mehr verwaltet),
removed (zum Löschen markiert),
new (noch nicht gespeichert).
$user = new User();
$user->setName('Max Mustermann');
$entityManager->persist($user); // Zum Speichern vormerken
$entityManager->flush(); // Tatsächlich in DB schreiben
Der Entity Manager ist der zentrale Ansprechpartner, wenn es darum geht, mit Datenbankobjekten zu arbeiten – lesen, schreiben, ändern, löschen. Er abstrahiert die SQL-Ebene und macht die Datenbankarbeit objektorientiert steuerbar.
Doctrine DBAL (Database Abstraction Layer) ist eine PHP-Bibliothek, die eine Abstraktionsschicht für den Datenbankzugriff bietet. Sie ist ein Teil von Doctrine, einem weit verbreiteten ORM-Projekt (Object-Relational Mapping), aber kann unabhängig vom ORM verwendet werden.
Doctrine DBAL bietet eine einheitliche API, um mit verschiedenen Datenbanken (wie MySQL, PostgreSQL, SQLite usw.) zu kommunizieren, ohne direkt SQL für die jeweilige Datenbank schreiben zu müssen.
Verbindungsaufbau zu Datenbanken über Konfigurationsarrays.
Unterstützung für Verbindungs-Pooling, Transaktionen usw.
Dynamisches Erstellen von SQL-Abfragen über eine objektorientierte API:
$qb = $conn->createQueryBuilder();
$qb->select('u.id', 'u.name')
->from('users', 'u')
->where('u.age > :age')
->setParameter('age', 18);
$stmt = $qb->executeQuery();
Datenbankunabhängigkeit:
Die gleichen Funktionen und Abfragen funktionieren mit verschiedenen DBMS, z. B. MySQL, PostgreSQL, SQLite.
Schema-Management:
Werkzeuge zum Erstellen, Ändern und Vergleichen von Datenbankschemata.
Nützlich für Migrationen.
Datentyp-Konvertierung:
Konvertiert Daten zwischen PHP und dem nativen Datenbankformat.
use Doctrine\DBAL\DriverManager;
$conn = DriverManager::getConnection([
'dbname' => 'test',
'user' => 'root',
'password' => '',
'host' => 'localhost',
'driver' => 'pdo_mysql',
]);
$result = $conn->fetchAllAssociative('SELECT * FROM users');
Du verwendest DBAL ohne ORM, wenn:
Du mehr Kontrolle über SQL willst.
Dein Projekt keine komplexe Objekt-Mapping-Logik braucht.
Du bereits vorhandene SQL-Strukturen nutzen musst.
Doctrine DBAL ist ein mächtiges Werkzeug für sauberen, portablen und sicheren Datenbankzugriff in PHP, ohne sich auf ein vollständiges ORM einlassen zu müssen. Es liegt genau zwischen direktem PDO-Zugriff und einem vollwertigen ORM wie Doctrine ORM.
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
Das Flask Framework ist ein beliebtes, leichtgewichtiges Webframework für die Programmiersprache Python. Es wird häufig für die Entwicklung von Webanwendungen und APIs verwendet und zeichnet sich durch seine Einfachheit und Flexibilität aus. Flask ist ein sogenanntes Micro-Framework, da es nur die grundlegenden Funktionen für die Webentwicklung bietet und keine unnötigen Zusatzfunktionen oder Bibliotheken enthält. Dadurch bleibt es schlank und anpassungsfähig.
Flask-SQLAlchemy
oder Flask-Login
hinzugefügt werden.Flask eignet sich besonders gut für:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
Im Vergleich zu Django (einem umfassenderen Python-Webframework) ist Flask weniger umfangreich, bietet jedoch mehr Freiheit. Während Django eine „Batteries included“-Philosophie verfolgt und viele Funktionen bereits integriert hat, ist Flask ideal, wenn du nur das benötigst, was du selbst einbauen möchtest.
Strapi ist ein Headless CMS (Content Management System), das auf JavaScript basiert und speziell für Entwickler entwickelt wurde. Es bietet eine flexible und offene Lösung zur Verwaltung von Inhalten und APIs. Hier sind die wichtigsten Merkmale von Strapi: