DQL: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Die Seite wurde neu angelegt: „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…“ |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
Die '''Data Query Language (DQL)''' | Die '''Data Query Language (DQL)''' ermöglicht es, Informationen aus verschiedenen Tabellen abzufragen. Das Ergebnis ist eine Relation, die meist als Tabelle angezeigt wird. | ||
== Datenbasis == | |||
[[Datei:DQLDatenbasisERM.jpg|mini|ERM-Modell zur Datenbasis]] | |||
[[Datei:DQLDatenbasisTabellen.jpg|mini]] | |||
Basierend auf dem bereitgestellten Schema des Friseursalons ergeben sich folgende Tabelleninhalte: | |||
== | {| class="wikitable" style="float: left; margin-right: 10px;" | ||
|+ Tabelle: Salon | |||
! IdSalon !! Name | |||
|- | |||
| 1 || Friedrich List Frisuren | |||
|- | |||
| 2 || Hammer Haare | |||
|- | |||
| 3 || Kaiserschnitt | |||
|} | |||
== | {| class="wikitable" style="float: left; margin-right: 10px;" | ||
|+ Tabelle: Mitarbeiter | |||
! IdMitarbeiter !! Nachname !! Vorname !! FkSalon | |||
|- | |||
| 1 || Krause || Sabine || 1 | |||
|- | |||
| 2 || Schrotter || Claudia || 1 | |||
|- | |||
| 3 || Hermann || Markus || 1 | |||
|- | |||
| 4 || Krause || Christoph || 2 | |||
|- | |||
| 5 || Bitter || Manuel || 2 | |||
|} | |||
{| class="wikitable" | |||
|+ Tabelle: Termin | |||
! IdTermin !! Datum !! Rechnungsbetrag !! FkMitarbeiter !! FkKunde | |||
|- | |||
| 1 || 01.11.2012 || 20 || 1 || 1 | |||
|- | |||
| 2 || 11.12.2012 || 29 || 2 || 2 | |||
|- | |||
| 3 || 19.02.2013 || 77 || 2 || 3 | |||
|- | |||
| 4 || 19.02.2013 || 20 || 5 || 4 | |||
|} | |||
<div style="clear:both;"></div> | |||
=== | == Grundlegende Abfragen == | ||
=== Einfache Abfrage (Projektion) === | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT * FROM Mitarbeiter; | |||
SELECT | |||
FROM Mitarbeiter; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! IdMitarbeiter !! Nachname !! Vorname !! FkSalon | |||
|- | |||
| 1 || Krause || Sabine || 1 | |||
|- | |||
| 2 || Schrotter || Claudia || 1 | |||
|- | |||
| 3 || Hermann || Markus || 1 | |||
|- | |||
| 4 || Krause || Christoph || 2 | |||
|- | |||
| 5 || Bitter || Manuel || 2 | |||
|} | |||
=== | === Alias und Spaltenauswahl === | ||
<syntaxhighlight lang="sql"> | |||
SELECT IdMitarbeiter AS Mitarbeiternr, Nachname FROM Mitarbeiter; | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! Mitarbeiternr !! Nachname | |||
|- | |||
| 1 || Krause | |||
|- | |||
| 2 || Schrotter | |||
|- | |||
| 3 || Hermann | |||
|- | |||
| 4 || Krause | |||
|- | |||
| 5 || Bitter | |||
|} | |||
== Filtern von Daten (WHERE) == | |||
== Filtern | |||
=== Einfacher Filter === | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT Vorname, Nachname FROM Mitarbeiter WHERE Nachname = 'Krause'; | |||
SELECT | |||
WHERE | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! Vorname !! Nachname | |||
|- | |||
| Sabine || Krause | |||
|- | |||
| Christoph || Krause | |||
|} | |||
=== | === Komplexer Filter === | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT | SELECT Vorname, Nachname FROM Mitarbeiter | ||
WHERE (Nachname = 'Krause' OR Vorname = 'Manuel') AND IdMitarbeiter <> 1; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' | |||
- | {| class="wikitable" | ||
! Vorname !! Nachname | |||
|- | |||
| Christoph || Krause | |||
| Manuel || Bitter | |||
|} | |||
== Tabellen verknüpfen (JOINs) == | == Tabellen verknüpfen (JOINs) == | ||
Hier werden die Tabellen `Salon` (Tabelle A) und `Mitarbeiter` (Tabelle B) verknüpft. | |||
=== Inner Join (Schnittmenge) === | |||
<html> | |||
<svg width="200" height="120" viewBox="0 0 200 120"> | |||
<circle cx="70" cy="60" r="50" stroke="black" stroke-width="2" fill="white" /> | |||
<circle cx="130" cy="60" r="50" stroke="black" stroke-width="2" fill="white" /> | |||
<clipPath id="inner"> | |||
<circle cx="70" cy="60" r="50" /> | |||
</clipPath> | |||
<circle cx="130" cy="60" r="50" fill="#3498db" clip-path="url(#inner)" /> | |||
<text x="45" y="65" font-size="12">A</text> | |||
<text x="145" y="65" font-size="12">B</text> | |||
</svg> | |||
</html> | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT Salon.Name, Mitarbeiter.Nachname | SELECT Salon.Name, Mitarbeiter.Nachname | ||
FROM Salon | FROM Salon INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | ||
INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' (Salon 3 erscheint nicht, da kein Mitarbeiter zugeordnet ist) | |||
{| class="wikitable" | |||
! Name !! Nachname | |||
|- | |||
| Friedrich List Frisuren || Krause | |||
|- | |||
| Friedrich List Frisuren || Schrotter | |||
|- | |||
| Friedrich List Frisuren || Hermann | |||
|- | |||
| Hammer Haare || Krause | |||
|- | |||
| Hammer Haare || Bitter | |||
|} | |||
=== | === Left Join (Inklusive linker Tabelle) === | ||
<html> | |||
<svg width="200" height="120" viewBox="0 0 200 120"> | |||
<circle cx="130" cy="60" r="50" stroke="black" stroke-width="2" fill="white" /> | |||
<circle cx="70" cy="60" r="50" stroke="black" stroke-width="2" fill="#3498db" /> | |||
<text x="45" y="65" font-size="12">A</text> | |||
<text x="145" y="65" font-size="12">B</text> | |||
</svg> | |||
</html> | |||
--- | <syntaxhighlight lang="sql"> | ||
SELECT Salon.Name, Mitarbeiter.Nachname | |||
FROM Salon LEFT JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | |||
</syntaxhighlight> | |||
'''Ergebnis:''' (Salon 3 wird mit NULL aufgeführt) | |||
{| class="wikitable" | |||
! Name !! Nachname | |||
|- | |||
| Friedrich List Frisuren || Krause | |||
|- | |||
| Friedrich List Frisuren || Schrotter | |||
|- | |||
| Friedrich List Frisuren || Hermann | |||
|- | |||
| Hammer Haare || Krause | |||
|- | |||
| Hammer Haare || Bitter | |||
|- | |||
| Kaiserschnitt || ''NULL'' | |||
|} | |||
=== Right Join (Inklusive rechter Tabelle) === | |||
<html> | |||
<svg width="200" height="120" viewBox="0 0 200 120"> | |||
<circle cx="70" cy="60" r="50" stroke="black" stroke-width="2" fill="white" /> | |||
<circle cx="130" cy="60" r="50" stroke="black" stroke-width="2" fill="#3498db" /> | |||
<text x="45" y="65" font-size="12">A</text> | |||
> | <text x="145" y="65" font-size="12">B</text> | ||
</svg> | |||
</html> | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT Mitarbeiter.Nachname | SELECT Salon.Name, Mitarbeiter.Nachname | ||
FROM Mitarbeiter | FROM Salon RIGHT JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Gruppierung und Aggregate == | |||
== | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT SUM(Rechnungsbetrag) AS Umsatz, Mitarbeiter.Nachname | |||
SELECT | |||
FROM Termin | FROM Termin | ||
INNER JOIN Mitarbeiter ON Termin.FKMitarbeiter = Mitarbeiter.IdMitarbeiter | |||
GROUP BY Mitarbeiter.IdMitarbeiter | |||
HAVING Umsatz > 100; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Ergebnis:''' | |||
{| class="wikitable" | |||
! Umsatz !! Mitarbeiter | |||
{ | |||
! | |||
|- | |- | ||
| | | 106 || Schrotter | ||
|} | |} | ||
''(Berechnung: Claudia Schrotter [ID 2] hatte Termine über 29 und 77 Euro.)'' | |||
[[Kategorie:Datenbanken]] | [[Kategorie:Datenbanken]] | ||
[[Kategorie:FI_I_SDM]] | [[Kategorie:FI_I_SDM]] | ||
[[Kategorie:FI_I_TP2]] | [[Kategorie:FI_I_TP2]] | ||
Version vom 26. Februar 2026, 14:18 Uhr
Die Data Query Language (DQL) ermöglicht es, Informationen aus verschiedenen Tabellen abzufragen. Das Ergebnis ist eine Relation, die meist als Tabelle angezeigt wird.
Datenbasis


Basierend auf dem bereitgestellten Schema des Friseursalons ergeben sich folgende Tabelleninhalte:
| IdSalon | Name |
|---|---|
| 1 | Friedrich List Frisuren |
| 2 | Hammer Haare |
| 3 | Kaiserschnitt |
| IdMitarbeiter | Nachname | Vorname | FkSalon |
|---|---|---|---|
| 1 | Krause | Sabine | 1 |
| 2 | Schrotter | Claudia | 1 |
| 3 | Hermann | Markus | 1 |
| 4 | Krause | Christoph | 2 |
| 5 | Bitter | Manuel | 2 |
| IdTermin | Datum | Rechnungsbetrag | FkMitarbeiter | FkKunde |
|---|---|---|---|---|
| 1 | 01.11.2012 | 20 | 1 | 1 |
| 2 | 11.12.2012 | 29 | 2 | 2 |
| 3 | 19.02.2013 | 77 | 2 | 3 |
| 4 | 19.02.2013 | 20 | 5 | 4 |
Grundlegende Abfragen
Einfache Abfrage (Projektion)
SELECT * FROM Mitarbeiter;
Ergebnis:
| IdMitarbeiter | Nachname | Vorname | FkSalon |
|---|---|---|---|
| 1 | Krause | Sabine | 1 |
| 2 | Schrotter | Claudia | 1 |
| 3 | Hermann | Markus | 1 |
| 4 | Krause | Christoph | 2 |
| 5 | Bitter | Manuel | 2 |
Alias und Spaltenauswahl
SELECT IdMitarbeiter AS Mitarbeiternr, Nachname FROM Mitarbeiter;
Ergebnis:
| Mitarbeiternr | Nachname |
|---|---|
| 1 | Krause |
| 2 | Schrotter |
| 3 | Hermann |
| 4 | Krause |
| 5 | Bitter |
Filtern von Daten (WHERE)
Einfacher Filter
SELECT Vorname, Nachname FROM Mitarbeiter WHERE Nachname = 'Krause';
Ergebnis:
| Vorname | Nachname |
|---|---|
| Sabine | Krause |
| Christoph | Krause |
Komplexer Filter
SELECT Vorname, Nachname FROM Mitarbeiter
WHERE (Nachname = 'Krause' OR Vorname = 'Manuel') AND IdMitarbeiter <> 1;
Ergebnis:
| Vorname | Nachname | ||
|---|---|---|---|
| Christoph | Krause | Manuel | Bitter |
Tabellen verknüpfen (JOINs)
Hier werden die Tabellen `Salon` (Tabelle A) und `Mitarbeiter` (Tabelle B) verknüpft.
Inner Join (Schnittmenge)
SELECT Salon.Name, Mitarbeiter.Nachname
FROM Salon INNER JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon;
Ergebnis: (Salon 3 erscheint nicht, da kein Mitarbeiter zugeordnet ist)
| Name | Nachname |
|---|---|
| Friedrich List Frisuren | Krause |
| Friedrich List Frisuren | Schrotter |
| Friedrich List Frisuren | Hermann |
| Hammer Haare | Krause |
| Hammer Haare | Bitter |
Left Join (Inklusive linker Tabelle)
SELECT Salon.Name, Mitarbeiter.Nachname
FROM Salon LEFT JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon;
Ergebnis: (Salon 3 wird mit NULL aufgeführt)
| Name | Nachname |
|---|---|
| Friedrich List Frisuren | Krause |
| Friedrich List Frisuren | Schrotter |
| Friedrich List Frisuren | Hermann |
| Hammer Haare | Krause |
| Hammer Haare | Bitter |
| Kaiserschnitt | NULL |
Right Join (Inklusive rechter Tabelle)
SELECT Salon.Name, Mitarbeiter.Nachname
FROM Salon RIGHT JOIN Mitarbeiter ON Salon.IdSalon = Mitarbeiter.FKSalon;
Gruppierung und Aggregate
SELECT SUM(Rechnungsbetrag) AS Umsatz, Mitarbeiter.Nachname
FROM Termin
INNER JOIN Mitarbeiter ON Termin.FKMitarbeiter = Mitarbeiter.IdMitarbeiter
GROUP BY Mitarbeiter.IdMitarbeiter
HAVING Umsatz > 100;
Ergebnis:
| Umsatz | Mitarbeiter |
|---|---|
| 106 | Schrotter |
(Berechnung: Claudia Schrotter [ID 2] hatte Termine über 29 und 77 Euro.)