SQL Der select-Befehl Mengenoperatoren Mit den Ausdrücken Union und Intersect lassen sich die Vereinigungs- und die Schnittmege aus zwei Datenbanktabellen ermitteln. Betrachten Sie dazu die beiden Datenbanktabellen: Fußball Name Es gibt Spieler, die in beiden Sportarten mitMeyer spielen, und andere, die nur jeweils entweder Hansmann in der einen oder in der anderen Sportart Peters spielen. Huber Damit die Beispiele Sinn machen, soll z. B. Szilinski jemand namns Peters in der Tabelle Fußball dieselbe Person sein wie Peters in der Tabel- Vorfelder Lohmann le Handball. Die Vereinigungsmenge erhält man mit union: SELECT NAME FROM HandBALL UNION SELECT NAME FROM FussBALL; Wenn Sie statt union schreiben: union all dann werden die doppelt vorkommenden Namen nicht eliminiert. NAME Hansmann Huber Johannson Lohmann Meyer Müller Peters Szilinski Vorfelder Die Schnittmenge, also die Anzeige der Spieler, die in beiden Sportarten spielen, erhält man mit Intersection. NAME Meyer Peters Szilinski Lohmann Allerdings akzeptiert Access dies nicht! SELECT NAME FROM HandBALL Intersect SELECT NAME FROM FussBALL Handball Name Meyer Müller Peters Johannson Szilinski Lohmann Aggregat-Funktionen Diese Funktionen werden auch Set-Funktionen genannt. Mit ihnen werden Auswertungen wie Summe, Mittelwert usw. vorgenommen. a) count Die einfachste Auswertung dieser Art erhält man mit dem Befehl count (=zählen). Beispiel, bezogen auf die Tabelle Preis: SELECT count (*) Das Ergebnis ist 7, weil sich Expr1000 7 in der Tabelle 7 Datensätze FROM Preis; befinden. ANZAHL Besser sieht es aus, wenn man einen SELECT Count(*) AS ANZAHL 7 FROM Preis; Aliasnamen verwendet Auch hier ist natürlich die Angabe von SELECT Count(*) AS ANZAHL FROM Preis Bedingungen mit where möglich WHERE Grosshandel>0.5 1 ANZAHL 3 SQL Der select-Befehl b) sum Mit diesem Befehl bildet man die Summe von Feldinhalten. Mit dem folgenden Beispiel wird die Summe der Grosshandelspreise gebildet Summe_Grosshandel 3,09 select sum (Grosshandel) as Summe_Grosshandel from preis c) min Das Minimum von Feldinhalten wird mit der Funktion min ermittelt: Expr1000 -28 SELECT min (Tieftemp) FROM Temperatur; auch hier ist es meistens übersichtlicher, wenn mit einem Aliasnamen gearbeitet wird: SELECT min (Tieftemp) as "Tiefste Temperatur" FROM Temperatur; "Tiefste Temperatur" -28 d) max Das Maximum ist entsprechend max: SELECT max (Hochtemp) as "Höchste Temperatur" FROM Temperatur; "Höchste Temperatur" 48 e) avg Das Wort Mittelwert heißt auf englisch "average", deshalb heißt die Funktion avg SELECT avg (Hochtemp) as "Durchschnitt der Höchstwerte" FROM Temperatur; "Durchschnitt der Höchstwerte" 41,3333333333333 Ubungsaufgaben Alle Aggregat-Funktionen lassen sich mit where-Klauseln verbinden. Verwenden Sie für die folgenden Übungsbeispiele die Tabelle Getränke: 1) Zählen Sie in der Getränke-Tabelle, von wievielen Artikeln mehr als 45 Stück auf Lager sind. Die Zählung soll überschrieben werden mit über 45 auf Lager 2) Bilden Sie den Mittelwert der Einkaufspreise von den Artikeln, die vom Lieferanten Maisel bezogen werden. Verwenden Sie als Überschrift Mittelwert der EKpreise von Maisel 3) Das Maximum im Bestand der Artikel, die als 0.7-Liter-Flaschen gehandelt werden 4) Die Summe des Bestands der Spirituosen, deren Einkaufspreis zwischen 8,00 und 12,00 liegt 5) Das Minimum des Bestands der Artikel, die kein Bier sind. 6) wie Aufg. 5), aber zusätzliche Bedingung: Die Getränke sollen nicht vom Lieferanten Müller KG sein. Noch einige Aufgaben zur Tabelle Mieter: a) den Mittelwert der Mietkosten der Düsseldorfer Mieter, überschrieben: "Mittelwert D-dorf" b) die Summe der Mietkosten der Privatpersonen c) das Minimum der Mietkosten bei den Mietern, deren Postleitzahl mit 0, 1, 2, 3 oder 4 beginnt, überschrieben mit "PLZ unter 50000" d) die Summe der Mietkosten von den Leuten, deren Nachname mit Sch beginnt. 2 SQL Der select-Befehl Lösungen zu den Aufgaben S. 2 1) SELECT count (*) as 'über_45 auf Lager' FROM Getränke where Bestand >45 2) SELECT avg (EKPREIS) as 'Mittelwert der EKpreise von Maisel' FROM Getränke where Lieferant ="Maisel" 3) SELECT max (Bestand) as 'Höchstzahl von Einzelflaschenl' FROM Getränke where packung ="0.7" 4) SELECT sum (Bestand) as 'Summe' FROM Getränke where Art ="Spirituosen" and ekpreis between 8 and 12 5) SELECT min (Bestand) as 'Minimal' FROM Getränke where Art<>"Bier" 6) SELECT min (Bestand) as 'Minimal' FROM Getränke where Art<>"Bier" and not Lieferant ="Müller KG" a) SELECT avg (Mietkosten) as "Mittelwert D-dorf" FROM Mieter where Ort="Düsseldorf"; b) SELECT sum (Mietkosten) FROM Mieter where Anrede <>"Firma" c) select min (Mietkosten) as "PLZ unter 50000" FROM Mieter where PLZ <"5" d) select sum (Mietkosten) FROM Mieter where Nachname like "Sch*" Select-Befehl mit Gruppierung mit dem Zusatz: "group by" lassen sich Gruppen von Ergebnissen bilden, z. B. so: select Ort, sum (Mietkosten) as "Summe Mietkosten" Ort "Summe Mietkosten" Aachen 0 Berlin -104,75 Düsseldorf 10750 Frankfurt a. M. -265 Frankfurt/Oder 210,5 Hamburg -5423,25 Köln 0 München -45,75 Stuttgart 0 Ulm 2110,9 from Mieter group by ort Statt der ursprünglich 15 Zeilen der Tabelle Mieter werden nur noch 10 Zeilen angezeigt, weil die Mietkosten von Mietern aus gleichen Orten summiert wurden. wichtig ist für eine sinnvolle Ausgabe, dass man "Summe Mietkosten" 0 in der ersten Zeile auch das Feld aufführt, nach -104,75 dem gruppiert wird (hier: Ort), denn sonst weiß 10750 man in der Ausgabe nicht, um was es sich han-265 delt: 3 SQL Der select-Befehl Aufgabe: Erstellen Sie eine SQL-Abfrage zur 1 Tabelle Mieter, die das folgene Ergebnis erzielt: gruppiert nach dem Feld Anrede (also getrennt für Firmen, Frauen und Männer) soll der Mittelwert der Mietkosten ermittelt werden. anrede "Mittelwert der Mietkosten" Firma -2869,375 Frau 2433,75 Herr 359,6 Auch mit dem count-Befehl läßt sich in Gruppierungen arbeiten: SELECT Anrede, count (*) as Anzahl FROM Mieter group by anrede; Anrede Anzahl Firma 2 Frau 4 Herr 9 Vorsicht: Diese Abfrage führt zu einer Fehlermeldung: SELECT Anrede, count (*) FROM Mieter group by Ort; Es ist nicht möglich, nach einem Feld zu gruppieren, das nicht dem select-Ausdruck entspricht. Aufgabe: Zählen Sie die Anzahl Mieter in den einzelnen Orten: 2 Aufgabe: Ermitteln Sie den kleinsten Wert (Minimum) der Mietkosten, nach Orten gruppiert 3 ort Anzahl Mieter Aachen 1 Berlin 4 Düsseldorf 2 Frankfurt a. M. 2 Frankfurt/Oder 1 Hamburg 1 Köln 1 München 1 Stuttgart 1 Ulm 1 ort "kleinster Wert" Aachen 0 Berlin -315,5 Düsseldorf 750 Frankfurt a. M. -385 Frankfurt/Oder 210,5 Hamburg -5423,25 Köln 0 München -45,75 Stuttgart 0 Ulm 2110,9 Öffnen Sie jetzt die Datenbank Getränke. Lieferant "Anzahl Getränkesorten" Bolz GmbH 5 zahl der Getränkesorten (durch Zählen Maisel 4 der Artikel) ermittelt werden: Müller KG 6 Schnaps & Co 1 Aufgabe: Gruppiert nach Lieferanten soll die An4 Aufgabe: Gruppiert nach Packung soll das Minimum im Bestand herauskommen: 5 art "kleinster Einkaufspreis" Aufgabe: Der geringste Einkaufspreis in- 4 6 packung "geringste Bestandsmenge" 0.7 18 Einweg 6*0.33 35 Kasten 0.5*20 30 Kasten 0.7*12 25 SQL Der select-Befehl nerhalb einer Getränke-Art: Bier Spirituosen Tonic Wasser 3,85 5,48 1,21 2,86 Aufgabe: Gruppierung nach Lieferanten und dem Mittelwert vom Verkaufspreis 7 Lieferant "mittlerer Verkaufspreis" Bolz GmbH 8,682 Maisel 6,68 Müller KG 9,93666666666667 Schnaps & Co 16 Aufgabe: Summe des Bestands, gruppiert Lieferant "Stück auf Lager" Bolz GmbH 185 Maisel 185 Müller KG 234 Schnaps & Co 28 nach Lieferant: 8 Aufgabe: Zählung der Artikel je nach Packungseinheit 9 packung "wieviel Einheiten?" 0.7 7 Einweg 6*0.33 1 Kasten 0.5*20 6 Kasten 0.7*12 2 (Lösungen 1-9 auf der nächsten Seite) Die Having-Klausel Einschränkende Bedingungen mittels where-Klausel haben wir bereits besprochen. Das folgende Beispiel summiert - zunächst ohne Einschränkung – die Mietkosten der MieterTabelle, gruppiert nach Anrede, also getrennt nach Firmen, Frauen und Männern. SELECT Anrede, sum(mietkosten) as "Mietkosten" FROM Mieter group by Anrede Anrede "Mietkosten" Firma -5738,75 Frau 9735 Herr 3236,4 Wenn wir dasselbe Ergenis, jedoch ohne Firmen, erhalten wollen, dann lautet die SQLAbfrage: SELECT Anrede, sum(mietkosten) as "Mietkosten" FROM Mieter where Anrede <>"Firma" group by Anrede Anrede "Mietkosten" Frau 9735 Herr 3236,4 Die where-Klausel lässt sich also zusammen mit Gruppierungen verwenden, allerdings nicht, wenn innerhalb der where-Klausel Aggregatfunktionen (sum, avg, min, max, count) verwendet werden. Sehen Sie dazu als Beispiel die folgende Abfrage an: SELECT Anrede, sum(mietkosten) AS "Mietkosten" FROM Mieter GROUP BY Anrede where sum(mietkosten)>5000; Wenn eine rechnerische Auswertung Teil einer Bedingung sein soll, funktioniert die whereKlausel nicht mehr; stattdessen müssen Sie in dem Fall mit having arbeiten. SELECT Anrede, sum(mietkosten) AS ["Mietkosten"] FROM Mieter GROUP BY Anrede having sum(mietkosten)>5000; 5 Anrede "Mietkosten" Frau 9735 SQL Der select-Befehl Lösungen S. 4/5: 1 2 3 4 5 6 7 8 9 select anrede, avg (Mietkosten) as "Mittelwert der Mietkosten" from Mieter group by anrede; SELECT ort, count (ort) as "Anzahl Mieter" FROM Mieter group by Ort; SELECT ort, Min(Mietkosten) as "kleinster Wert" FROM Mieter group by Ort; SELECT Lieferant, count (*) as "Anzahl Getränkesorten" FROM Getränke group by Lieferant; SELECT packung, min(bestand) as "geringste Bestandsmenge" FROM Getränke group by packung; SELECT art, min(ekpreis) as "kleinster Einkaufspreis" FROM Getränke group by art; SELECT Lieferant, avg(VKpreis) as "mittlerer Verkaufspreis" FROM Getränke group by Lieferant; SELECT Lieferant, sum(bestand) as "Stück auf Lager" FROM Getränke group by Lieferant; SELECT packung,count(*) as "wieviel Einheiten?" FROM Getränke group by packung; Fortsetzung Having-Klausel: Sehen Sie sich dazu die Tabelle Abteilung an: Name Groß Klein Peters Müller Gardner Lindemann Kussnacht Gernegroß Hünzer Klinger Abteilung Forschung Marketing Personal Forschung Marketing Personal Forschung Marketing Personal Forschung Gehalt 2.670,00 € 2.890,00 € 2.230,00 € 2.700,00 € 2.480,00 € 2.200,00 € 2.780,00 € 2.300,00 € 3.100,00 € 4.270,00 € Abschluss Ausbildung FH FH Uni Uni Ausbildung FH Ausbildung Uni Uni UrKrank_Tag Datum Be- VerheiraEinstelldatum laubstae förderung tet ge 32 10 01.01.90 01.06.96 Ja 30 12 01.01.93 Nein 28 5 01.01.97 Nein 30 0 01.04.95 01.06.99 Ja 30 7 01.07.97 01.03.00 Ja 28 5 01.01.98 Ja 28 0 01.01.93 01.03.96 Nein 30 20 01.03.92 01.06.98 Ja 29 11 01.01.96 01.01.00 Nein 30 10 01.01.95 01.01.99 Ja SELECT Abteilung, sum(gehalt) as "Summe der Gehälter" FROM Abteilung group by abteilung; Aufgabe 1: Welche SQL-Abfrage lässt nur die Abteilung mit einer Gehaltssumme über 8000 herauskommen? Aufgabe 2: Bilden Sie die Gehaltssumme aller verheirateten bzw. nicht verheirateten Kollegen Aufgabe 3: Zeigen Sie den Mittelwert der Krank_tage , grup- 6 Abteilung Gehaltssumme Forschung 12420 Marketing 7670 Personal 7530 Abteilung Gehaltssumme Forschung 12420 verheiratet Gehaltssumme Ja 16620 Nein 11000 abschluss Kranktage SQL Der select-Befehl piert nach Abschluss, für die Kollegen an, bei denen der Mittelwert in der Abschlussgruppe über 10 Krankentage liegt: Ausbildung 11,6666666666667 Aufgabe 4: Ermitteln Sie das höchste Gehalt in abteilung "höchstes Gehalt" Forschung 4270 Marketing 2890 Personal 3100 jeder Abteilung: Aufgabe 5: Wie Aufgabe 4, aber nur für die Abteilungen, wo abteilung "höchstes Gehalt" Forschung 4270 Personal 3100 das höchste Gehalt über 3000 € liegt: Aufgabe 6: In welcher Abteilung liegt das Maximum der Urlaubstage über 30? abteilung "am meisten Urlaub" Forschung 32 Aufgabe 7: Wie hoch ist die Summe der "krankgefeierten" Tage in der Abteilung, in der – wie bei Aufg. 6) das Maximum der Urlaubstage über 30 liegt? Aufgabe 8: Gefragt sind Name und Abteilung von den Mitarbeitern, die schon einmal befördert wurden Abteilung befördert wurden Aufgabe 10: Nur die Anzahl beförderter Kollegen aus der Abteilung Aufgabe 11: Name und Datum der Beförderung von den Kollegen, bei denen zwischen Einstellung und Beförderung weniger als 4 Jahre vergingen Aufgabe 12: Abteilung und durchschnittl. Urlaubstage der Abteilung Marketing Aufgabe 13: Abschluss und Gehalt der Angestellten mit Uni-Abschluss Aufgabe 14: Das geringste Gehalt in jeder nach Abschluss gebildeten Gruppe Name Groß Müller Gardner Kussnacht Gernegroß Hünzer Klinger befördert Abteilung 2 Marketing name Datum_Beförderung Gardner 01.03.00 Kussnacht 01.03.96 abteilung "Durchschnitt Urlaub" Marketing 30 abschluss Uni Uni Uni Uni Gehalt 2.700,00 € 2.480,00 € 3.100,00 € 4.270,00 € abschluss Expr1001 Ausbildung 2200 FH 2230 Uni 2480 Aufgabe 15: Das geringste Gehalt in der Gruppe, die FH-Abschluss hat Lösungen zu den Aufgaben 7 Abteilung Forschung Forschung Marketing Forschung Marketing Personal Forschung befördert Abteilung 4 Forschung 2 Marketing 1 Personal Aufgabe 9: Jetzt soll gezählt werden, wie viele Kollegen je nach Marketing abteilung "Krank" Forschung 20 abschluss Expr1001 FH 2230 SQL Der select-Befehl 1. SELECT [Abteilung], sum([Gehalt]) AS Gehaltssumme FROM Abteilung GROUP BY [Abteilung] having sum(gehalt) >8000 2. SELECT verheiratet, sum([Gehalt]) AS Gehaltssumme FROM Abteilung GROUP BY verheiratet 3. SELECT abschluss, avg(krank_tage) as Kranktage FROM Abteilung GROUP BY Abschluss having avg(krank_tage)>10 4. SELECT abteilung, max(gehalt) as "höchstes Gehalt" FROM Abteilung GROUP BY Abteilung 5. wie 4) letzte Zeile: having max(gehalt) >3000 6. SELECT abteilung, max(urlaubstage) as "am meisten Urlaub" FROM Abteilung GROUP BY Abteilung having max(Urlaubstage)>30 7. SELECT abteilung, sum(krank_tage) as "Krank" FROM Abteilung GROUP BY Abteilung having max(Urlaubstage)>30 8. SELECT Name, Abteilung FROM Abteilung where Datum_beförderung is not Null; 9. SELECT count(*) as befördert, Abteilung FROM Abteilung where Datum_beförderung is not Null group by abteilung; 10. SELECT count(*) as befördert, Abteilung FROM Abteilung where Datum_beförderung is not Null group by abteilung having Abteilung="Marketing" 11. SELECT name,Datum_Beförderung FROM Abteilung where Datum_beförderung - Einstelldatum <365*4 12. SELECT abteilung, avg(Urlaubstage) as "Durchschnitt Urlaub" FROM Abteilung group by abteilung having abteilung="Marketing" 13. SELECT abschluss, Gehalt FROM Abteilung where Abschluss="Uni" 14. SELECT abschluss, min(Gehalt) FROM Abteilung group by abschluss 15. SELECT abschluss, min(Gehalt) FROM Abteilung group by abschluss having abschluss="FH" 8