Informatik - Modellierung von Datenbanken
Bevor du mit Abfragen angänst, schau dir diesen Video zur Wiederholung des bisher Besprochenen an.
Inhaltsverzeichnis[Verbergen] |
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. |
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: |
Hier ist alles über Abfragen noch einmal zusammengefasst:
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
Eine Zusammenfassung erhältst du in diesem Video: