DQL: Unterschied zwischen den Versionen
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]] | ||