Informatik - Modellierung von Datenbanken: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Welche Informationen benötigen bestimmte Personengruppen (z.B. Abteilungsleitung, Kunden, Kassierer(in) … aus der Datenbank „Einkauf“? Welche Einkäufe…“) |
(→Weitere Abfragen an einem neuen Beispiel) |
||
(30 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | __FORCETOC__ | ||
+ | |||
+ | Bevor du mit Abfragen angänst, schau dir diesen Video zur Wiederholung des bisher Besprochenen an.<br> | ||
+ | <center>{{#ev:youtube |2goPVJOvJVY|350}}</center> | ||
+ | |||
+ | |||
+ | =Abfragen= | ||
+ | |||
Welche Informationen benötigen bestimmte Personengruppen (z.B. Abteilungsleitung, Kunden, Kassierer(in) … aus der Datenbank „Einkauf“? | Welche Informationen benötigen bestimmte Personengruppen (z.B. Abteilungsleitung, Kunden, Kassierer(in) … aus der Datenbank „Einkauf“? | ||
Zeile 10: | Zeile 18: | ||
− | [[Bild:weiter.gif]] Man hat | + | [[Bild:weiter.gif]] Man hat eine Tabelle mit vielen eingetragenen Werten. <br> |
[[Bild:weiter.gif]] Man hat eine Fragen.<br> | [[Bild:weiter.gif]] Man hat eine Fragen.<br> | ||
[[Bild:weiter.gif]] Man will eine Antwort. | [[Bild:weiter.gif]] Man will eine Antwort. | ||
+ | |||
+ | Dies erfolgt mit Hilfe von Datenbanken, indem man für eine Tabelle eine Abfrage startet und die Antwort als Ergebnistabelle erhält.<br> | ||
+ | <center>'''Tabelle'''<br> | ||
+ | '''↓'''<br> | ||
+ | '''Frage'''<br> | ||
+ | '''↓'''<br> | ||
+ | '''Ergebnistabelle'''</center> | ||
+ | |||
+ | |||
+ | Der Aufbau der '''Ergebnistabelle''' wird durch zwei Grundverfahren festgelegt: | ||
+ | <center>[[Datei:Db-erstellen einer tabelle4.jpg]]</center><br> | ||
+ | |||
+ | Eine <span style="color: #BF0015">Selektion</span> bedeutet eine Auswahl von Datensätzen (Zeilen) in der Datentabelle mit bestimmten Eigenschaften (z.B. Sparte = ’Lebensmittel’) <br> | ||
+ | <center>[[Datei:Db-selektion.jpg|Selektion]]</center><br> | ||
+ | Bei dieser Selektion interessen welche Lebensmittel eingekauft wurden. Es werden also alle Datensätze in der bei Sparte "Lebensmittel" steht ausgegeben. | ||
+ | |||
+ | Eine <span style="color: #BF0015">Projektion</span> wählt bestimmte Spalten in der Datentabelle aus (z. B. Kunde und Warenbezeichnung)<br> | ||
+ | <center>[[Datei:Db-projektion.jpg|Projektion]]</center><br> | ||
+ | Bei dieser Projektion werden nur die Spalten Kunde und Warenbezeichnung ausgegeben, wenn einen interessiert was welcher Kunde gekauft hat. | ||
+ | |||
+ | |||
+ | Eine Abfragefuntkion besteht aus drei Teilen und ist immer gleich aufgebaut. <br> | ||
+ | <center>[[Datei:Db-abfrage.jpg|Abfrage|450px]]</center><br> | ||
+ | |||
+ | |||
+ | {{Merke|1=Eine Abfrage startet immer mit <span style="color: #BF0015">SELECT</span>. Dahinter stehen die Spalten, die einen interessieren (Projektion). Danach kommt <span style="color: #BF0015">WHERE</span> mit der Tabelle in der man nachschaut. Und zum Schluss <span style="color: #BF0015">WHERE</span> mit den Bedingungen, die man wissen will (Selektion).}} | ||
+ | |||
+ | |||
+ | '''1. Beispiel:'''<br> | ||
+ | <span style="color: #BF0015">SELECT</span> * <br> | ||
+ | <span style="color: #9900FF">FROM</span> einkauf<br> | ||
+ | <span style="color: #0033FF">WHERE</span> Geschäft = ‘Imagi‘ | ||
+ | |||
+ | In OpenOfficeBase schreibt man dies in einer Zeile <br> | ||
+ | <center>SELECT * FROM einkauf WHERE Geschäft = ‘Imagi‘</center> .<br> | ||
+ | Beachte dabei:<br> | ||
+ | Nach SELECT bedeutet *, dass alle Spalten, also ein vollständiger Datensatz ausgegeben wird. Man kann hier auch nur einzelne Spalten, die einen interessieren schreiben.<br> | ||
+ | Nach WHERE steht die Tabelle einkauf, die wir erzeugt hatten und in der alle unsere Datensätze stehen.<br> | ||
+ | Geschäft = 'Imagi' nach WHERE ist die Bedingung, dass nur Einkäufe im Geschäft 'Imagi' ausgegeben werden sollen. Dabei ist der Geschäftsname in einfache Anführungszeichen (OpenOffice! Das kann in anderen SQL-Systemen anders sein) zu schreiben. | ||
+ | |||
+ | |||
+ | In OpenOffice Base startet man eine Abfrage, indem man in der linken Spalte Abfragen auswählt und dann in der Mitte '''Abfrage in SQL-Ansicht erstellen ...''' anklicken. <br> | ||
+ | [[Datei:Db-abfrage 3.jpg|Abfrage in OO]]<br> | ||
+ | Dann öffnet sich ein neues Fenster in das man die Abfrage schreibt. | ||
+ | |||
+ | |||
+ | '''2. Beispiel:'''<br> | ||
+ | In das gerade geöffnete Fenster schreibt man: SELECT Warenbezeichnung, Preis FROM einkauf WHERE Preis > 5<br> | ||
+ | [[Datei:Db-abfrage 4.jpg|Abfrage]]<br> | ||
+ | Um die Abfrage zu starten tippe auf die F5-Taste oder klicke auf der Seite oben bei den Icons auf "Abfrage aisführen (F5)".<br> | ||
+ | Du erhältst dann dieses Bild:<br> | ||
+ | <center>[[Datei:Db-abfrage 2.jpg|Abfragetabelle]]</center> | ||
+ | |||
+ | In dieser Abfrage erkennt man schön den Unterschied von Selektion und Projektion.<br> | ||
+ | <center>[[Datei:Db-abfrage 5.jpg|Abfrage|500px]]</center><br> | ||
+ | Nach SELECT stehen die Spalten der Projektion (Es werden die Spalten Warenbezeichnung und Preis ausgewählt) und nach WHERE steht die Selektion, die Bedingung zur Auswahl der Datensätze (Es interessieren nur die Datensätze mit Preis über 5€). | ||
+ | |||
+ | Man kann in diesem Beispiel die Abfrage so ändern, dass man noch in der Selektion <span style="color: #0033FF">ORDER BY Preis ASC</span> hinzufügt. <br> | ||
+ | <center>[[Datei:Db-abfrage 6.jpg|Abfrage]]</center><br> | ||
+ | In der Ergebnistabelle werden die Datensätze nun nach aufsteigendem Preis ausgegeben.<br> | ||
+ | Schreibt man <span style="color: #0033FF">ORDER BY Preis DESC</span>, dann werden die Datensätze sortiert nach absteigendem Preis ausgegeben. <br> | ||
+ | <center>[[Datei:Db-abfrage 7.jpg|Abfrage]]</center> | ||
+ | |||
+ | {{Merke|1=Mit dem Zusatz <span style="color: #9900FF">ORDER BY Preis </span> oder <span style="color: #9900FF">ORDER BY Preis ASC</span> wird die Ergebnistabelle nach der genannten Spalte aufsteigend geordnet. Der Zusatz <span style="color: #9900FF">ORDER BY Preis DESC</span> ordnet in absteigender Reihenfolge.}} | ||
+ | |||
+ | |||
+ | {{Aufgaben-blau|1|2=Ändere die Abfrage so ab, dass in der Selektion (hinter WHERE) folgendes steht <br> | ||
+ | a) Warenbezeichnung = ’Kinokarte’<br> | ||
+ | b) NOT(Sparte = ’Unterhaltung‘)<br> | ||
+ | c)(Kaufdatum = ‘2007-08-26‘) AND (Zahlungsart<> ’bar’)<br> | ||
+ | d)(Sparte = ’Kleider’) OR (Sparte = ’Sport’) | ||
+ | }} | ||
+ | |||
+ | {{Aufgaben-blau|2|2=Stelle Fragen, die durch die Ergebnistabellen der Aufgabe 1 beantwortet werden.}} | ||
+ | |||
+ | {{Lösung versteckt|a) Was kostet eine Kinokarte?<br> | ||
+ | b) Welche Waren außer "Unterhaltung" wurden zu welchem Preis gekauft. <br> | ||
+ | c) Welche Waren mit Preis wurden am 26. August 2007 gekauft und bar bezahlt.<br> | ||
+ | d) Was kosteten die Einkäufe aus den Bereichen Kleider oder Sport. }} | ||
+ | |||
+ | |||
+ | Macht man diese Abfrage: <span style="color: #0033FF">SELECT Warenbezeichnung FROM einkauf ORDER BY Warenbezeichnung ASC;</span> <br> | ||
+ | dann erhält man eine Ausgabetabelle mit vielen Einträgen wie Banane, Backwaren, ...<br> | ||
+ | Um nun diese vielen gleichen Einträge in der Ergebnistabelle zu vermeiden schreibt man nach SELECT <span style="color: #0033FF">DISTINCT</span>.<br> | ||
+ | Mit der Abfrage <span style="color: #0033FF">SELECT DISTINCT Warenbezeichnung FROM einkauf ORDER BY Warenbezeichnung ASC;</span> werden in der Ergebnistabelle Banane, Backwaren, ... nur einmal aufgeführt. | ||
+ | |||
+ | {{Merke|1=Redundante Anzeigen vermeiden:<br> | ||
+ | SELECT DISTINCT … unterbindet gleiche Zeilen in der Ergebnistabelle!}} | ||
+ | |||
+ | {{Aufgaben-blau|3|2=Erstelle eine Abfrage und überprüfe mit der Ergebnistabelle, ob deine Abfrage die richtige Antwort liefert.<br> | ||
+ | #Liste die Bezeichnungen aller gekauften Waren mit ihren Preisen auf.<br> | ||
+ | #Liste alle Kosmetikartikelbezeichnungen auf.<br> | ||
+ | #Gib eine Liste aller Waren in alphabetischer Reihenfolge aus.<br> | ||
+ | #Liste die Daten aller Einkäufe vom 18.3.2006 auf.<br> | ||
+ | #Welche Produkte hat Nicole Gütling eingekauft?<br> | ||
+ | #Welche Lebensmittel wurden vor dem 1.1.2007 gekauft?<br> | ||
+ | #Welche Waren, die billiger als 20 € waren, wurden nicht bar bezahlt? <br> | ||
+ | #Liste alle Waren auf, die in der Zeit vom 13.9.07 bis 20.9.07 gekauft und bar bezahlt wurden.<br> | ||
+ | #Welches Produkt war am teuersten? <br> | ||
+ | #Welche Waren wurden bei „Brutto Nürnberg“ gekauft? Liste sie in alphabetischer Reihenfolge auf.<br> | ||
+ | #Welche Kunden haben am 5.9.2007 bei „Brutto Nürnberg“ gekauft?<br> | ||
+ | #Martina Groß und Oliver Gross wohnen im gleichen Haus. Liste alle Waren auf, die sie gekauft haben. <br> | ||
+ | #Liste alle Waren jeweils mit dem zugehörigen Preis und Geschäft auf, die von männlichen Kunden für mehr als 20 € gekauft wurden. <br>Die Liste soll nach den Preisen sortiert sein. Lebensmittel sollen ausgeschlossen werden.<br> | ||
+ | #Wer hat am meisten Geld ausgegeben? <br>}} | ||
+ | |||
+ | {{Lösung versteckt|1=Schaue nicht gleich die Lösungen an, sondern probiere es zuerst selbst. Betrachte deine Ergebnistabelle und überlege, ob diese die gestellte Frage beantwortet.<br> | ||
+ | Beachte bei der Selektion wird ein Text in der Bedingung in einfachen Anführungszeichen (über der rechten Hochstelltaste ist als hochgestellt ')geschrieben .<br> | ||
+ | |||
+ | [[Datei:Abfragen.pdf|Abfragen-Lösungen]] | ||
+ | }} | ||
+ | |||
+ | {{Aufgaben-blau|4|2=Suche im Verzeichnis der Stadtbücherei Rothenburg https://rothenburg.internetopac.de/index.asp nach Bücher über Athen.<br> | ||
+ | Welche Angaben werden im Suchergebnis angezeigt?<br> | ||
+ | Was ist hier anders als bei einer Abfrage in SQL?<br> | ||
+ | Suche nach Büchern von unserem künftigen Oberbürgermeister Markus Naser.}} | ||
+ | |||
+ | {{Lösung versteckt|1=Bötig, Klaus:<br> | ||
+ | Athen / Klaus Bötig - 3., aktua...<br> | ||
+ | (DuMont direkt) - 2015<br> | ||
+ | Bötig, Klaus:<br> | ||
+ | Athen : Reisen mit Insider-Tipps - 2015<br> | ||
+ | Brinke, Margit ; Kränzle, Peter:<br> | ||
+ | Athen : [Reise-Know-how : City-Trip]<br> | ||
+ | (City-Trip ; 12) - 2018<br> | ||
+ | Deutsche Redewendungen und was dahintersteckt : Ursprung und Bedeutung von über 700 Sprichwörtern - 2013<br> | ||
+ | Dudde, Lasse:<br> | ||
+ | Santorin / Lasse Dudde<br> | ||
+ | (Merian live!) - 2019<br> | ||
+ | Griechenland, Athen & Festland / Marc Dubin...<br> | ||
+ | (Vis-à-vis) - 2015<br> | ||
+ | Hashimi, Nadia:<br> | ||
+ | Wenn die Nacht am hellsten ist : Roman - 2017<br> | ||
+ | Holler, Renée:<br> | ||
+ | Im Visier der Schmugglerbande / Renée Holler<br> | ||
+ | (Tatort Erde) - 2009<br> | ||
+ | Jaeckel, E. Katja:<br> | ||
+ | MERIAN live! Reiseführer Athen - 2018<br> | ||
+ | Kanaris, Leo:<br> | ||
+ | Die Toten von Athen : ein Fall für Detektiv Zafiris : Kriminalroman - 2018 | ||
+ | |||
+ | Es wird der Autor, der Titel des Buches, eventuell (???) und das Erscheinungsjahr angezeigt. | ||
+ | |||
+ | Man macht keine Abfrage mit SELECT ..... , sondern gibt nur in vorgegebene Felder passende Begriffe ein. | ||
+ | |||
+ | In der Stadtbücherei gibt es keine Bücher von Markus Naser.<br> | ||
+ | Doch wenn du in der Universitätsbibliothek der Universität Würuburg https://katalog.bibliothek.uni-wuerzburg.de/TouchPoint/start.do?View=sunrise&Language=de bei Autor Markus Naser eingibst, findest du zwei Bücher von ihm.}} | ||
+ | |||
+ | Hier ist alles über Abfragen noch einmal zusammengefasst:<br> | ||
+ | {{#ev:youtube |phdWpI5VUWk|350}} | ||
+ | |||
+ | {{Aufgaben-blau|5|2=a) Muss die Spalte, nach der geordnet wird, in der SELECT-Klausel vorkommen?<br> | ||
+ | b) Kann auch nach mehreren Spalten geordnet werden?<br> | ||
+ | c) Welche Auswirkung hat die Reihenfolge der angegebenen Sortierspalten? }} | ||
+ | |||
+ | {{Lösung versteckt|a) nein<br> | ||
+ | b) ja<br> | ||
+ | c) Die Reihenfolge der Sortierspalten legt das 1., 2., ... Sortierkriterium fest. }} | ||
+ | |||
+ | |||
+ | =Aggregatfunktionen= | ||
+ | |||
+ | Wir wollen Daten nicht nur auswählen, sondern auch '''auswerten'''. Man macht dies mit '''Aggregatsfunktionen'''. | ||
+ | |||
+ | Beispiel: | ||
+ | * Wie viel kostet die teuerste Ware? | ||
+ | * Wie viele Waren wurden mit Karte bezahlt? | ||
+ | * Wie viel hat Chantal Amberg insgesamt ausgegeben? | ||
+ | |||
+ | |||
+ | Zahlen auswerten kennst du aus der Mathematik. Dort hat man '''mathematische Funktionen''', die einem dabei helfen. Du hast sie auch schon in der Tabellenkalkulation kennengelernt. Zum Beispiel:<br> | ||
+ | SUMME(Zahl1; Zahl2; …) <br> | ||
+ | MITTELWERT(Zahl1; Zahl2; …) <br> | ||
+ | MAX(Zahl1; Zahl2; …) <br> | ||
+ | MIN(Zahl1; Zahl2; …) <br> | ||
+ | ANZAHL(Zahl1; Zahl2; …) | ||
+ | |||
+ | Diese Funktionen gibt es auch in SQL. | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Mathematische Funktionen !! SQL !! Bedeutung | ||
+ | |- | ||
+ | | SUMME(Zahl1; Zahl2; …) || SUM(Spalte) || Summe der Spaltenwerte | ||
+ | |- | ||
+ | | MITTELWERT(Zahl1; Zahl2; …) || AVG(Spalte) || Durchschnitt der Spaltenwerte | ||
+ | |- | ||
+ | | MAX(Zahl1; Zahl2; …) || MAX(Spalte) || Maximalwert der Spaltenwerte | ||
+ | |- | ||
+ | | MIN(Zahl1; Zahl2; …) || MIN(Spalte) || Minimalwert der Spaltenwerte | ||
+ | |- | ||
+ | | ANZAHL(Zahl1; Zahl2; …) || COUNT(*) || Anzahl der Datensätze | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | Beachte, dass bei den ersten 4 Funktionen nach der Funktion in runden Klammern die Spalte angegeben wird, während bei der Anzahl der Datensätze nach COUNT in runden Klammern * steht, da alle Datensätze gezählt werden. Das * kennst du bereits aus den Abfragen, wenn der gesamte Datensatz (Zeile) ausgegeben werden sollte, dann machte man * nach SELECT. | ||
+ | |||
+ | {{Aufgaben-blau|6|Schaue dir dieses Video zu den Aggregatfunktionen an.<br> | ||
+ | <center>{{#ev:youtube |AAsdLt0s-LM|300}}</center> }} | ||
+ | |||
+ | Als nächstes betrachten wir Beispiele aus unserer Datenbank einkauf. | ||
+ | |||
+ | * SELECT MAX( Preis ) FROM einkauf | ||
+ | * SELECT COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'Karte‘‚ | ||
+ | * SELECT Kunde, COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'bar' GROUP BY Kunde | ||
+ | * SELECT Sparte, SUM(Preis ) AS Summe FROM einkauf WHERE Kaufdatum = '2007-08-26' GROUP BY Sparte ORDER BY SUM( Preis ) DESC | ||
+ | |||
+ | Was passiert bei diesen Abfragen? | ||
+ | |||
+ | Bei der Abfrage '''SELECT MAX(Preis) FROM einkauf''' wird in der Tabelle einkauf in der Spalte Preis der Maximalwert gesucht.<br> | ||
+ | <center>[[Datei:Abfrage max1.jpg|Abfrage_max]]</center><br> | ||
+ | Der gefundene Maximalwert wird in der Ergebnistabelle ausgegeben. <br> | ||
+ | <center>[[Datei:Abfrage max2.jpg]]</center> | ||
+ | Die Ergebnistabelle ist hier eine Tabelle mit einer Zeile. Der Spaltenbezeichner ist hierbei automatisch erstellt. | ||
+ | |||
+ | Bei der Abfrage '''SELECT COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'Karte‘ ''' wird in der Tabelle einkauf in der Spalte Zahlungsart die Anzahl der Einträge "Karte" gezählt.<br> | ||
+ | <center>[[Datei:Abfrage-count1.jpg|Abfrage_count]]</center><br> | ||
+ | In der Ergebnistabelle wird die Auswertung der Aggregatfunktion, also die Anzahl der Kartenzahlungen ausgegeben.<br> | ||
+ | <center>[[Datei:Abfrage-count2.jpg|Abfrage_count]]</center><br> | ||
+ | Beachte, dass hier die Bezeichnung in der Ergebnistabelle durch Angabe von '''AS Anzahl''' den Spaltenbezeichner '''Anzahl''' erhält. | ||
+ | |||
+ | Bei der Abfrage '''SELECT Kunde, COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'bar' GROUP BY Kunde''' wird in der Tabelle einkauf in der Spalte Zahlungsart zuerst die Zahlungsart "bar" ausgewählt und nach Kunden sortiert.<br> | ||
+ | <center>[[Datei:Abfrage sum1.jpg|Abfrage_sum]]<br> | ||
+ | ''Auswertung der Bedingung Zahlungsart = ’bar’, Zusammenfassung in Gruppen nach Kunden''</center><br> | ||
+ | Danach werden für jeden Kunden die Anzahl der Barzahlungen berechnet und ausgegeben.<br> | ||
+ | <center>[[Datei:Abfrage sum2.jpg|Abfrage_sum]]<BR> | ||
+ | ''Ausgabe des Kunden und Auswertung der Aggregatfunktion für jede Gruppe''</center> | ||
+ | |||
+ | {{Merksatz|MERK=WICHTIG: '''Stehen nach SELECT Aggragatfunktionen, dann <span style="color: #BF0015">dürfen unter SELECT außer den Aggregatfunktionen nur Spalten erscheinen, die unter GROUP BY aufgeführt sind!'''</span>}} | ||
+ | |||
+ | {{Aufgaben-blau|7|2=Schaue dir dieses Video an, in dem die Gruppierung ausführlich erklärt wird. <br> | ||
+ | <center> {{#ev:youtube |hbf1srE3ZC4|300}}</center> }} | ||
+ | |||
+ | |||
+ | In der Abfrage '''SELECT Sparte, SUM(Preis ) AS Summe FROM einkauf WHERE Kaufdatum = '2007-08-26' GROUP BY Sparte ORDER BY SUM( Preis ) DESC ''' werden zuerst in der Tabelle einkauf die Datensätze mit den Kaufdatum 26.8.2007 ausgewählt.<br> | ||
+ | <center>[[Datei:Abfrage sum3.jpg|Abfrage_sum]]<br> | ||
+ | ''Auswahl der Datensätze mit Kaufdatum 26.08.2007''</center><br> | ||
+ | Danach werden Gruppen der gleichen Sparte gebildet und die Summenfunktion darauf angewendet.<br> | ||
+ | <center>[[Datei:Abfrage sum4.jpg|Abfrage_sum]]<br> | ||
+ | ''Bildung von Gruppen gleicher Sparte, Anwendung der SUM-Funktion auf diese Gruppen''</center><br> | ||
+ | Zum Schluss wiwrd noch absteigend nach dem Summenbetrag sortiert.<br> | ||
+ | <center>[[Datei:Abfrage sum5.jpg|Abfrage_sum]]<br> | ||
+ | ''Absteigendes (DESC) Sortieren nach den entstandenen Summenwerten''</center> | ||
+ | |||
+ | {{Aufgaben-blau|8|Welche Fragestellungen werden mit den vier Beispielen beantwortet?}} | ||
+ | |||
+ | {{Lösung versteckt|1=1. Beispiel: Wie viel kostet das teuerste Produkt?<br> | ||
+ | 2. Beispiel: Wie viele Einkäufe wurden mit Karte bezahlt?<br> | ||
+ | 3. Beispiel: Wie viele Produkte hat jeder einzelne Kunde mit Barzahlung eingekauft?<br> | ||
+ | 4. Beispiel: Welche Umsätze wurden am 26.8.2007 in jeder einzelnen Sparte gemacht? Ordne die Sparten nach der Höhe der Umsätze. Beginne mit dem höchsten Umsatz.}} | ||
+ | |||
+ | |||
+ | Eine Zusammenfassung erhältst du in diesem Video: | ||
+ | <center> {{#ev:youtube |Hqcv8PkDJ7A|300}}</center> | ||
+ | |||
+ | |||
+ | |||
+ | {{Aufgaben-blau|9|2=Beantworte die folgenden Aufgaben mit SQL-Abfragen. Notiere dir den SQL-Abfragetext.<br> | ||
+ | Achte besonders beim Datum auf die korrekte SQL-Schreibweise! | ||
+ | |||
+ | 1. Wie viel kostet das teuerste Produkt?<br> | ||
+ | 2. Wie viele Waren der Sparte „Lebensmittel“ wurden gekauft?<br> | ||
+ | 3. Wie viele Waren wurden bei Imagi gekauft?<br> | ||
+ | 4. Wie viel Geld wurde für Sportartikel ausgegeben?<br> | ||
+ | 5. Wie viele Waren, die mehr als 10 € kosten, wurden am 2.9.2007 gekauft?<br> | ||
+ | 6. Wie viele Waren wurden bei Imagi am 5.9.2007 gekauft?<br> | ||
+ | 7. Vergleiche den Gesamtumsatz bei Kartenzahlung mit dem Gesamtumsatz bei Barzahlung.<br> | ||
+ | 8. Wie viel kostete ein Kosmetikartikel durchschnittlich?<br> | ||
+ | 9. Wie viel Geld haben am 5.9.2007 die männlichen Kunden ausgegeben?<br> | ||
+ | 10. Liste in alphabetischer Reihenfolge alle Kunden mit der Summe ihrer Ausgaben auf.<br> | ||
+ | 11. Wie viel Geld haben insgesamt die männlichen Kunden und und wie viel insgesamt die weiblichen Kunden ausgegeben?<br> | ||
+ | 12. Liste alle Geschäfte sortiert nach mittlerem Preisniveau auf.<br> | ||
+ | 13. Liste alle Sparten auf. Es soll für jede Sparte der gesamte Umsatz am 6.9.2007 ausgegeben werden. Die Liste soll nach dem Gesamtumsatz sortiert sein, beginnend mit der umsatzstärksten Sparte.<br> | ||
+ | 14. Liste für jeden Tag die Summe der Preise aller gekauften Waren auf.<br> | ||
+ | 15. Wer hat das teuerste Produkt gekauft? <br> | ||
+ | 16. An welchem Tag waren die Einnahmen insgesamt am größten/kleinsten? }} | ||
+ | |||
+ | {{Lösung versteckt|1=1. 649,90€<br> | ||
+ | 2. 285<br> | ||
+ | 3. Imagi: 101<br> | ||
+ | 4. 509,75€<br> | ||
+ | 5. 6<br> | ||
+ | 6. 9<br> | ||
+ | 7. bar: 6306,80€ - Karte: 2281,02€<br> | ||
+ | 8. 9,05€<br> | ||
+ | 9. 194,19€<br> | ||
+ | 10. [[Datei:Abfrage 10.jpg|Abfrage_10]]<br> | ||
+ | 11. männliche Kunden: 3696,70€ - weibliche Kunden: 4892,92€<br> | ||
+ | 12. [[Datei:Abfrage 12.jpg|Abfrage_12]]<br> | ||
+ | 13. [[Datei:Abfrage 13.jpg|Abfrage_13]]<br> | ||
+ | 14. [[Datei:Abfrage 14.jpg|Abfrage_14]]<br> | ||
+ | 15. Nina Hofer<br> | ||
+ | 16. [[Datei:Abfrage 16.jpg|Abfrage_16]] | ||
+ | |||
+ | [[Datei:Arbeitsblatt Aggregatfunktionen-LÖSUNG.pdf|Lösungen]] }} | ||
+ | |||
+ | =Weitere Abfragen an einem neuen Beispiel= | ||
+ | |||
+ | Wir haben nun eine neue Datenbank "buch". Dazu wollen wir nun wieder Abfragen erstellen und die Ergebnistabelle anschauen. | ||
+ | |||
+ | {{Aufgaben-blau|10|2=a) Welche Bücher sind vom Autor Karl-August Aare?<br> | ||
+ | b) Gib von den Büchern des Autors Karl-August Aare Titel und Erscheinungsjahr an.<br> | ||
+ | c) Gib den gesamten Datenbestand aus.<br> | ||
+ | d) Gib alle Verlage ohne Mehrfachnennung an.<br> | ||
+ | e) Gib alle Titel, die teurer als 50€ sind an.<br> | ||
+ | f) Eigentlich haben alle Bücher eine ISBN. Dies kann aber nur bei geringem Datenbestand direkt erkannt werden!<br> | ||
+ | Gib alle Bücher mit fehlernder ISBN an.<br> | ||
+ | g) Was kostet das teuerste Buch? Welchen Titel hat es?<br> | ||
+ | h) Wie teuer ist der Bestand aller Bücher vom Verlag Kohlrabe?<br> | ||
+ | i) Was ist der Durchschnittspreis der Bücher vom Verlag Zeisig? | ||
+ | |||
+ | }} | ||
+ | |||
+ | {{Lösung versteckt|1=a) SELECT * FROM buch WHERE Autor = 'Aare, Karl-August'<br> | ||
+ | b) SELECT Titel, Erscheinungsjahr FROM buch WHERE Autor ='Aare, Karl-August'<br> | ||
+ | c) SELECT * FROM buch<br> | ||
+ | d) SELECT DISTINCT Verlag FROM buch<br> | ||
+ | e) SELECT Titel FROM buch WHERE Preis > 50 <br> | ||
+ | f) In der Tabelle haben alle Bücher eine ISBN (internationale Standard-Buch-Nummer)<br> | ||
+ | Lösche also einige ISBN-Einträge und mache dann die Abfrage.<br> | ||
+ | SELECT Titel FROM buch WHERE ISBN IS NULL<br> | ||
+ | g) SELECT MAX( Preis ) FROM buch --> 89€<br> | ||
+ | SELECT Preis, Titel FROM buch ORDER BY Preis DESC<br> | ||
+ | oder<br> | ||
+ | SELECT MAX( Preis ), Titel FROM buch GROUP BY Titel ORDER BY MAX( Preis ) DESC<br> | ||
+ | h) SELECT SUM( Preis ) FROM buch WHERE Verlag = 'Kohlrabe‘ --> 10978€<br> | ||
+ | i) SELECT AVG( Preis ) FROM buch WHERE Verlag = 'Zeisig‘ --> 54,82€ }} | ||
+ | |||
+ | {{Aufgaben-blau|11|2=Buch S. 88 / 1<br> | ||
+ | Buch S. 88 / 2<br> | ||
+ | Buch S. 88 / 3 }} | ||
+ | |||
+ | {{Lösung versteckt|1= 1a) SELECT Titel FROM buch --> 702 Titel bzw. SELECT DISTINCT Titel FROM buch --> 637 Titel<br> | ||
+ | b) SELECT DISTINCT Autor FROM buch ---> 438 Autoren<br> | ||
+ | 2a) SELECT Titel FROM buch WHERE Seitenzahl > 200 --> 38 Bücher<br> | ||
+ | b) SELECT Titel FROM buch WHERE Erscheinungsjahr > 1990 --> 149 Bücher<br> | ||
+ | c) SELECT Titel FROM buch WHERE Erscheinungsjahr >= 1990 AND Erscheinungsjahr <=1995 -->111 Bücher<br> | ||
+ | 3a) SELECT Titel, Autor FROM buch ORDER BY Titel<br> | ||
+ | b) SELECT Titel, Seitenzahl FROM buch ORDER BY Seitenzahl<br> | ||
+ | c) SELECT Titel, Seitenzahl FROM buch ORDER BY Seitenzahl DESC<br> | ||
+ | d) SELECT Titel, Autor, Seitenzahl FROM buch WHERE Erscheinungsjahr >=1990 AND Erscheinungsjahr <2000 ORDER BY Seitenzahl }} |
Aktuelle Version vom 16. Mai 2020, 09:09 Uhr
Bevor du mit Abfragen angänst, schau dir diesen Video zur Wiederholung des bisher Besprochenen an.
Inhaltsverzeichnis |
Abfragen
Welche Informationen benötigen bestimmte Personengruppen (z.B. Abteilungsleitung, Kunden, Kassierer(in) … aus der Datenbank „Einkauf“?
Welche Einkäufe wurden am 18.03.2006 getätigt?
Welche Waren wurden überhaupt gekauft?
Wie hoch ist der Preis jedes einzelnen gekauften Artikels?
Welche Kosmetikartikel gibt es?
…
In welcher Form sollen die Antworten ausgegeben werden?
Man hat eine Tabelle mit vielen eingetragenen Werten.
Man hat eine Fragen.
Man will eine Antwort.
Dies erfolgt mit Hilfe von Datenbanken, indem man für eine Tabelle eine Abfrage startet und die Antwort als Ergebnistabelle erhält.
↓
Frage
↓
Der Aufbau der Ergebnistabelle wird durch zwei Grundverfahren festgelegt:
Eine Selektion bedeutet eine Auswahl von Datensätzen (Zeilen) in der Datentabelle mit bestimmten Eigenschaften (z.B. Sparte = ’Lebensmittel’)
Bei dieser Selektion interessen welche Lebensmittel eingekauft wurden. Es werden also alle Datensätze in der bei Sparte "Lebensmittel" steht ausgegeben.
Eine Projektion wählt bestimmte Spalten in der Datentabelle aus (z. B. Kunde und Warenbezeichnung)
Bei dieser Projektion werden nur die Spalten Kunde und Warenbezeichnung ausgegeben, wenn einen interessiert was welcher Kunde gekauft hat.
Eine Abfragefuntkion besteht aus drei Teilen und ist immer gleich aufgebaut.
Eine Abfrage startet immer mit SELECT. Dahinter stehen die Spalten, die einen interessieren (Projektion). Danach kommt WHERE mit der Tabelle in der man nachschaut. Und zum Schluss WHERE mit den Bedingungen, die man wissen will (Selektion). |
1. Beispiel:
SELECT *
FROM einkauf
WHERE Geschäft = ‘Imagi‘
In OpenOfficeBase schreibt man dies in einer Zeile
Beachte dabei:
Nach SELECT bedeutet *, dass alle Spalten, also ein vollständiger Datensatz ausgegeben wird. Man kann hier auch nur einzelne Spalten, die einen interessieren schreiben.
Nach WHERE steht die Tabelle einkauf, die wir erzeugt hatten und in der alle unsere Datensätze stehen.
Geschäft = 'Imagi' nach WHERE ist die Bedingung, dass nur Einkäufe im Geschäft 'Imagi' ausgegeben werden sollen. Dabei ist der Geschäftsname in einfache Anführungszeichen (OpenOffice! Das kann in anderen SQL-Systemen anders sein) zu schreiben.
In OpenOffice Base startet man eine Abfrage, indem man in der linken Spalte Abfragen auswählt und dann in der Mitte Abfrage in SQL-Ansicht erstellen ... anklicken.
Dann öffnet sich ein neues Fenster in das man die Abfrage schreibt.
2. Beispiel:
In das gerade geöffnete Fenster schreibt man: SELECT Warenbezeichnung, Preis FROM einkauf WHERE Preis > 5
Um die Abfrage zu starten tippe auf die F5-Taste oder klicke auf der Seite oben bei den Icons auf "Abfrage aisführen (F5)".
Du erhältst dann dieses Bild:
In dieser Abfrage erkennt man schön den Unterschied von Selektion und Projektion.
Nach SELECT stehen die Spalten der Projektion (Es werden die Spalten Warenbezeichnung und Preis ausgewählt) und nach WHERE steht die Selektion, die Bedingung zur Auswahl der Datensätze (Es interessieren nur die Datensätze mit Preis über 5€).
Man kann in diesem Beispiel die Abfrage so ändern, dass man noch in der Selektion ORDER BY Preis ASC hinzufügt.
In der Ergebnistabelle werden die Datensätze nun nach aufsteigendem Preis ausgegeben.
Schreibt man ORDER BY Preis DESC, dann werden die Datensätze sortiert nach absteigendem Preis ausgegeben.
Mit dem Zusatz ORDER BY Preis oder ORDER BY Preis ASC wird die Ergebnistabelle nach der genannten Spalte aufsteigend geordnet. Der Zusatz ORDER BY Preis DESC ordnet in absteigender Reihenfolge. |
a) Was kostet eine Kinokarte?
b) Welche Waren außer "Unterhaltung" wurden zu welchem Preis gekauft.
c) Welche Waren mit Preis wurden am 26. August 2007 gekauft und bar bezahlt.
Macht man diese Abfrage: SELECT Warenbezeichnung FROM einkauf ORDER BY Warenbezeichnung ASC;
dann erhält man eine Ausgabetabelle mit vielen Einträgen wie Banane, Backwaren, ...
Um nun diese vielen gleichen Einträge in der Ergebnistabelle zu vermeiden schreibt man nach SELECT DISTINCT.
Mit der Abfrage SELECT DISTINCT Warenbezeichnung FROM einkauf ORDER BY Warenbezeichnung ASC; werden in der Ergebnistabelle Banane, Backwaren, ... nur einmal aufgeführt.
Redundante Anzeigen vermeiden: |
Schaue nicht gleich die Lösungen an, sondern probiere es zuerst selbst. Betrachte deine Ergebnistabelle und überlege, ob diese die gestellte Frage beantwortet.
Beachte bei der Selektion wird ein Text in der Bedingung in einfachen Anführungszeichen (über der rechten Hochstelltaste ist als hochgestellt ')geschrieben .
Bötig, Klaus:
Athen / Klaus Bötig - 3., aktua...
(DuMont direkt) - 2015
Bötig, Klaus:
Athen : Reisen mit Insider-Tipps - 2015
Brinke, Margit ; Kränzle, Peter:
Athen : [Reise-Know-how : City-Trip]
(City-Trip ; 12) - 2018
Deutsche Redewendungen und was dahintersteckt : Ursprung und Bedeutung von über 700 Sprichwörtern - 2013
Dudde, Lasse:
Santorin / Lasse Dudde
(Merian live!) - 2019
Griechenland, Athen & Festland / Marc Dubin...
(Vis-à-vis) - 2015
Hashimi, Nadia:
Wenn die Nacht am hellsten ist : Roman - 2017
Holler, Renée:
Im Visier der Schmugglerbande / Renée Holler
(Tatort Erde) - 2009
Jaeckel, E. Katja:
MERIAN live! Reiseführer Athen - 2018
Kanaris, Leo:
Die Toten von Athen : ein Fall für Detektiv Zafiris : Kriminalroman - 2018
Es wird der Autor, der Titel des Buches, eventuell (???) und das Erscheinungsjahr angezeigt.
Man macht keine Abfrage mit SELECT ..... , sondern gibt nur in vorgegebene Felder passende Begriffe ein.
In der Stadtbücherei gibt es keine Bücher von Markus Naser.
Hier ist alles über Abfragen noch einmal zusammengefasst:
a) nein
b) ja
Aggregatfunktionen
Wir wollen Daten nicht nur auswählen, sondern auch auswerten. Man macht dies mit Aggregatsfunktionen.
Beispiel:
- Wie viel kostet die teuerste Ware?
- Wie viele Waren wurden mit Karte bezahlt?
- Wie viel hat Chantal Amberg insgesamt ausgegeben?
Zahlen auswerten kennst du aus der Mathematik. Dort hat man mathematische Funktionen, die einem dabei helfen. Du hast sie auch schon in der Tabellenkalkulation kennengelernt. Zum Beispiel:
SUMME(Zahl1; Zahl2; …)
MITTELWERT(Zahl1; Zahl2; …)
MAX(Zahl1; Zahl2; …)
MIN(Zahl1; Zahl2; …)
ANZAHL(Zahl1; Zahl2; …)
Diese Funktionen gibt es auch in SQL.
Mathematische Funktionen | SQL | Bedeutung |
---|---|---|
SUMME(Zahl1; Zahl2; …) | SUM(Spalte) | Summe der Spaltenwerte |
MITTELWERT(Zahl1; Zahl2; …) | AVG(Spalte) | Durchschnitt der Spaltenwerte |
MAX(Zahl1; Zahl2; …) | MAX(Spalte) | Maximalwert der Spaltenwerte |
MIN(Zahl1; Zahl2; …) | MIN(Spalte) | Minimalwert der Spaltenwerte |
ANZAHL(Zahl1; Zahl2; …) | COUNT(*) | Anzahl der Datensätze |
Beachte, dass bei den ersten 4 Funktionen nach der Funktion in runden Klammern die Spalte angegeben wird, während bei der Anzahl der Datensätze nach COUNT in runden Klammern * steht, da alle Datensätze gezählt werden. Das * kennst du bereits aus den Abfragen, wenn der gesamte Datensatz (Zeile) ausgegeben werden sollte, dann machte man * nach SELECT.
Als nächstes betrachten wir Beispiele aus unserer Datenbank einkauf.
- SELECT MAX( Preis ) FROM einkauf
- SELECT COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'Karte‘‚
- SELECT Kunde, COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'bar' GROUP BY Kunde
- SELECT Sparte, SUM(Preis ) AS Summe FROM einkauf WHERE Kaufdatum = '2007-08-26' GROUP BY Sparte ORDER BY SUM( Preis ) DESC
Was passiert bei diesen Abfragen?
Bei der Abfrage SELECT MAX(Preis) FROM einkauf wird in der Tabelle einkauf in der Spalte Preis der Maximalwert gesucht.
Der gefundene Maximalwert wird in der Ergebnistabelle ausgegeben.
Die Ergebnistabelle ist hier eine Tabelle mit einer Zeile. Der Spaltenbezeichner ist hierbei automatisch erstellt.
Bei der Abfrage SELECT COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'Karte‘ wird in der Tabelle einkauf in der Spalte Zahlungsart die Anzahl der Einträge "Karte" gezählt.
In der Ergebnistabelle wird die Auswertung der Aggregatfunktion, also die Anzahl der Kartenzahlungen ausgegeben.
Beachte, dass hier die Bezeichnung in der Ergebnistabelle durch Angabe von AS Anzahl den Spaltenbezeichner Anzahl erhält.
Bei der Abfrage SELECT Kunde, COUNT( * ) AS Anzahl FROM einkauf WHERE Zahlungsart = 'bar' GROUP BY Kunde wird in der Tabelle einkauf in der Spalte Zahlungsart zuerst die Zahlungsart "bar" ausgewählt und nach Kunden sortiert.
Auswertung der Bedingung Zahlungsart = ’bar’, Zusammenfassung in Gruppen nach Kunden
Danach werden für jeden Kunden die Anzahl der Barzahlungen berechnet und ausgegeben.
Ausgabe des Kunden und Auswertung der Aggregatfunktion für jede Gruppe
Merke:
WICHTIG: Stehen nach SELECT Aggragatfunktionen, dann dürfen unter SELECT außer den Aggregatfunktionen nur Spalten erscheinen, die unter GROUP BY aufgeführt sind! |
In der Abfrage SELECT Sparte, SUM(Preis ) AS Summe FROM einkauf WHERE Kaufdatum = '2007-08-26' GROUP BY Sparte ORDER BY SUM( Preis ) DESC werden zuerst in der Tabelle einkauf die Datensätze mit den Kaufdatum 26.8.2007 ausgewählt.
Auswahl der Datensätze mit Kaufdatum 26.08.2007
Danach werden Gruppen der gleichen Sparte gebildet und die Summenfunktion darauf angewendet.
Bildung von Gruppen gleicher Sparte, Anwendung der SUM-Funktion auf diese Gruppen
Zum Schluss wiwrd noch absteigend nach dem Summenbetrag sortiert.
Absteigendes (DESC) Sortieren nach den entstandenen Summenwerten
1. Beispiel: Wie viel kostet das teuerste Produkt?
2. Beispiel: Wie viele Einkäufe wurden mit Karte bezahlt?
3. Beispiel: Wie viele Produkte hat jeder einzelne Kunde mit Barzahlung eingekauft?
Eine Zusammenfassung erhältst du in diesem Video:
1. 649,90€
2. 285
3. Imagi: 101
4. 509,75€
5. 6
6. 9
7. bar: 6306,80€ - Karte: 2281,02€
8. 9,05€
9. 194,19€
10.
11. männliche Kunden: 3696,70€ - weibliche Kunden: 4892,92€
12.
13.
14.
15. Nina Hofer
16.
Weitere Abfragen an einem neuen Beispiel
Wir haben nun eine neue Datenbank "buch". Dazu wollen wir nun wieder Abfragen erstellen und die Ergebnistabelle anschauen.
a) SELECT * FROM buch WHERE Autor = 'Aare, Karl-August'
b) SELECT Titel, Erscheinungsjahr FROM buch WHERE Autor ='Aare, Karl-August'
c) SELECT * FROM buch
d) SELECT DISTINCT Verlag FROM buch
e) SELECT Titel FROM buch WHERE Preis > 50
f) In der Tabelle haben alle Bücher eine ISBN (internationale Standard-Buch-Nummer)
Lösche also einige ISBN-Einträge und mache dann die Abfrage.
SELECT Titel FROM buch WHERE ISBN IS NULL
g) SELECT MAX( Preis ) FROM buch --> 89€
SELECT Preis, Titel FROM buch ORDER BY Preis DESC
oder
SELECT MAX( Preis ), Titel FROM buch GROUP BY Titel ORDER BY MAX( Preis ) DESC
h) SELECT SUM( Preis ) FROM buch WHERE Verlag = 'Kohlrabe‘ --> 10978€
1a) SELECT Titel FROM buch --> 702 Titel bzw. SELECT DISTINCT Titel FROM buch --> 637 Titel
b) SELECT DISTINCT Autor FROM buch ---> 438 Autoren
2a) SELECT Titel FROM buch WHERE Seitenzahl > 200 --> 38 Bücher
b) SELECT Titel FROM buch WHERE Erscheinungsjahr > 1990 --> 149 Bücher
c) SELECT Titel FROM buch WHERE Erscheinungsjahr >= 1990 AND Erscheinungsjahr <=1995 -->111 Bücher
3a) SELECT Titel, Autor FROM buch ORDER BY Titel
b) SELECT Titel, Seitenzahl FROM buch ORDER BY Seitenzahl
c) SELECT Titel, Seitenzahl FROM buch ORDER BY Seitenzahl DESC