DQL: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
{{Seitenüberschrift|Data Query Language (DQL)}} | |||
== Einführung == | == Einführung == | ||
Die '''Data Query Language''' (kurz '''DQL''') der [[SQL|Structured Query Language (SQL)]] ermöglicht es, mittels Abfragen Informationen aus unterschiedlichen Tabellen zusammenzutragen. Das Ergebnis einer Abfrage ist eine [[Relation]] und kann oft auch wie eine Tabelle angezeigt, bearbeitet und weiterverwendet werden. Abfragen basieren auf den Operationen der '''relationalen Algebra'''. | Die '''Data Query Language''' (kurz '''DQL''') der [[SQL|Structured Query Language (SQL)]] ermöglicht es, mittels Abfragen Informationen aus unterschiedlichen Tabellen zusammenzutragen. Das Ergebnis einer Abfrage ist eine [[Relation]] und kann oft auch wie eine Tabelle angezeigt, bearbeitet und weiterverwendet werden. Abfragen basieren auf den Operationen der '''relationalen Algebra'''. | ||
| Zeile 15: | Zeile 17: | ||
=== Alias (AS) === | === Alias (AS) === | ||
Nach jeder Spalte kann mit dem Schlüsselwort '''AS''' ein neuer Name (Alias) für die Anzeige festgelegt werden. | Nach jeder Spalte kann mit dem Schlüsselwort '''AS''' ein neuer Name (Alias) für die Anzeige festgelegt werden. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT | SELECT Nachname AS Mitarbeitername, IdMitarbeiter FROM Mitarbeiter; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Zeile 23: | Zeile 24: | ||
Nach dem Schlüsselwort '''FROM''' werden alle Tabellen angegeben, die von der Abfrage betroffen sind. Es muss mindestens eine Tabelle angegeben werden. | Nach dem Schlüsselwort '''FROM''' werden alle Tabellen angegeben, die von der Abfrage betroffen sind. Es muss mindestens eine Tabelle angegeben werden. | ||
'''Einfache Abfrage:''' | '''Einfache Abfrage mit Spaltenauswahl:''' | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT | SELECT nachname, vorname FROM Mitarbeiter; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' | '''Ergebnis:''' | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! nachname !! vorname | ||
|- | |- | ||
| Krause || Sabine | |||
|- | |- | ||
| Schrotter || Claudia | |||
|- | |- | ||
| Hermann || Markus | |||
|- | |- | ||
| Krause || Christoph | |||
|- | |- | ||
| Bitter || Manuel | |||
|} | |} | ||
== Filter (WHERE) == | == Filter (WHERE) == | ||
Ein Filter schränkt die Ergebnismenge auf Datensätze ein, für die eine Aussage im Sinne der '''booleschen Algebra''' wahr ist. Er wird durch '''WHERE''' eingeleitet. | Ein Filter schränkt die Ergebnismenge auf Datensätze ein, für die eine Aussage im Sinne der '''booleschen Algebra''' wahr ist. Er wird durch '''WHERE''' eingeleitet. Neben den Operatoren `<>` und `=` kann auch '''BETWEEN''' eingesetzt werden, um Ober- und Untergrenze eines Filters gleichzeitig anzugeben. | ||
'''Beispiel komplexer Filter:''' | '''Beispiel komplexer Filter:''' | ||
| Zeile 65: | Zeile 63: | ||
=== IS NULL === | === IS NULL === | ||
SQL nutzt '''NULL-Werte''' für fehlende | SQL nutzt '''NULL-Werte''' für fehlende Informationen. Die Prüfung erfolgt mit `IS NULL` oder `IS NOT NULL`. Dies ist besonders bei äußeren Verbünden (Outer Joins) wichtig. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT * FROM Termin WHERE Datum IS NOT NULL; | SELECT * FROM Termin WHERE Datum IS NOT NULL; | ||
| Zeile 82: | Zeile 80: | ||
=== Top-N-Zeilen (LIMIT) === | === Top-N-Zeilen (LIMIT) === | ||
Bei MySQL und PostgreSQL wird die Ergebnismenge durch '''LIMIT''' beschränkt, um z. B. nur die | Bei MySQL und PostgreSQL wird die Ergebnismenge durch '''LIMIT''' beschränkt, um z. B. nur die aktuellsten Einträge zu erhalten. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT * FROM Warenkorbposition ORDER BY Datum DESC LIMIT 10; | SELECT * FROM Warenkorbposition ORDER BY Datum DESC LIMIT 10; | ||
| Zeile 88: | Zeile 86: | ||
== Tabellen verknüpfen (JOINs) == | == Tabellen verknüpfen (JOINs) == | ||
Werden Informationen | Werden Informationen unterschiedlicher Tabellen zusammengefügt, müssen diese über Schlüsselfelder verbunden werden. | ||
=== Innerer natürlicher Verbund (INNER JOIN) === | === Innerer natürlicher Verbund (INNER JOIN) === | ||
| Zeile 106: | Zeile 104: | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT Salon.Name AS Salonname, Mitarbeiter.Nachname | SELECT Salon.IdSalon, Salon.Name AS Salonname, Mitarbeiter.Nachname | ||
FROM Salon INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | FROM Salon | ||
INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' (Salon 3 "Kaiserschnitt" erscheint nicht, da ihm kein Mitarbeiter zugeordnet ist) | |||
{| class="wikitable" | |||
! IdSalon !! Salonname !! Nachname | |||
|- | |||
| 1 || Friedrich List Frisuren || Krause | |||
|- | |||
| 1 || Friedrich List Frisuren || Schrotter | |||
|- | |||
| 1 || Friedrich List Frisuren || Hermann | |||
|- | |||
| 2 || Hammer Haare || Krause | |||
|- | |||
| 2 || Hammer Haare || Bitter | |||
|} | |||
=== Linker äußerer Verbund (LEFT JOIN) === | === Linker äußerer Verbund (LEFT JOIN) === | ||
Alle Datensätze der linken Tabelle werden angezeigt | Alle Datensätze der linken Tabelle (Tab. A) werden angezeigt. Die der rechten Tabelle nur bei Übereinstimmung, sonst `NULL`. | ||
<html> | <html> | ||
<svg width="200" height="120" viewBox="0 0 200 120"> | <svg width="200" height="120" viewBox="0 0 200 120"> | ||
| Zeile 120: | Zeile 133: | ||
</svg> | </svg> | ||
</html> | </html> | ||
<syntaxhighlight lang="sql"> | |||
SELECT Salon.Name AS Salonname, Mitarbeiter.Nachname | |||
FROM Salon | |||
LEFT JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! Salonname !! Nachname | |||
|- | |||
| Friedrich List Frisuren || Krause | |||
|- | |||
| Friedrich List Frisuren || Schrotter | |||
|- | |||
| Friedrich List Frisuren || Hermann | |||
|- | |||
| Hammer Haare || Krause | |||
|- | |||
| Hammer Haare || Bitter | |||
|- | |||
| Kaiserschnitt || ''NULL'' | |||
|} | |||
=== Rechter äußerer Verbund (RIGHT JOIN) === | === Rechter äußerer Verbund (RIGHT JOIN) === | ||
Alle Einträge der rechten Tabelle werden selektiert, auch | Alle Einträge der rechten Tabelle (Tab. B) werden selektiert, auch wenn keine Verbindung zur linken besteht. | ||
<html> | <html> | ||
<svg width="200" height="120" viewBox="0 0 200 120"> | <svg width="200" height="120" viewBox="0 0 200 120"> | ||
| Zeile 131: | Zeile 166: | ||
</svg> | </svg> | ||
</html> | </html> | ||
<syntaxhighlight lang="sql"> | |||
-- Hier: Alle Salons (Rechts) anzeigen, auch wenn keine Mitarbeiter (Links) zugeordnet sind | |||
SELECT Mitarbeiter.Nachname, Salon.Name AS Salonname | |||
FROM Mitarbeiter | |||
RIGHT JOIN Salon ON Mitarbeiter.FKSalon = Salon.IdSalon; | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! Nachname !! Salonname | |||
|- | |||
| Krause || Friedrich List Frisuren | |||
|- | |||
| Schrotter || Friedrich List Frisuren | |||
|- | |||
| Hermann || Friedrich List Frisuren | |||
|- | |||
| Krause || Hammer Haare | |||
|- | |||
| Bitter || Hammer Haare | |||
|- | |||
| ''NULL'' || Kaiserschnitt | |||
|} | |||
== Gruppierung und Aggregat-Funktionen == | == Gruppierung und Aggregat-Funktionen == | ||
Mit '''GROUP BY''' werden Datensätze aggregiert. | Mit '''GROUP BY''' werden Datensätze aggregiert (z. B. `COUNT`, `SUM`, `AVG`). Möchte man die Datensätze in einer gruppierten Abfrage filtern, muss '''HAVING''' anstatt `WHERE` verwendet werden. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT SUM(Rechnungsbetrag) AS Umsatz, Mitarbeiter.Nachname | SELECT SUM(Termin.Rechnungsbetrag) AS Umsatz, Mitarbeiter.Nachname AS Mitarbeiter | ||
FROM | FROM TERMIN | ||
GROUP BY Mitarbeiter.IdMitarbeiter HAVING Umsatz > 100; | INNER JOIN Mitarbeiter ON Termin.FKMitarbeiter = Mitarbeiter.IdMitarbeiter | ||
GROUP BY Mitarbeiter.IdMitarbeiter | |||
HAVING Umsatz > 100; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' 106 | Schrotter | '''Ergebnis:''' | ||
{| class="wikitable" | |||
! Umsatz !! Mitarbeiter | |||
|- | |||
| 106 || Schrotter | |||
|} | |||
== Unterabfragen (Verschachtelt) == | == Unterabfragen (Verschachtelt) == | ||
Unterabfragen liefern | Unterabfragen werden in Klammern gesetzt und liefern Werte für die Hauptabfrage. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
-- Termine mit unterdurchschnittlichem Umsatz | -- Termine mit unterdurchschnittlichem Umsatz | ||
| Zeile 153: | Zeile 216: | ||
== UNION == | == UNION == | ||
Mit '''UNION''' werden zwei Relationen vereint | Mit '''UNION''' werden zwei Relationen vereint. Die Spalten müssen vom gleichen Typ sein. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT nachname FROM Mitarbeiter UNION SELECT nachname FROM Kunde; | SELECT Mitarbeiter.nachname FROM Mitarbeiter | ||
UNION | |||
SELECT Kunde.nachname FROM Kunde; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Reihenfolge der Abarbeitung == | == Reihenfolge der Abarbeitung == | ||
Das DBMS arbeitet eine DQL-Abfrage logisch | Das DBMS arbeitet eine DQL-Abfrage logisch in dieser Reihenfolge ab: | ||
# '''FROM''' (inkl. JOINs) | |||
# '''WHERE''' | |||
# '''GROUP BY''' | |||
# '''HAVING''' | |||
# '''SELECT''' | |||
# '''ORDER BY''' | |||
# '''LIMIT''' | |||
[[Kategorie:Datenbanken]] | [[Kategorie:Datenbanken]] | ||
[[Kategorie:FI_I_SDM]] | [[Kategorie:FI_I_SDM]] | ||
[[Kategorie:FI_I_TP2]] | [[Kategorie:FI_I_TP2]] | ||