Wie lese ich dieses Query?

2 Antworten

Hier ist es tatsächlich besser, nicht nur von oben nach unten zu lesen. Das macht das Verständnis besser.

from orders

WIr sagen, dass wir Daten aus der Tabelle orders lesen möchten

join customers c on orders.CustomerID = c.CustomerID

Hier passiert schon etwas mehr. Mittels eines Joins ziehen wir eine Weitere Tabelle als Datengrundlage hinzu. Es gibt verschiedene Arten von Joins, der Standard (so wie hier) wäre ein Inner Join.

Die Tabellen orders und customers werden also quasi nebeneinander gestellt.

join customers c

hier sagen wir, dass wir statt customers als Abkürzung einfach c schreiben wollen

on orders.CustomerID = c.CustomerID

Wenn wir nun orders und customers nebeneinander stellen, dann werden wir feststellen, dass wir bei einem laufenden Geschäft mehr Orders als Customers haben. Jeder Kunde bestellt ja idealerweise mehrmals. Die Tabelle orders ist also länger als die Tabelle Customers. Die andere Frage ist, welche Einträge in orders denn mit welchen Einträgen in customers korellieren. Und das definieren wir in dieser ON clause. In jeder Order steht, welchem Customer sie gehört. Daher können wir die ID des Customers mit der der CustomerID der Order verknüpfen.

Wir haben jetzt also beide Tabellen quasi nebeneinander, in einer neuen, zusammenaddierten Tabelle. Nun müssen wir aber auch noch den INNER JOIN besprechen. DIese zusammenaddierte Tabelle bildet die Schnittmenge der zusammengehörigen (siehe ON clause) Einträge.

Genau gesagt bedeutet es, dass in dieser gejointen Tabelle:

  • keine Customers sind, die keine Order haben bzw.
  • keine Orders sind, zu denen kein Customer existiert.
select c.CustomerName, count(orders.OrderID) as count

Wir sind natürlich nur an bestimmten Daten interessiert und nicht an der gesamten gejointen Tabelle. Und wie wir vorher gesehen haben, haben wir definiert, dass wir für customers einfach nur c schreiben wollen. Wir selektieren also aus customers schon mal die Spalte Customer Name.

Jetzt erinnern wir uns noch mal daran, dass die orders Tabelle länger ist, als die customers Tabelle, weil ein Customer ja mehrere Orders haben kann.

group by c.CustomerID

Hiermit gruppieren wir die Werte nach der CustomerID. Das bedeutet, dass alle Werte mich gleicher CustomerID sozusagen in eine Gruppe gesteckt werden.

count(orders.OrderID) as count

Das nehmen wir auch noch mal auseinander

as count

mit AS benennen wir diese selektierte Spalte. Diese heißt nun count

count(orders.OrderID)

count ist eine sogenannte Aggretagfunktion. Sie zählt, wieviele Elemente eine Spalte hat. Hier zählen wir die OrderIDs. OHNE das Group By würden wir hier die Gesamtzahl ALLER Orders bekommen. Das wollen wir aber nicht. Durch das Groupen nach c.CustomerID bekommen wir den gezählten Wert pro Customer.

Hier noch mal zurück zum Select:

select c.CustomerName, count(orders.OrderID) as count

Wir selektieren den Namen des customers, sowie die Anzahl der Bestellungen dieses Customers

Fehlt noch:

having count > 1

HAVING ist eine EInschränkung, die nach einem group by gesetzt werden kann und die im Gegensatz zu einem WHERE nur unsere gewünschte Gruppe betrifft.

Hier wollen wir also, dass count > 1 sein soll. Und gemeint ist mit count eben dies:

as count

wo wir definiert hatten, dass wir die Anzahl der Orders eines Customers einfach count nennen.

Der Name ist mMn. etwas dümmlich gewählt, da er Anfänger oft verwirrt, weil es ja auch die count() funktion gibt. Ich hätte das Query insgesamt also eher so geschrieben:

SELECT c.CustomerName as Kundenname, count(o.OrderID) as Kundenbestellungen
FROM orders o
JOIN customers c ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID
HAVING Kundenbestellungen > 1

Joker86666 
Beitragsersteller
 24.06.2022, 13:47

Perfekte und einfach zu verstehnde Erklärung. Herzlichen Dank dafür!!!

0

Das count brauchste für die gruppierung der bestellungen nach kunden.

Wenn du nur den select nimmst (Ohne count und gruppierung) komme ne tabelle mit folgener struktur raus.

Kunde A Bestellung 1

Kunde A bestellung 2

Kunde B bestellung 1

Kunde B bestellung 2

Usw.

Wenn du nun nur eine gruppierung nach Kunde hinzufügen willst. Dann wird die die DB meckern. Weil er nicht weiss was er mit der bestellungsspalte anfangen soll.

Weil wenn du kruppierst nach kunde. Dann fasst du ja alle datensätze für einen kunden zusammen.

Und hier kommt das count ins spiel. Das sagt dem DBMS das er ledigliche die bestellungenzählen soll.

Raus kommt dann:

Kunde A 2 Bestellungen

Kunde B 2 Bestellungen

usw. usw.

Hätten wir jetzt nen Kunde C mit einer bestelltung (Kunden mit gar keiner berstellung werden schon rausgefiltert) dann werden die natürlich auch in der liste angezeigt.

und hier kommt dann das having ins spiel. Das er eben nur die gruppen anzeigen soll. Die eine Anzahl der bestellungen grösser 1 haben.

as count

Bennennt lediglich was davor steht.

Wenn das DBMS die methode Count(...) auf der spoalte OrderID ausführt. Dann weiss es nicht wie es das ganze benennen soll. Wenn man aber dieses Ergbeniss spoäter nochmal braucht (z.b. beim keyword having) dann muss man es benennen. Deswegen hat man es als count benannt.

Du könntest anstatt count auch schlichtweg AnzahlBestellungen schreiben. Oder was auch immer. Es ist lediglich nen bezeichner.

Woher ich das weiß:Studium / Ausbildung – Bachelor