Startseite
  Abfragen

Abfragen






SQL-Abfragen

In einem ersten Abschnitt haben wir Datenbanken modelliert. Dies endete mit dem vollständigen Klassendiagramm. Im zweiten Teil haben wir die Datenbank dann mithilfe eines Frontends auf dem PC in der Datenbank MySQL umgesetzt und mit Daten gefüllt. Im letzten Abschnitt werden wir nun gezielt Informationen aus der Datenbank holen. Dazu bedienen wir uns der Abfragesprache SQL. Die SQL-Befehle können wir wieder bequem in das Frontend eintragen und uns das Ergebnis ansehen.





Structured Query Language


Die Datenbanksprache SQL (Structured Query Language) erlaubt den Aufbau relationaler Datenbanken sowie die Verwaltung und Veränderung des darin enthaltenen Datenbestandes. SQL wurde Anfang der achtziger Jahre von IBM entwickelt und ist heute als (mehr oder weniger) herstellerunabhängiger Standard bei relationalen Datenbanken akzeptiert. Der derzeit aktuelle Standard heißt "SQL/92".
Das Erstellen von Tabellen, das Eintragen und Verändern von Datensätzen, das Löschen von Einträgen und Datensätzen, sogar die Datensicherung und Rücksicherung lässt sich
mit SQL-Befehlen bewerkstelligen.
Ich werde mich im Folgenden aber auf einfache Abfragen von Informationen aus Tabellen beschränken. Für weitere SQL-Befehle sei auf weiterführende das Literatur verwiesen.
Folgende Tabelle mit dem Namen "LEHRER" sei gegeben:


IDNameVornameGeschlechtOrt
023HindelangFlorianmHof
109FriedrichManuelMBayreuth
943HackerRolandMBayreuth
933GottwaldAndreaWHof
024MeisterAnnewMünchberg


Abfragen haben den Sinn, gezielt Informationen aus einer oder mehreren Tabellen zu erhalten. Das Ergebnis ist stets wieder eine Tabelle. Ggf. ist die Tabelle aber nur eine Zelle groß. Jede Abfrage beginnt mit dem Wort SELECT. Dann kommen die Attribute, die ausgewählt werden und dann das Wort FROM gefolgt von dem Name der Tabelle, aus dem die Daten ausgewählt werden sollen. I.d.R. endet die Anweisung mit einem Semikolon.

Beispiel: SELCET ID, Name, Vorname, Geschlecht, Ort FROM lehrer;
Als Ergebnis zeigt mir das Frontend die gesamte Tabelle von oben an.

Hinweis: Wenn ich alle Attribute auswählen will kann ich als Platzhalter auch das Zeichen "*" verwenden, d.h.
SELECT * FROM lehrer;
ergibt dasselbe Ergebnis.

In fünf Beispielen werde ich nun den Sprachumfang jeweils etwas erweitern:





Erweiterung der Abfrage


Beispiel 1:
Sortierte Ausgabe des Ergebnisses

Mit der ORDER BY-Anweisung kann das Ergebnis in alphanumerischer Reihenfolge sortiert ausgegeben werden.
Die Anweisung wird an das Ende der Anweisung geschrieben.

SELECT * FROM lehrer ORDER BY Nachname;
Damit wird die Tabelle nach den Nachnamen sortiert ausgegeben.
IDNameVornameGeschlechtOrt
109FriedrichManuelMBayreuth
933GottwaldAndreaWHof
943HackerRolandMBayreuth
023HindelangFlorianmHof
024MeisterAnnewMünchberg




Beispiel 2:
Projektion auf einzelne Spalten

Mit der Auswahl einzelner Attribute kann das Ergebnis beschränkt werden auf einige Attribute.


SELECT Name, Vorname FROM lehrer ORDER BY Nachname;
Damit werden von der Tabelle nur noch die beiden ausgewählten Spalten ausgegeben.

NameVorname
FriedrichManuel
GottwaldAndrea
HackerRoland
HindelangFlorian
MeisterAnne



Beispiel 3:
Selektion bestimmter Datensätze

Mit der WHERE-Anweisung kann das Ergebnis auf bestimmte Datensätze, also auf bestimmte Zeilen beschränkt werden. Die WHERE-Anweisung wird direkt hinter den Tabellennamen eingefügt.

SELECT * FROM lehrer WHERE Ort="Hof";
Damit werden nur Daten ausgegeben, bei denen die WHERE-Anweisung wahr ist.

IDNameVornameGeschlechtOrt
933GottwaldAndreaWHof
023HindelangFlorianmHof


Beispiel 4:
Doppelte Einträge im Ergebnis vermeiden

Mit der DISTINCT-Anweisung werden doppelte Einträge im Ergebnis vermieden.
Die Anweisung wird direkt vor das Attribut geschrieben.

SELECT DISTINCT Ort FROM lehrer ORDER BY Ort;
Damit werden die Orte nur einmal ausgegeben, auch wenn der Ort in mehr als einer Zeile vorkommt.

Ort
Bayreuth
Hof
Münchberg


Beispiel 5:
Aggregat-Funktionen (oft in Verbindung mit der GROUP-BY-Klausel)

Die Aggregat-Funktionen SUM (Summe), AVG (Durchschnitt), MAX (größter Wert), MIN (kleinster Wert) und COUNT (Anzahl der Einträge), sind oft in Verbindung mit der Gruppierungsfunktion sinnvoll. Folgendes Beispiel soll dies verdeutlichen:

SELECT Ort, COUNT(Ort) FROM lehrer GROUP BY Ort;

