SQL Abfragen – Verknüpfte Abfragen

Werbung
SQL Abfragen – Verknüpfte Abfragen - Lösung
WICHTIGER HINWEIS: Beim Kopieren der Lösung in das Formularfeld von sql.idv.edu
müssen die Anführungszeichen dort neu hineingeschrieben (überschrieben) werden.
Ansonsten funktioniert das Statement nicht.
Wiederholung: Wie heißt der Kunde Nr. 14 mit Vor- und Nachnamen?
SELECT Vorname, Nachname
FROM Kunde
WHERE Nr = 14
Bsp1: Gesucht:
- Nachname
- PLZ
- Ort
SELECT Kunde.Nachname, Kunde.Plz, PLZ.Ort
FROM Kunde, PLZ
WHERE (PLZ.Plz = Kunde.Plz)
Bsp2: Gesucht sind alle Bücher mit
- Buchtitel
- Verlag (= Kurzbezeichnung)
- Name (= Langbezeichnung)
SELECT Buch.Titel, Buch.Verlag, Verlag.Name
FROM Buch, Verlag
WHERE (Buch.Verlag = Verlag.Kurzbezeichnung)
Bsp3a: Wieviel Umsatz pro Buch (Preis * Menge) haben wir mit Auftrag Nr. 7 gemacht?
Gesucht:
- Buchtitel
- Buchnummer
- Umsatz pro Buch
- Auftragsnummer
Hinweis: Buchhändlter kaufen von 1 Buch meist größere Mengen (Großhandel)
SELECT Buch.Titel, Buch.Nr, Buch.Preis*Auftragspos.Menge, Auftragspos.Auftragsnummer
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND Auftragspos.Auftragsnummer = 7
Informationsverarbeitung, Uni-Linz, Ernst Rodlmayr 2013
-1-
Bsp3b: wie 3a erweitert um absteigende Sortierung nach Umsatz
SELECT Buch.Titel, Buch.Nr, Buch.Preis*Auftragspos.Menge AS Umsatz,
Auftragspos.Auftragsnummer
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND Auftragspos.Auftragsnummer = 7 ORDER BY Umsatz DESC
Bsp3c: Gesucht:
- Gesamteinkaufssumme von Auftrag Nr. 7
- Auftragsnummer
SELECT SUM(Buch.Preis*Auftragspos.Menge), Auftragspos.Auftragsnummer
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND Auftragspos.Auftragsnummer = 7
GROUP BY Auftragspos.Auftragsnummer
oder
SELECT SUM(Buch.Preis*Auftragspos.Menge), Auftragspos.Auftragsnummer
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
GROUP BY Auftragspos.Auftragsnummer HAVING Auftragspos.Auftragsnummer = 7
Bsp3d: wie 3c aber alle Auftragsnummern
SELECT SUM(Buch.Preis*Auftragspos.Menge), Auftragspos.Auftragsnummer
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
GROUP BY Auftragspos.Auftragsnummer
Bsp3e: wie 3d aber zusätzlich mit:
- Vorname
- Nachname des Kunden
SELECT SUM(Buch.Preis*Auftragspos.Menge), Auftragspos.Auftragsnummer,
Kunde.Vorname, Kunde.Nachname
FROM Buch, Auftragspos, Auftrag, Kunde
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND (Auftragspos.Auftragsnummer = Auftrag.Nr)
AND (Auftrag.Kundennummer = Kunde.Nr)
GROUP BY Auftragspos.Auftragsnummer, Kunde.Vorname, Kunde.Nachname
Hinweis: Group BY kommt zwingend zum Einsatz, sobald eine arithmetische Funktion mit
einer normalen Spalte in der SELECT-Anweisung enthalten ist. Alle Spalten die im SELECT
vorkommen, mit Ausnahme der arithmetischen Funktion(en), müssen auch im GROUP BY
vorkommen. Das wird als „Only Full GROUP BY“ bezeichnet. Bitte an diese Institutsvorgabe
halten! Meines Erachtens spräche aber auch nichts gegen partielle GROUP BYs, vgl:
http://mysql.lamphost.net/tech-resources/articles/debunking-group-by-myths.html
Informationsverarbeitung, Uni-Linz, Ernst Rodlmayr 2013
-2-
Bsp4: Welche Kunden haben im Jänner 2000 bei uns eingekauft? Gesucht:
- Kundennummer
- Nachname
SELECT Kunde.Nr, Kunde.Nachname
FROM Kunde, Auftrag
WHERE (Kunde.Nr = Auftrag.Kundennummer)
AND Auftrag.Datum BETWEEN '2000-01-01' AND '2000-01-31'
* Hinweis: Es gibt hier auch Lösungen mit LIKE oder MONTH / YEAR
Bsp5: Gesucht:
- Max Buchpreis
- Min Buchpreis
- Durschn. Buchpreis
- Summe aller Preise
- Anzahl d. versch. Bücher in der DB
SELECT MAX(Preis), MIN(Preis), AVG(Preis), SUM(Preis), COUNT(*)
FROM Buch
Bsp6a: Wie viele Exemplare hat Herr „Karl Risse Ritter“ vom Buch „Lorenzo“ beim Auftrag
Nr. 437 gekauft? Gesucht:
- Vorname
- Nachname
- Auftragsnummer
- Buchtitel
- Menge
SELECT Kunde.Vorname, Kunde.Nachname, Auftragspos.Auftragsnummer, Buch.Titel,
Auftragspos.Menge
FROM Buch, Auftragspos, Auftrag, Kunde
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND (Auftragspos.Auftragsnummer = Auftrag.Nr)
AND (Auftrag.Kundennummer = Kunde.Nr)
AND Kunde.Vorname = "Karl"
AND Kunde.Nachname = "Risse Ritter"
AND Buch.Titel = "Lorenzo"
AND Auftragspos.Auftragsnummer = 437
Bsp6b: wie 6a aber bei allen Aufträgen vom Buch „Lorenzo“ von Hr. Risse Ritter?
SELECT Kunde.Vorname, Kunde.Nachname, Buch.Titel, SUM(Auftragspos.Menge)
FROM Buch, Auftragspos, Auftrag, Kunde
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND (Auftragspos.Auftragsnummer = Auftrag.Nr)
AND (Auftrag.Kundennummer = Kunde.Nr)
AND Kunde.Vorname = "Karl"
AND Kunde.Nachname = "Risse Ritter"
AND Buch.Titel = "Lorenzo"
GROUP BY Kunde.Vorname, Kunde.Nachname, Buch.Titel
Informationsverarbeitung, Uni-Linz, Ernst Rodlmayr 2013
-3-
HINWEIS: Wenn wir ein einzeiliges Ergebnis möchten, darf das Feld Auftragsnummer nicht
im SELECT (und GROUP BY) enthalten sein, weil sonst das Ergebnis zusätzlich nach
Auftragsnummern aufgeschlüsselt wird => mehrzeilig.
Bsp7: Wieviele Bücher wurden von den verschiedenen Verlagen insgesamt verkauft, die mit
„Textverarbeitung“ zu tun haben? Gesucht:
- Verlag
- Menge
SELECT Buch.Verlag, SUM(Auftragspos.Menge)
FROM Buch, Auftragspos
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND Buch.Titel LIKE "%Textverarbeitung%"
GROUP BY Buch.Verlag
Bsp8: Wir wollen alle Aufträge ausgeben lassen, wo die Gesamteinkaufssumme > 20000.
Gesucht:
- Auftragsnummer
- Kundennummer
- Gesamteinkaufssumme
SELECT Auftragspos.Auftragsnummer, Auftrag.Kundennummer, SUM(Buch.Preis *
Auftragspos.Menge) AS GEKSumme
FROM Buch, Auftragspos, Auftrag
WHERE (Buch.Nr = Auftragspos.Buchnummer)
AND (Auftragspos.Auftragsnummer = Auftrag.Nr)
GROUP BY Auftragspos.Auftragsnummer, Auftrag.Kundennummer
HAVING SUM(Buch.Preis * Auftragspos.Menge) > 20000
HINWEIS: Eine Funktion kann nur über HAVING eingeschränkt werden. HAVING kann als
Teil des GROUP BY betrachtet werden.
HINWEIS 2: Vor der Serverumstellung (only full group by) im Dez. 2011 funktionierte noch
diese Lösungsversion: HAVING GEKSumme > 20000. Leider führt das jetzt zu einer
Fehlermeldung.
Informationsverarbeitung, Uni-Linz, Ernst Rodlmayr 2013
-4-
Herunterladen