DQL
Die Data Query Language (DQL) ist der Teilbereich von SQL, der zur Abfrage und Zusammenstellung von Informationen aus Datenbanktabellen dient. Das Ergebnis einer DQL-Abfrage ist eine Relation, die in der Regel als temporäre Tabelle dargestellt wird.
DQL-Abfragen basieren auf den Operationen der relationalen Algebra (Selektion, Projektion, Join etc.).
Datenbasis & Modellierung
Um komplexe Abfragen zu verstehen, ist die Kenntnis des zugrundeliegenden Schemas (ER-Modell) notwendig.
Grundstruktur einer Abfrage
Die Basis jeder Abfrage besteht aus der Auswahl der Spalten (`SELECT`) und der Festlegung der Datenquelle (`FROM`).
Auswahl (SELECT) und Alias (AS)
Mit `SELECT` werden die gewünschten Spalten definiert. Mehrere Spalten werden durch Kommata getrennt.
- `*`: Wählt alle Spalten einer Tabelle aus.
- `AS`: Definiert einen Alias-Namen für eine Spalte oder Tabelle (erhöht die Lesbarkeit).
-- Beispiel mit Spaltenauswahl und Alias
SELECT Nachname AS Mitarbeitername, IdMitarbeiter
FROM Mitarbeiter;
Datenherkunft (FROM)
Hinter `FROM` werden die betroffenen Tabellen gelistet. Bei mehreren Tabellen müssen Spaltennamen eindeutig durch Voranstellen des Tabellennamens (`Tabellenname.Spaltenname`) identifiziert werden.
---
Filtern und Sortieren
WHERE-Klausel (Filter)
Die `WHERE`-Klausel schränkt die Ergebnismenge ein. Nur Datensätze, die die Bedingung erfüllen (boolesche Logik), werden angezeigt.
- Operatoren: `=`, `<>`, `<`, `>`, `BETWEEN`, `AND`, `OR`, `NOT`.
- NULL-Werte: Da `NULL` kein Wert, sondern ein Zustand ist, erfolgt die Prüfung mit `IS NULL` oder `IS NOT NULL`.
-- Filter mit komplexer Bedingung und NULL-Prüfung
SELECT * FROM Termin
WHERE (Rechnungsbetrag BETWEEN 50 AND 150)
AND Datum IS NOT NULL;
ORDER BY & LIMIT
- ORDER BY: Sortiert die Ausgabe nach einer oder mehreren Spalten (`ASC` für aufsteigend, `DESC` für absteigend).
- LIMIT: (In MySQL/PostgreSQL) Begrenzt die Anzahl der ausgegebenen Zeilen (Top-N-Abfrage).
SELECT * FROM Warenkorb
ORDER BY datum DESC
LIMIT 10;
---
Tabellen verknüpfen (JOINs)
JOINs ermöglichen es, Daten aus unterschiedlichen Tabellen über Fremdschlüsselbeziehungen zusammenzuführen.
INNER JOIN
Gibt nur die Datensätze zurück, bei denen in beiden Tabellen eine Übereinstimmung der Verknüpfungsbedingung vorliegt.
SELECT Salon.Name, Mitarbeiter.Nachname
FROM Salon
INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon;
LEFT / RIGHT OUTER JOIN
- LEFT JOIN: Alle Datensätze der linken Tabelle werden angezeigt. Gibt es keine Entsprechung in der rechten Tabelle, werden die Spalten mit `NULL` aufgefüllt.
- RIGHT JOIN: Funktioniert analog, jedoch werden alle Datensätze der rechten Tabelle garantiert angezeigt.
---
Gruppierung und Aggregate
Mit `GROUP BY` werden Datensätze mit gleichen Werten in bestimmten Spalten zusammengefasst. Dies wird meist mit Aggregatfunktionen genutzt:
- `COUNT()`: Anzahl der Datensätze
- `SUM()`: Summe
- `AVG()`: Mittelwert
- `MIN()` / `MAX()`: Extremwerte
> Wichtig: Um auf aggregierte Werte zu filtern, muss das Schlüsselwort HAVING anstelle von `WHERE` verwendet werden.
SELECT Mitarbeiter.Nachname, SUM(Termin.Rechnungsbetrag) AS Umsatz
FROM Mitarbeiter
INNER JOIN Termin ON Mitarbeiter.MitarbeiterID = Termin.FKMitarbeiter
GROUP BY Mitarbeiter.MitarbeiterID
HAVING Umsatz > 100;
---
Fortgeschrittene Techniken
Unterabfragen (Subqueries)
Eine Abfrage kann innerhalb einer anderen Abfrage stehen. Sie muss in Klammern gesetzt werden.
-- Termine finden, deren Betrag unter dem Durchschnitt liegt
SELECT TerminID, Rechnungsbetrag
FROM Termin
WHERE Rechnungsbetrag < (SELECT AVG(Rechnungsbetrag) FROM Termin);
UNION
Vereint die Ergebnismengen zweier `SELECT`-Abfragen. Voraussetzungen: Gleiche Anzahl an Spalten und kompatible Datentypen.
SELECT nachname FROM Mitarbeiter
UNION
SELECT nachname FROM Kunde;
---
Logische Verarbeitungsreihenfolge
Für die Fehleranalyse ist es wichtig zu wissen, in welcher Reihenfolge das DBMS die Befehle intern abarbeitet:
{# class="wikitable" ! Reihenfolge !! Klausel !! Beschreibung |- | 1 || FROM || Tabellen und JOINs werden geladen. |- | 2 || WHERE || Zeilenweise Filterung der Rohdaten. |- | 3 || GROUP BY || Zusammenfassen von Zeilen zu Gruppen. |- | 4 || HAVING || Filterung der gebildeten Gruppen. |- | 5 || SELECT || Auswahl der Spalten und Berechnung von Aggregaten. |- | 6 || ORDER BY || Sortierung der fertigen Ergebnismenge. |- | 7 || LIMIT || Begrenzung der Ausgabeanzahl. |}