OrtCount(Ort)
Bayreuth2
Hof2
Münchberg1


Mit der Group-BY-Anweisung werden gleiche Ergebnisse zusammengefasst. Es enstpricht damit im wesentlichen der Distinct-Funktion. Durch die COUNT(ORT) Funktion wird zudem eine Spalte ausgegeben, in der die Anzahl der Einträge gezählt wird.

Die Tabellenüberschrift COUNT(ORT) ist nicht schön. Wir können einen anderen Namen wählen, indem wir nach der Spaltenbenennung die Anweisung AS Irgendeinname einfügen.

SELECT Ort, COUNT(Ort) AS Anzahl FROM lehrer GROUP BY Ort;

OrtAnzahl
Bayreuth2
Hof2
Münchberg1









Übung macht den Meister...

Gegeben ist wieder das Klassendiagramm unseres Unternehmens (Fertigungsbetrieb) Formuliere SQL-Abfragen zu folgenden Problemen!

Übung 1:
Hat es heute Bestellungen gegeben?

Übung 2:
Wie viele Geräte mit der GID 1815 sind zur Zeit vorrätig?

Übung 3:
Wie hoch ist der aktuelle Beitragssatz der AOK?

Übung 4:
Gib eine Liste mit allen vorrätigen Geräten aus. Es soll bei jedem Gerät die GID, die Bezeichnung und der Vorrat angegeben werden.

Übung 5:
Sehr schwierig: Gib den aktuellen Wert der Maschinen an. Es wird von einem linearen Werteverzehr ausgegangen, d.h. eine Maschine mit einer Nutzungdsauer von 10 Jahren und einem Preis von 10.000,-- EUR ist nach 4 Jahren noch 6.000,-- EUR wert.

Beachte, dass in einer Projektion auch gerechnet werden kann, z.B. SELECT (Nutzungdsauer+Anschaffungsjahr) FROM maschine usw.

Lösungsansatz Übung 1:
Aus der Tabelle lässt sich das leicht herauslesen, wenn man das heutige Datum eingibt, z.B. für den 15. September 2004 (Datumsformat: 2004-09-15)

SELECT * FROM bestellung WHERE Bestelldatum="2004-09-15";

Lösungsansatz Übung 2:
SELECT Vorrat FROM gerät WHERE GID=9815;

Lösungsansatz Übung 3:
SELECT Beitragssatz FROM krankenversicherung WHERE Name="AOK";

Lösungsansatz Übung 4:
SELECT GID, Bezeichnung, Vorrat FROM gerät;

Lösungsansatz Übung 5:
Der aktuelle Wert ergibt sich durch gleichmässigen Werteverzehr über die Nutzungsdauer. Nur die Geräte, deren Anschaffungsjahr plus der Nutzungsdauer größer als das aktuelle Jahr sind sollen aufgenommen werden. Als Wert ist dann vom Preis der Werteverzehr, das sind Preis geteilt durch Nutzungsdauer mal (dieses Jahr minus Anschaffungsjahr) aufzulisten. Zu Guterletzt muss auch noch berücksichtigt werden, dass es mehr als eine dieser Maschinen geben kann.

SELECT (Preis/Nutzungsdauer) AS AFA,(2004-Anschaffungsjahr) AS Jahre, ((Preis - (Preis / Nutzungsdauer*(2004-Anschaffungsjahr)))*Stückzahl) AS Wert, MID, Bezeichnung, Anschaffungsjahr, Nutzungsdauer, Preis, Stückzahl from maschine WHERE (Anschaffungsjahr + Nutzungsdauer)>2004;

Ein ganz schönes Ungeheuer, füge den Befehl in das Frontend ein und sehe dir das Ergebnis an, evtl. verinfachst du die Abfrage auch. Beim Spielen mit den SQL-Befehlen lernt man am meisten! Für alle , die ein anderes Ergebnis herausbekommen haben, ich habe den Wert für den Jahresanfang berechnet und keine monatliche Afa vorgenommen, sondern für alle Geräte ein ganzes Jahr abgeschrieben.





Aufgabe

Aufgabe 1:
Lasse dir alle Ergebnisse von der Datenbank anzeigen. D.h. gib alle SQL-Abfragen in das Frontend ein!

Aufgabe 2:
Erstelle eine Datenbank zur Verwaltung deiner CD-Sammlung mit ID, Namen, Standort, Jahr, Preis. Gebe einige CDs ein und suche nach geeigneten Fragestellungen: Wie viele CDs sind älter als 10 Jahre, wie hoch ist der Durchschnittspreis, wo ist die CD mit der Nr. 123 usw.





Grundwissen Lektion Abfragen

Aggregatfunktionen:
Bezeichnung für die Standardfunktionen in SQL: SUM, AVG, MAX, MIN, oft verwendet mit der GROUP BY-Klausel.
SELECT:
Mit dieser Anweisung beginnen alle Datenbank-Abfragen.
FROM:
Anweisung, aus welcher Tabelle Informationen abgefragt werden.
WHERE:
Beginn einer Selektions-Anweisung. Die Auswahl wird auf bestimmte Merkmale beschränkt, d.h. von einer Tabelle werden nur bestimmte Zeilen ausgewählt.
ORDER BY:
Anweisung für eine alphabetisch sortierte Ausgabe.
Distinct:
Anweisung, keine doppelten Einträge anzuzeigen. Die Anweisung wird zu eine Spalte hinzugeschrieben, z.B. SELECT Distinct Name from lehrer WHERE Name="Müller";




Copyright 2003 - Letzte Änderung am 4. September 2004