![]() | ![]() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() | ![]() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Komplexe Abfragen
Es geht auf die Zielgerade zu. Wir werden nun im letzten Kapitel lernen, wie man Informationen aus mehr als einer Tabelle herausbekommt. Das nennt man in der Datenbank-Sprache auch Join.
Erweiterung der SQL-Kenntnisse Betrachte die Anweisung Select Personal.Name from Personal Anstelle nur des Attributes kann auch der Name der Tabelle mit angegeben werden. Dieser ist durch einen Punkt mit dem Attribut zu verbinden. Dies ist wichtig, wenn wir mehr als eine Tabelle haben und die Attribute den gleichen Namen haben wie im folgenden Beispiel: Die Tabelle PERSONAL habe folgende Attribute: ID, Vorname und Name.
Die Tabelle Ort habe diese Attribute: ID, Name
Hier ist die Angabe der Tabellennamen in der Abfrage anzugeben, sonst weiss der Computer nicht, welchen Namen er lesen soll: SELECT Personal.Name, Vorname, Ort.Name AS Ort FROM personal, ort; Du siehst, wie einfach es ist, Informationen aus zwei Tabellen abzufragen, man gibt einfach beide Tabellennamen - durch Komma getrennt -an. Leider sieht das Ergebnis der Abfrage so aus:
Wo wohnen die Mitarbeiter denn nun? Der Computer hat einfach jeden Eintrag aus der Tabelle PERSONAL mit jedem Eintrag aus der Tabelle ORT kombiniert, so etwas nennen Mathematiker ein Kreuzprodukt (jedes mit jedem). Das Ergebnis ist natürlich unsinnig. Jeder Mitarbeiter hat nur einen Wohnort. Abfragen über mehr als eine Tabelle benötigen daher eine sinnvolle Bedingung: Select Personal.Name, Vorname, Ort.Name AS Ort from Personal, Ort WHERE Ortsnr=ID; Es werden die zusammengehördenden Schlüssel der Tabellen einfach gleichgesetzt. Durch die eindeutige Bedingung kommen dann nur die richtigen Ergebnisse zum Vorschein. Probier es selbst aus! Jetzt kannst du aus allen Tabellen die notwendigen Informationen herauslesen, also auch aus drei, vier oder mehr Tabellen auf einmal, aber Vorsicht! Vergesse nicht bei jeder Beziehung die notwendige Bedingung hinzuzufügen.
Wähle die Namen der Mitarbeiter und den Namen der Maschine aus, die die Maschine mit der Nummer MID=1 bedienen können. SELECT Name, Bezeichnung FROM Personal,Maschine,bedient WHERE Personal.PID=bedient.PID AND bedient.MID=Maschine.MID AND Maschine.MID=1; Welche Kunden haben in der letzten Woche eine Bestellung aufgegeben? Select Distinct Name AS Kunde from Kunde, hat_bestellt WHERE Lieferdatum < '2004-01-28' AND Lieferdatum>'2004-01-19'; (Eine Eingabe der Tabellennamen ist hier nicht erforderlich, da die Attribute eindeutig sind. Die Angabe Distinct vermeidet die Ausgabe doppelter Einträge.)
Übung 1: Gesucht sind der Name und die PersonalNr der Mitarbeiter, die in diesem Jahr, z.B. 2005 in den Ruhestand übertreten (65 Jahre alt werden). Das Datum in MySQL wird im Format JJJJ-MM-TT geschrieben, z.B. "2004-12-31". Übung 2: Gesucht ist eine Liste mit Bauteilen (BID, Bezeichnung und Vorrat) für das Gerät mit der GID 1. Übung 3: Gib die SQL-Anweisung an, die uns eine Liste der Namen der Krankenversicherungen liefert und die Anzahl der jeweils bei der einzelnen Versicherung versicherten Personen! Übung 4: Die gesamte lineare Afa aller Maschinen in diesem Jahr. Übung 5: Der Wert aller vorrätigen Bauteile. Lösungsansatz Übung 1: - SELECT * from personal where Geburtsdatum<='1940-12-31'; Lösungsansatz Übung 2: SELECT Bezeichnung, bauteil.BID, Vorrat FROM bauteil, besteht_aus WHERE bauteil.BID = besteht_aus.BID AND GID=1; Lösungsansatz Übung 3: SELECT krankenversicherung.Name, count(*) FROM krankenversicherung, personal WHERE ist_versichert=KID GROUP BY Name; Lösungsansatz Übung 4: SELECT SUM(Stückzahl * Preis / Nutzungsdauer) AS Afa FROM maschine WHERE ((Anschaffungsjahr+Nutzungsdauer)>2004); Lösungsansatz Übung 5: SELECT SUM(EK*Vorrat) FROM bauteil;
Damit sind wir am Ende unseres Stoffes angelangt. Vielen Dank für's Durchhalten! Am Ende bist du allerdings nur mit dem Schulstoff. In die Welt der Datenbanken hast du einen kleinen Einblick gewonnen. Formulare und Berichte hast du noch nicht kennengelernt. Aber das sind nur Feinheiten, die du dir ggf. selbst beibringen kannst. Sie werden im Rahmen dieser eLearning-Einheit nicht behandelt, da sie sehr systemabhängig sind. In Microsoft Access sieht das anders aus als mit der Programmiersprache PHP und wieder anders in Delphi oder JAVA. Die Modellierung und die SQL-Abfragen sind aber auf allen Systemen fast identlisch.
JOIN: Bezeichnung für eine Datenbankabfrage aus mehr als einer Tabelle. Da der Computer bei SQL-Anfragen von mehr als einer Tabelle das Kreuzprodukt zurückliefert, ist die Angabe einer geeigneten Bedingung erforderlich. Copyright 2003 - Letzte Änderung am 4. September 2004 |