Online-Kurs 'Datenbanken und Datenmodellierung' SQL - Anfragen Print-Version - 15.04.2002 (c) StR S. Winter - Universität Passau Inhaltsverzeichnis 1 Der Aufbau von SQL-Anfragen im Überblick 1.1 Der Aufbau einer SQL-Anfrage 2 Einfache SQL-Anfragen 2.1 SELECT - FROM - Anfrage 2.2 Auswahl aller Attribute 2.3 Vermeidung von Duplikaten 2.4 Umbenennung der Ergebnisspalten - Alias 2.5 Übungen 3 SQL-Anfragen mit Bedingungen 3.1 Anfrage mit Bedingung 3.2 Syntaxdiagramm 3.3 Übungen 4 Sortierung der Ergebnismenge 4.1 Die ORDER BY- Klausel 4.2 Aufsteigende und absteigende Sortierung 4.3 Übungen 5 Gruppieren von Datensätzen 5.1 Die GROUP BY- Klausel 5.2 Aggregatfunktionen 5.3 Aggregatfunktion ohne GROUP BY- Klausel 5.4 Rechenoperationen in SQL 5.5 Übungen 6 Gruppierungen mit Bedingungen 6.1 Die HAVING - Klausel 6.2 Übungen 7 SQL-Anfragen über mehrere Tabellen 7.1 Verknüpfung von Tabellen - Join 7.2 Bedeutung der WHERE-Klausel 7.3 Self-Join 7.4 Übungen 8 Geschachtelte SQL-Anfragen mit Vergleichsoperatoren 8.1 Teilanfragen (Subqueries) mit einem Ergebnis 8.2 Übungen 9 Geschachtelte SQL-Anfragen mit speziellen Operatoren 9.1 Teilanfragen mit mehr als einem Ergebnis 9.2 Eine einfache Möglichkeit mit dem IN - Operator 9.3 Erweiterte Möglichkeiten 9.4 Übungen 10 Unteranfragen in der SELECT-Klausel, Korreliertheit 10.1 Unteranfragen in der SELECT-Klausel 10.2 Korrelierte Unteranfragen 10.3 Übungen 11 Verknüpfen mehrerer Ergebnismengen 11.1 UNION-, INTERSECT- und EXCEPT- Operation 11.2 Übungen 12 Weitere Sprachkonstrukte 12.1 Der LIKE-Operator 12.2 Übungen 13 Das Erstellen von Sichten (Views) 13.1 Was sind Sichten (Views) 13.2 Die CREATE VIEW - Anweisung 13.3 Syntaxdiagramm 13.4 Arbeiten mit Views 13.5 Übungen 14 Das Löschen von Sichten (Views) 14.1 Die DROP VIEW - Anweisung 14.2 Syntaxdiagramm 15 SQL mit MS ACCESS 15.1 Ansichten in MS ACCESS 15.2 Die SQL-Ansicht in MS ACCESS 15.3 Aufruf der SQL-Ansicht 1 Der Aufbau von SQL-Anfragen im Überblick 1.1 Der Aufbau einer SQL-Anfrage Anfragen (Queries) in SQL orientieren sich grundsätzlich an folgendem Schema: Reihenfolge SQL-Klausel Bedeutung Angabe notwendig 1 SELECT Auswahl der gewünschten Attribute ja 2 FROM Angabe der Tabelle(n), die die gewünschte Information enthalten ja 3 WHERE Angabe von Bedingungen für die gesuchte Information nein 4 GROUP BY (HAVING) Gruppieren der Daten nach bestimmten Kategorien nein 5 ORDER BY nein Sortierung des Ergebnisses Die Klauseln mit den Schlüsselwörtern WHERE, GROUP BY, HAVING, ORDER BY sind optional. Die Reihenfolge der einzelnen Klauseln ist aber verbindlich. Wird eine Anfrage an die Datenbank gestellt, so erhält man die gewünschte Information in Form einer Tabelle, der Ergebnistabelle, zurück. Das untenstehende Syntaxdiagramm zeigt alle Möglichkeiten einer SQL-Anfrage. Bemerkung: Im Rahmen dieses Kapitels werden nur die wichtigsten - aber in der Regel ausreichenden - Möglichkeiten hinsichtlich der SQL-Anfragen besprochen. Die Syntaxdiagramme dagegen zeigen alle Möglichkeiten auf. Vertiefende Informationen zu den nicht näher erläuterten Konstrukte finden Sie beispielsweise bei [DD98] . Bemerkung: Die nachfolgenden Übungsbeispiele können auf der Offline-Datenbank nachvollzogen werden. Achten Sie darauf, dass Sie auf dem vollständigen Datenbestand arbeiten. Eventuell müssen Sie die Datenbank füllen. 2 Einfache SQL-Anfragen 2.1 SELECT - FROM - Anfrage Die einfachste Form einer SQL-Anfrage besteht aus der SELECT - und der FROM - Klausel. Beispiel: Welche Lehrerinnen und Lehrer - unter Angabe des Namens - gibt es im Kollegium? SQL - Anfrage Ergebnis - Tabelle SELECT Name FROM Lehrkraft ; Das SQL-Statement wird vom System folgendermaßen interpretiert: Nimm die Spalte Name der Tabelle Lehrkraft und zeige alle in dieser Spalte eingetragenen Daten an. Als Ergebnis liefert die Datenbank eine einspaltige Ergebnistabelle mit der Spaltenüberschrift Name zurück. Um mehrere Attribute auszuwählen, werden in der SELECT - Klausel die gewünschten Spaltennamen, durch Kommata getrennt, angegeben. Beispiel: Welche Lehrerinnen und Lehrer - unter Angabe von Personalnummer und Namen - gibt es im Kollegium? SQL - Anfrage Ergebnis - Tabelle SELECT PersNr, Name FROM Lehrkraft ; Die Reihenfolge der Spaltennamen in der SELECT- Klausel legt dabei die Anordnung der Ergebnisspalten fest. Beispiel: Welche Lehrerinnen und Lehrer - unter Angabe Namen und Personalnummer - gibt es im Kollegium? SQL - Anfrage Ergebnis - Tabelle SELECT Name, PersNr FROM Lehrkraft ; 2.2 Auswahl aller Attribute Will man alle Spalten einer Tabelle anzeigen lassen, gibt man hinter dem SELECT - Schlüsselwort einen Stern * an. Beispiel: Welche Daten sind über die Schülerinnen und Schüler gespeichert? SQL Anfrage Ergebnis - Tabelle SELECT * FROM Schueler ; 2.3 Vermeidung von Duplikaten In zahlreichen Fällen kommt derselbe Wert in einer gegebenen Spalte mehrmals vor. Beispiel: Aus welchen Orten kommen die Mitglieder des Lehrerkollegiums? SQL - Anfrage Ergebnis - Tabelle SELECT Wohnort FROM Lehrkraft ; Duplikate werden also nicht automatisch ausgesondert. Um Mehrfachnennungen zu vermeiden, bietet SQL das Schlüsselwort DISTINCT an. Beispiel: Welche unterschiedlichen Wohnorte haben die Mitglieder des Lehrerkollegiums? SQL - Anfrage Ergebnis - Tabelle SELECT DISTINCT Wohnort FROM Lehrkraft ; Das Schlüsselwort ALL erzwingt die Ausgabe aller Datensätze inklusive Duplikaten. Die Angabe ist aber nicht unbedingt notwendig. Die Queries SELECT Wohnort FROM Lehrkraft ; bzw. SELECT ALL Wohnort FROM Lehrkraft ; liefern identische Ergebnisse. Das Schlüsselwort ALL erzwingt die Ausgabe aller Datensätze inklusive Duplikaten. Die Angabe ist aber nicht unbedingt notwendig. Die Queries SELECT Wohnort FROM Professor ; bzw. SELECT ALL Wohnort FROM Professor ; liefern identische Ergebnisse. 2.4 Umbenennung der Ergebnisspalten - Alias Zum besseren Verständnis der Ergebnistabelle ist es oft zweckmäßig, die Ergebnisspalten anders zu bezeichnen. Diese Umbenennung nennt man ALIAS. Dazu ist nur die Angabe des Schlüsselwortes AS und des gewünschten Namens in der SELECT - Klausel erforderlich. Beispiel: Welche Lehrerinnen und Lehrer gibt es im Kollegium? Gewünscht sind nur die Namen. Die ausgegebene Ergebnisspalte soll "Lehrerkollegium" heißen. SQL - Anfrage Ergebnis - Tabelle SELECT Name AS Lehrerkollegium FROM Lehrkraft ; Bemerkung: ● Das Schlüsselwort AS ist neu in SQL/92 und wird nicht von allen Systemen akzeptiert. MS ACCESS verlangt die in SQL/92 vorgegebene Schreibweise. Bei ORACLE kann das Wort AS weggelassen werden, dafür muss der Aliasname in Anführungsstriche gesetzt werden. Die SELECT - Klausel lautet damit SELECT Name "Lehrerkollegium" ; ● Der neue Spaltenname darf keine Leer- oder Sonderzeichen enthalten. 2.5 Übungen Aufgabe: Welche Lehrkräfte - unter Angabe von Personalnummer, Name und Geschlecht - gibt es im Kollegium? Lösungsvorschlag: SELECT PersNr, Name, Geschlecht FROM Lehrkraft ; Aufgabe: Welche Schülerinnen und Schüler - unter Angabe von Eintrittsjahr, Nummer und Name - sind an der Schule? Lösungsvorschlag: SELECT Eintrittsjahr, Nr, Name FROM Schueler ; Aufgabe: Welche Fächer werden an der Schule unterrichtet? Die Ausgabespalte soll den Namen "Angebotene Faecher" erhalten. Lösungsvorschlag: SELECT Name AS Angebotene_Faecher FROM Fach ; Da beim Spaltenname kein Leerzeichen zulässig ist, wurde das Leerzeichen durch einen Unterstrich ersetzt. Aufgabe: Welche Schülernamen existieren an der Schule? Duplikate sollen nicht ausgegeben werden. Lösungsvorschlag: SELECT DISTINCT Name FROM Schueler ; 3 SQL-Anfragen mit Bedingungen 3.1 Anfrage mit Bedingung Im WHERE- Teil können Bedingungen angegeben werden, um Datensätze nach bestimmten Kriterien auszuwählen. Beispiel: Welche Lehrerinnen und Lehrer wohnen in Passau? SQL - Anfrage Ergebnis - Tabelle SELECT PersNr, Name FROM Lehrkraft WHERE Wohnort = 'Passau' ; Die Anfrage ist folgendermaßen zu interpretieren: Wähle aus der Tabelle Lehrkraft alle Datentupel aus, bei denen der Wert des Attributs Wohnort Passau ist und gib dann von diesen jeweils PersNr und Name aus. Dabei gilt: ● Einfache Bedingungen können durch Vergleiche erstellt werden. Dazu stehen die Vergleichsoperatoren und = zur Verfügung. , , ● Bei Vergleichen mit einer Zeichenkette muss diese in Hochkommata gesetzt werden. (MS ACCESS verwendet statt Hochkommata Anführungszeichen.) ● Durch den Operator NOT (...) kann eine Bedingung bestimmt werden, die nicht erfüllt werden soll. ● Durch den Operator BETWEEN <wert1> AND <wert2> kann ein Bereich angegeben werden, in dem sich der gesuchte Attributwert befinden muss. Attributwerte, die gleich den Bereichsgrenzen <wert1> und <wert2> sind, gehören zum ausgewählten Bereich. Der BETWEEN-Operator kann nur auf Attribute angewendet werden, auf deren Domäne eine Reihenfolge vordefiniert ist. Beispielsweise ist das bei Zahlen immer der Fall. Mehrere Bedingungen können durch ❍ OR, d.h. mindestens eine der Bedingungen muss erfüllt sein, oder ● ❍ AND, d.h. jede der Bedingungen muss erfüllt sein, miteinander verknüpft werden. , ● Durch Setzen von Klammern kann festgelegt werden, welche Bedingungen "zusammengehören". Werden keine Klammer gesetzt, so gelten folgende Regeln: ❍ NOT bindet stärker als AND, d.h. der NOT - Operator wird vor dem AND- Operator ausgewertet. ❍ AND bindet stärker als OR. Beispiel: Welche Daten sind über die Lehrerinnen gespeichert, die zwischen 1949 und 1960 geboren sind? SQL Anfrage Ergebnis - Tabelle SELECT * FROM Lehrkraft WHERE Geschlecht = 'w' AND Geburtsjahr BETWEEN 1949 AND 1960 ; Beispiel: Welche Lehrerinnen und Lehrer - unter Angabe von Name, PersNr, Wohnort - wohnen nicht in Passau? SQL - Anfrage SELECT Name, PersNr, Wohnort FROM Lehrkraft WHERE NOT (Wohnort = 'Passau') ; 3.2 Syntaxdiagramm Ergebnis - Tabelle 3.3 Übungen Aufgabe: Welche Lehrer haben eine dreistellige Personalnummer? Lösungsvorschlag: SELECT Name, PersNr FROM Lehrkraft WHERE Geschlecht = 'm' AND PersNr BETWEEN 100 AND 999 ; Aufgabe: Welche Lehrerinnen - unter Angabe von Personalnummer und Name - wohnen in Berlin oder Muenchen? Lösungsvorschlag: SELECT PersNr, Name FROM Lehrkraft WHERE Geschlecht = 'w' AND (Wohnort = 'Berlin' OR Wohnort = 'Muenchen') ; Aufgabe: Welche Schülernamen gibt es bei den Bekenntnislosen in der fünften Klasse? Lösungsvorschlag: SELECT DISTINCT Name FROM Schueler WHERE Konfession = 'bk' AND gehoert_zu = 5 ; Aufgabe: Welche Ergebnisse liefern folgende Anfragen? 1. SELECT Name FROM Lehrkraft WHERE Geschlecht = 'm' OR Wohnort = 'Passau' AND Geburtsjahr 2. SELECT Name FROM Lehrkraft WHERE (Geschlecht = 'm' OR Wohnort = 'Passau' ) AND Geburtsjahr Lösungsvorschlag: Tabelle 1. Anfrage = 1945 ; =1945 ; Tabelle 2. Anfrage Im ersten Fall sind alle männlichen Lehrkräfte sowie alle nach 1945 geborenen Lehrkräfte, die aus Passau kommen, gesucht. Die zweite Anfrage filtert die nach 1945 geborenen Lehrkräfte heraus, die männlich sind oder aus Passau kommen. 4 Sortierung der Ergebnismenge 4.1 Die ORDER BY- Klausel Um sortierte Ergebnisse zu erhalten, verwendet man das Schlüsselwort ORDER BY. Die ORDER BY- Klausel beinhaltet die Spalte, nach der sortiert werden soll. Dabei gibt es folgende Sortiermöglichkeiten: ● bei Zeichenketten alphabetisch, ● bei Zahlen nach der Größe bzw. ● bei expliziter Angabe einer Domäne nach der aufgeschriebenen Reihenfolge. Beispiel: Gewünscht ist eine alphabetisch geordnete Liste des Lehrerkollegiums mit Angabe der Personalnummer. SQL - Anfrage Ergebnis - Tabelle SELECT Name, PersNr FROM Lehrkraft ORDER BY Name ; Es können auch mehrere Sortierungsspalten, durch Kommata getrennt, angegeben werden. Dann bestimmt die erste Spalte das Hauptsortierungskriterium. Sind Datensätze bezüglich dieser Spalte identisch, erfolgt eine weitere Sortierung nach dem zweiten Attribut usw. Beispiel: Gewünscht ist eine Liste mit Klasse und Schülernamen, sortiert nach Klasse und Alphabet. SQL - Anfrage Ergebnis - Tabelle SELECT gehoert_zu AS Klasse, Name FROM Schueler ORDER BY gehoert_zu, Name ; 4.2 Aufsteigende und absteigende Sortierung Die bisherigen Beispiele waren aufsteigend sortiert. Durch Angabe des Schlüsselwortes DESC kann eine absteigende Sortierung erreicht werden. Bemerkung: Für die aufsteigende Sortierung steht auch das Schlüsselwort ASC zur Verfügung. Die Angabe dieses Schlüsselwortes ist optional. Wird die ORDER BY- Klausel ohne zusätzliche Angabe verwendet, wird das Ergebnis automatisch aufsteigend sortiert. Beispiel: Gewünscht ist eine Lehrerliste mit Personalnummer und Name, absteigend sortiert nach der Personalnummer. SQL - Anfrage Ergebnis - Tabelle SELECT PersNr, Name FROM Lehrkraft WHERE Geschlecht = 'm' ORDER BY PersNr DESC ; 4.3 Übungen Aufgabe: Welche Fächer, alphabetisch sortiert, gibt es an der Schule? Lösungsvorschlag: SELECT Name FROM Fach ORDER BY Name ASC ; bzw. SELECT Name FROM Fach ORDER BY Name ; Aufgabe: Gewünscht ist Klasse, Eintrittsjahr und Name aller katholischen Schülerinnen und Schüler, sortiert nach der Klasse und innerhalb der Klasse nach dem Eintrittsjahr. Lösungsvorschlag: SELECT gehoert_zu AS Klasse, Eintrittsjahr, Name FROM Schueler WHERE Konfession = 'rk' ORDER BY gehoert_zu ASC , Eintrittsjahr ASC ; bzw. SELECT gehoert_zu AS Klasse, Eintrittsjahr, Name FROM Schueler WHERE Konfession = 'rk' ORDER BY gehoert_zu , Eintrittsjahr ; Der Attributname gehoert_zu wurde mit dem AS-Operator in Klasse umbenannt. Aufgabe: Gesucht sind Personalnummer und Name der Lehrerinnen, die in Passau wohnen, absteigend sortiert nach dem Geburtsjahr. Lösungsvorschlag: SELECT PersNr, Name FROM Lehrkraft WHERE Geschlecht = 'w' AND Wohnort = 'Passau' ORDER BY Geburtsjahr DESC ; 5 Gruppieren von Datensätzen 5.1 Die GROUP BY- Klausel SQL erlaubt das Gruppieren von Datensätzen unter Berücksichtigung bestimmter Eigenschaften. Dafür steht die GROUP BY Klausel zur Verfügung. Pro Gruppe kann mit Hilfe der Aggregatfunktionen ein Informationswert berechnet werden. 5.2 Aggregatfunktionen Folgende Aggregatfunktionen können verwendet werden: Aggregatfunktion Bedeutung COUNT (Ausdruck) Anzahl der Datensätze je Gruppe SUM (Ausdruck) Summe der Werte von (Ausdruck) je Gruppe AVG (Ausdruck) Durchschnitt der Werte von (Ausdruck) je Gruppe MIN (Ausdruck) Minimum aller Werte von (Ausdruck) je Gruppe MAX (Ausdruck) Maximum aller Werte von (Ausdruck) je Gruppe Diese Gruppierungsausdrücke werden in der SELECT - Klausel verwendet. Mehrfach auftretende Werte werden innerhalb der Aggregatfunktionen mehrfach gezählt. Duplikatzählung verhindert man durch Verwendung des Schlüsselwort DISTINCT innerhalb der Aggregatfunktion. Bemerkung: Ist das Ergebnis einer Aggregatfunktion, angewendet auf eine Spalte mit der Domäne INTEGER, eine Dezimalzahl, so hängt es von der verwendeten Datenbank ab, ob als das Ergebnis als INTEGER- Zahl, also unter Vernachlässigung der Nachkommastellen, oder als Dezimalzanl angezeigt wird. Beispiel: Aus welchen Wohnorten stammt das Lehrerkollegium? Wie viele Personen kommen jeweils aus einem bestimmten Ort? SQL - Anfrage Ergebnis - Tabelle SELECT Wohnort, count(*) AS Anzahl FROM Lehrkraft GROUP BY Wohnort ; Bei Ausführung des obigen Befehls gruppiert das System in einem ersten Schritt die Datentupel aller Lehrkräfte nach dem Wohnort, in einem zweiten Schritt werden die Datensätze pro Wohnort gezählt und dann ausgegeben. Die Angabe eines Sterns innerhalb der COUNT- Klausel weist das System an, jeweils alle Datensätze innerhalb einer Gruppe zu zählen. Bemerkung: ACHTUNG: Außer Aggregaten dürfen in der SELECT - Klausel nur Attribute vorkommen, die in der GROUP BY - Klausel aufgeführt sind. 5.3 Aggregatfunktion ohne GROUP BY- Klausel Wird die GROUP BY - Klausel weggelassen und trotzdem eine Aggregatfunktion in der SELECT - Klausel verwendet, so werden alle Datensätze der Tabelle zu einer einzigen Gruppe zusammengefasst. Beispiel: Was ist das durchschnittliche Geburtsjahr im Lehrerkollegium? SQL - Anfrage Ergebnis - Tabelle SELECT AVG (Geburtsjahr) AS Durchschnitt FROM Lehrkraft ; 5.4 Rechenoperationen in SQL In der SELECT- und der WHERE- Klausel können auch Rechenoperationen durchgeführt werden. Grundsätzlich möglich ist die Verwendung von +, -, / und * sowie die Verwendung von Klammern. Daneben ist auch die Verwendung von Funktionen, wie beispielsweise die Wurzelfunktion, möglich, sofern sie von der Datenbank zur Verfügung gestellt werden. Als Operanden können Zahlen und Ergebnisse von Aggregatfunktionen verwendet werden. Beispiel: Wie viele Stunden Unterricht werden durchschnittlich pro Fach und pro Klasse erteilt? SQL - Anfrage Ergebnis - Tabelle SELECT SUM (Stundenzahl) / COUNT (*) AS Durchschnittsstundenzahl FROM ist_Fachlehrkraft_von ; Hinweis: Das Ergebnis erhält man einfacher durch Ausnutzung der AVG- Funktion. Bemerkung: zum obigen Beispiel Die Onlinedatenbank schneidet bei der Ergebnisausgabe die Nachkommastellen ab, d.h. das Ergebnis der Anfrage ist 3! 5.5 Übungen Aufgabe: Wie viele Lehrerinnen bzw. der Lehrer aus Passau gibt es? Lösungsvorschlag: SELECT Geschlecht, COUNT (Geschlecht) AS Anzahl FROM Lehrkraft WHERE Wohnort = 'Passau' GROUP BY Geschlecht ; bzw. SELECT Geschlecht, COUNT (*) AS Anzahl FROM Lehrkraft WHERE Wohnort = 'Passau' GROUP BY Geschlecht ; Aufgabe: Wie viele Schülerinnen und Schüler pro Konfession gibt es in der elften Klasse? Lösungsvorschlag: SELECT Konfession, COUNT (*) AS Anzahl FROM Schueler WHERE gehoert_zu = 11 GROUP BY Konfession ; Aufgabe: Wie groß sind die Klassenstärken? Lösungsvorschlag: SELECT gehoert_zu AS Klasse, COUNT (*) AS Klassenstaerke FROM Schueler GROUP BY gehoert_zu ; Aufgabe: Zu wie vielen Fächern gibt es eine Fachbetreuung? Lösungsvorschlag: SELECT COUNT ( DISTINCT Fach) FROM hat_Fachbetreuung_in ; MS ACCESS und die Übungsdatenbank "verstehen" diese Anweisung nicht! Aufgabe: Gesucht ist die höchste laufende Nummer innerhalb eines Eintrittsjahres! Zusätzlich ausgegeben werden soll dazu das jeweilige Eintrittsjahr. Lösungsvorschlag: SELECT Eintrittsjahr, MAX (Nr) FROM Schueler GROUP BY Eintrittsjahr ; Aufgabe: Wie viele Mathematikstunden sind von Lehrkräften zu halten, wenn der Stundenansatz pro Klasse um 2 erhöht wird? Lösungsvorschlag: SELECT SUM (Stundenzahl) + (2 * COUNT (*)) FROM ist_Fachlehrkraft_von WHERE Fach = 'Mathematik' ; Der SELECT-Ausdruck berechnet die Gesamtanzahl der Mathematikstunden und addiert dazu die Anzahl der Zusatzstunden. Da pro Klasse die Stundenzahl um 2 erhöht werden muss, berechnet sich diese Anzahl beispielsweise wie oben realisiert: 2 * Anzahl der Datensätze ( = Klassen), bei denen das Attribut Fach den Wert Mathematik besitzt. 6 Gruppierungen mit Bedingungen 6.1 Die HAVING - Klausel Oft werden bei einer Gruppierung nur die Gruppen gewünscht, die bestimmte Bedingungen erfüllen. Entsprechende Bedingungen werden in der HAVING - Klausel formuliert. Dabei dürfen Gruppierungsausdrücke verwendet werden. Beispiel: In welchen Jahren traten mindestens zwei Schülerinnen bzw. Schüler in die Schule ein? SQL - Anfrage Ergebnis - Tabelle SELECT Eintrittsjahr FROM Schueler GROUP BY Eintrittsjahr HAVING COUNT (*) > 1 ; Das System gruppiert zuerst alle Datentupel gemäß dem Eintrittsjahr und überprüft im Anschluss, welche dieser Gruppen mehr als ein Tupel enthält. Die entsprechenden Gruppen werden dann ausgegeben. Grundsätzlich werden Anfragen mit einer GROUP BY - Klausel in folgender Reihenfolge bearbeitet: 1. Auswahl der Tupel durch die WHERE - Klausel 2. Bildung der Gruppen durch die GROUP BY - Klausel 3. Auswahl der Gruppen, die die HAVING - Klausel erfüllen. 6.2 Übungen Aufgabe: Zu welchem Fach gibt es nur eine Lehrkraft? Lösungsvorschlag: SELECT Fach FROM hat_Lehrbefaehigung_in GROUP BY Fach HAVING COUNT (*) = 1 ; Aufgabe: Welche Klassen haben derzeit mehr als 10 Stunden Unterricht? Auszugeben sind die Klasse und deren Gesamtstundenzahl. Lösungsvorschlag: SELECT Klasse, SUM (Stundenzahl) FROM ist_Fachlehrkraft_von GROUP BY Klasse HAVING SUM (Stundenzahl) > 10 ; Aufgabe: Ist folgende Anfrage vernünftig? SELECT Konfession FROM Schueler WHERE gehoert_zu = 11 GROUP BY Konfession HAVING COUNT(*) = 0 ; Lösungsvorschlag: Es werden nur Konfessionen gruppiert, die auch in der Basistabelle vorkommen. Damit muss wenigstens eine Schülerin oder ein Schüler der entsprechenden Konfession zugehören. Es gibt also keine Gruppe mit 0 Tupeln. Die Anfrage liefert damit eine leere Tabelle. Anfragen mit der HAVING - Klausel HAVING COUNT(*) = 0 besitzen keine Aussagekraft. 7 SQL-Anfragen über mehrere Tabellen 7.1 Verknüpfung von Tabellen - Join Relationale Datenbanken bestehen in der Regel aus sehr vielen Tabellen. Oft werden bei einer SQL-Anfrage Daten gewünscht, die aus verschiedenen Tabellen stammen. Dazu müssen die Tabellen verknüpft werden. Solche Verknüpfungen nennt man Joins. Beispiel: Gewünscht ist eine Liste mit den Klassenleitern und der jeweiligen Klasse. Die Tabelle Lehrkraft liefert zwar den Namen der in Frage kommenden Personen, aber keine Information über die Klassenleitung. In der Tabelle Klasse findet man zwar die Personalnummer, nicht aber den Namen des jeweiligen Klassenleiters. Die Verknüpfung der Tabellen erfolgt durch Angabe der beteiligten Tabellen in der FROM - Klausel. Häufig haben Attribute, die aus verschiedenen Tabellen stammen, identische Namen. Wird ein solches Attribut in der SQL-Anfrage verwendet, muss zusätzlich noch der Tabellenname angegeben werden. Man schreibt: Tabellenname.Attributname. Beispiel: Der Attributname Name ist zweideutig. Er beschreibt einerseits die Lehrernamen, andererseits die Klasse. In unserem Bespiel muss der Name der Klasse mit Klasse.Name und der Name der Lehrkraft mit Lehrkraft.Name angesprochen werden. Bemerkung: Ist der Spaltenname eindeutig, kann auf das Voranstellen des Tabellennamen verzichtet werden. Folgende Query zeigt das Prinzip. Die Bedeutung der WHERE - Klausel wird nachfolgend genauer erklärt. Beispiel: Gewünscht ist eine Liste der Klassenleiter mit den jeweiligen Klassen. SQL - Anfrage Ergebnis - Tabelle SELECT Klasse.Name, Lehrkraft.Name FROM Lehrkraft, Klasse WHERE PersNr = Klassenleitung ; Innerhalb der FROM - Klausel ist eine Umbenennung der Tabellennamen möglich. Dazu stellt SQL das Schlüsselwort AS zur Verfügung, das aber nicht unbedingt verwendet werden muss. Damit ist beispielsweise folgende Formulierung der obigen Anfrage möglich: SELECT l.Name, k.Name FROM Lehrkraft AS l, Klasse AS k WHERE l.PersNr = k.Klassenleitung ; bzw. SELECT l.Name, k.Name FROM Lehrkraft l, Klasse k WHERE l.PersNr = k.Klassenleitung ; Da PersNr und Klassenleitung eindeutige Attributnamen sind, kann die WHERE -Klausel auch lauten: WHERE PersNr = Klassenleitung Innerhalb der FROM - Klausel ist eine Umbenennung der Tabellennamen möglich. Dazu stellt SQL das Schlüsselwort AS zur Verfügung, das aber nicht unbedingt verwendet werden muss. Damit ist beispielsweise folgende Formulierung der obigen Anfrage möglich: SELECT p.Name, d.RaumNr FROM Professor AS p, Dienstzimmer AS d WHERE p.PersNr = d.PersNr ; bzw. SELECT p.Name, d.Raumnr FROM professor p, Dienstzimmer d WHERE p.PersNr = d.PersNr ; Da name und RaumNr eindeutige Attributnamen sind, kann die SELECT -Klausel auch lauten: SELECT Name, RaumNr Bemerkung: ● ORACLE lässt die Verwendung von AS in der FROM - Klausel nicht zu! Der Aliasname wird einfach hinter den Tabellennamen geschrieben. ● MS ACCESS bzw. die Übungsdatenbank akzeptiert beide Möglichkeiten. 7.2 Bedeutung der WHERE-Klausel Das Weglassen der WHERE - Klausel in obigem Beispiel führt zu nachfolgendem Ergebnis: Beispiel: Die Entstehung dieses Ergebnisses kann man sich folgendermaßen vorstellen. Bei einem Join wird jeder Datensatz der einen Tabelle mit jedem Datensatz der anderen Tabelle verknüpft. Das Ergebnis wird in einer virtuellen Tabelle "abgelegt", die sowohl die Spalten der einen wie auch der anderen Tabellen enthält. Aus dieser virtuellen Tabelle werden dann die Spalten l.Name und k.Name ausgewählt und angezeigt. Bis auf die erste und zwölfte Datenzeile der obigen Tabellen sind aber alle Ausgabezeilen unsinnig, da bei diesen die Werte der Personalnummer und der Klassenleitung nicht übereinstimmen. Im obigen Beispiel muss deshalb gelten: l.PersNr = k.Klassenleitung. Diese Bedingung wird in der WHERE - Klausel angegeben. Mit Hilfe der WHERE - Klausel können Gleichheitsbedingungen angegeben werden, die unsinnige bzw. nicht aussagekräfte Kombinationen ausschließen. 7.3 Self-Join Manchmal wird eine Tabelle mit sich selbst verknüpft. Dieser spezielle Join heißt Self-Join. Beispiel: Welche Lehrkräfte (Angabe der PersNr) haben die Lehrbefähigung für mehr als ein Fach? SQL - Anfrage Ergebnis - Tabelle SELECT DISTINCT l1.Lehrkraft FROM hat_Lehrbefaehigung_in l1, hat_Lehrbefaehigung_in l2 WHERE l1.Lehrkraft = l2.Lehrkraft AND NOT (l1.Fach = l2.Fach) ; In diesem Beispiel wird ein Selfjoin verwendet. Zur Auswertung der Anfrage wird eine (virtuelle) Tabelle mit den vier Spalten l1.Lehrkraft, l1.Fach, l2.Lehrkraft und l2.Fach berechnet, aus der die Datensätze ausgewählt werden, bei denen die Lehrkraft- Attribute übereinstimmen und die Fach- Attribute verschieden sind. Anschließend wird von diesen Datensätzen die erste Spalte unter Entfernung von Duplikaten ausgegeben. 7.4 Übungen Aufgabe: Welche Fächer dürfen die einzelnen Lehrkräfte unterrichten? Gewünscht ist die Ausgabe der Namen von Lehrkraft und Fach. Lösungsvorschlag: SELECT Name, Fach FROM Lehrkraft, hat_Lehrbefaehigung_in WHERE PersNr = Lehrkraft ; Aufgabe: Welche Lehrerin bzw. welcher Lehrer (Angabe des Namens) ist Fachbetreuer in Deutsch? Lösungsvorschlag: SELECT Name FROM Lehrkraft, hat_Fachbetreuung_in WHERE PersNr = Lehrkraft AND Fach= 'Deutsch' ; Aufgabe: Gesucht sind die Namen der Lehrkräfte, die die Schülerin Falbala unterrichten? Lösungsvorschlag: SELECT l.Name FROM Lehrkraft l, Schueler s, ist_Fachlehrkraft_von i WHERE i.Klasse = s.gehoert_zu AND i.Lehrkraft = l.PersNr AND s.Name = 'Falbala' ; Aufgabe: Gibt es Lehrkräfte (Angabe der PersNr), die mehr als ein Fach in derselben Klasse unterrichten? Lösungsvorschlag: SELECT a.Lehrkraft FROM ist_Fachlehrkraft_von a, ist_Fachlehrkraft_von b WHERE a.Lehrkraft = b.Lehrkraft AND a.Klasse = b.Klasse AND NOT (a.Fach = b.Fach) ; Hier handelt es sich um einen Self-Join, da die Tabelle ist_Fachlehrkraft_von mit sich selbst gejoint wird. 8 Geschachtelte SQL-Anfragen mit Vergleichsoperatoren 8.1 Teilanfragen (Subqueries) mit einem Ergebnis In der WHERE- Klausel kann sich eine Bedingung auch auf eine untergeordnete SELECT- Anfrage beziehen. In vielen Fällen liefert die untergeordnete Anfrage genau ein Ergebnis zurück. Beispiel: Gesucht ist der Klassenleiter der fünften Klasse. SQL - Anfrage Ergebnis - Tabelle SELECT Name FROM Lehrkraft WHERE PersNr = ( SELECT Klassenleitung FROM Klasse WHERE Name = 5 ) ; Bemerkung: ● ● Die Domäne (Definitionsmenge) des Attributs Klasse.Name ist INTEGER, weshalb keine Hochkommata - die bei Zeichenketten benötigt werden - verwendet werden. Anfragen, die mittels einer Unteranfrage gelöst werden, können in der Regel auch mittels eines Joins berechnet werden und umgekehrt. Zur Ermittlung der Ergebnistabellen wird dazu im ersten Schritt die untergeordnete Anfrage SELECT Klassenleitung FROM Klasse WHERE Name = 5 ; ausgewertet. Die Zwischenergebnistabelle enthält den Wert der Spalte Klassenleitung im Datensatz der Klasse 5, also die Personalnummer 245. Mit diesem Zwischenergebnis wird die übergeordnete Query beantwortet, die dann der Anfrage SELECT Name FROM Lehrkraft WHERE PersNr = 15 ; entspricht. Diese Anfrage funktioniert aufgrund der Verwendung des Gleichheitszeichens nur dann, wenn die Ergebnistabelle der untergeordneten Anfrage genau einen Wert liefert. Zur Ermittlung der Ergebnistabellen wird dazu im ersten Schritt die untergeordnete Anfrage SELECT PersNr FROM Professor WHERE Name = 'Zuse' ; ausgewertet. Die Zwischenergebnistabelle enthält den Wert der Spalte PersNr im Datensatz des Professors Zuse, also die Personalnummer 36. Mit diesem Zwischenergebnis wird die übergeordnete Query beantwortet, die dann der Anfrage SELECT RaumNr FROM Dienstzimmer WHERE PersNr = 36 ; entspricht. Diese Anfrage funktioniert aufgrund der Verwendung des Gleichheitszeichens nur dann, wenn die Ergebnistabelle der untergeordneten Anfrage genau einen Wert liefert. Als Vergleichsoperatoren können neben dem Gleichheitszeichen auch ist aber immer, dass die Unteranfrage nur einen Wert zurückliefert! 8.2 Übungen , ;, und verwendet werden. Voraussetzung Aufgabe: Welche Lehrkraft ist Fachbetreuer in Sport? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE PersNr = ( SELECT Lehrkraft FROM hat_Fachbetreuung_in WHERE Fach = 'Sport' ) ; Achtung: Die Anfrage funktioniert natürlich nur dann, wenn man weiß, dass es nur eine Fachbetreuerin bzw. einen Fachbetreuer in Sport gibt. Ist man sich nicht sicher, ist der Operator IN zu wählen, Aufgabe: Welche Lehrkräfte sind älter als der Durchschnitt des Kollegiums? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE Geburtsjahr < ( SELECT AVG (Geburtsjahr) FROM Lehrkraft ) ; Aufgrund der Aggregatfunktion AVG ist es sicher, dass die Unteranfrage nur einen Wert zurückliefert! 9 Geschachtelte SQL-Anfragen mit speziellen Operatoren 9.1 Teilanfragen mit mehr als einem Ergebnis In vielen Fällen kann man nicht garantieren, dass in der Unteranfrage nur ein Ergebnis zurückgeliefert wird. Bemerkung: Im Zweifelsfall sollte man auf geschachtelte Anfragen mit , , , und = verzichten! Für untergeordnete Anfragen, die mehrere Ergebnisse, also eine Ergebnismenge, zurückliefern, stellt SQL spezielle Operatoren zur Verfügung. 9.2 Eine einfache Möglichkeit mit dem IN - Operator Der IN - Operator eignet sich auch zur Auswahl von Datensätzen, wenn das zu vergleichende Attribut aus einer kleinen, diskreten Menge stammt. Die Auswahlmenge wird in Form ihrer Elemente hinter dem IN - Operator angegeben. Beispiel: Welche Schülerinnen und Schüler - unter Angabe von Name und Klasse - sind katholisch oder evangelisch? SQL - Anfrage Ergebnis - Tabelle SELECT Name, gehoert_zu AS Klasse FROM Schueler WHERE Konfession IN ('rk', 'ev') ; Diese Verwendung ersetzt eine (in der Regel längere) Formulierung mit OR- Operatoren. 9.3 Erweiterte Möglichkeiten Die Auswahlmenge kann auch auf Grund einer untergeordneten Query erzeugt werden. Dazu stehen folgende Operatoren zur Verfügung: Name des Operators Bedeutung IN Test auf Mengenmitgliedschaft NOT IN Test, ob ein Element nicht in einer Menge ist. ( =, , ...) ANY Test, ob es mindestens ein Element in der Unteranfrage gibt, das den Vergleich mit dem Vergleichswert erfüllt. ( =, , ...) ALL Test, ob alle Elemente in der Unteranfrage den Vergleich mit dem Vergleichswert erfüllen. EXISTS Test, ob die von der Unteranfrage bestimmte Menge nicht leer ist. NOT EXISTS Test, ob die von der Unteranfrage bestimmte Menge leer ist. UNIQUE Test, ob das Ergebnis duplikatfrei ist. Beispiel: Welche Lehrkräfte haben eine Fachbetreuung? SQL - Anfrage Ergebnis - Tabelle SELECT Name FROM Lehrkraft WHERE PersNr IN ( SELECT Lehrkraft FROM hat_Fachbetreuung_in ) ; Beispiel: Welche Lehrkraft ist am jüngsten? SQL - Anfrage SELECT Name FROM Lehrkraft WHERE Geburtsjahr >= ALL ( SELECT Geburtsjahr FROM Lehrkraft ) ; 9.4 Übungen Aufgabe: Welche Lehrerinnen sind 1950, 1952, 1956 oder 1957 geboren? Ergebnis - Tabelle Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE Geburtsjahr IN (1950, 1952, 1956, 1957) AND Geschlecht = 'w' ; Aufgabe: Welche Lehrkräfte haben die Fachbetreuung in Mathematik? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE PersNr IN ( SELECT Lehrkraft FROM hat_Fachbetreuung_in WHERE Fach = 'Mathematik') ; Aufgabe: Welchen Lehrkräften, alphabetisch absteigend sortiert, wurden bereits Klassen zugeteilt? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE PersNr = ANY ( SELECT Lehrkraft FROM ist_Fachlehrkraft_von ) ORDER BY Name DESC ; 10 Unteranfragen in der SELECT-Klausel, Korreliertheit 10.1 Unteranfragen in der SELECT-Klausel Auch in der SELECT- Klausel ist die Verwendung von Unteranfragen möglich. 10.2 Korrelierte Unteranfragen Unteranfragen können sich auch auf Attribute der übergeordneten Anfragen beziehen. In diesem Fall spricht man von einer korrelierten Unteranfrage. Bei namensgleichen Attributen in der Ober- und Unteranfrage müssen wieder die Tabellennamen bzw. deren Aliasnamen verwendet werden. Beispiel: Welche Fachbetreuer unter Angabe des Faches gibt es? SQL - Anfrage Ergebnis - Tabelle SELECT Fach, ( SELECT Name FROM Lehrkraft WHERE Lehrkraft = PersNr ) AS Fachbetreuung FROM hat_Fachbetreuung_in ; Bemerkung: ● Im obigen Beispiel ist das Attribut Name mehrdeutig, damit muss der entsprechende Tabellenname oder Aliasname zusätzlich angegeben werden. Bei eindeutigen Attributen wie PersNr ist das nicht notwendig. ● Die obige SQL-Anfrage soll lediglich das Prinzip korrelierter Unteranfragen zeigen. Die Fragestellung kann mit Hilfe eines Joins einfacher formuliert werden! SELECT Fach, Name AS Fachbetreuung FROM Lehrkraft , hat_Fachbetreuung_in WHERE Lehrkraft = PersNr ; 10.3 Übungen Aufgabe: Welche Lehrkräfte haben die Lehrbefähigung im Fach Informatik? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE PersNr = ( SELECT Lehrkraft FROM hat_Lehrbefaehigung_in WHERE Fach = 'Informatik' AND PersNr = Lehrkraft) ; Die Unteranfrage bezieht sich in PersNr = Lehrkraft auf das Attribut PersNr der übergeordneten Anfrage. Aufgabe: Welche Lehrkräfte haben noch keine Unterrichtstunden? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE NOT EXISTS ( SELECT * FROM ist_Fachlehrkraft_von WHERE PersNr = Lehrkraft) ; Die Unteranfrage bezieht sich in PersNr = Lehrkraft auf das Attribut PersNr der übergeordneten Anfrage. Aufgabe: Gesucht sind die Personalnummern der Lehrkräfte, die gleichzeitig in Fachbetreuung und Klassenleitung eingebunden sind. Lösungsvorschlag: SELECT Lehrkraft FROM hat_Fachbetreuung_in WHERE Lehrkraft IN ( SELECT Klassenleitung FROM Klasse WHERE Klassenleitung = Lehrkraft) ; Die Unteranfrage bezieht sich in Klassenleitung = Lehrkraft auf das Attribut Lehrkraft der übergeordneten Anfrage. 11 Verknüpfen mehrerer Ergebnismengen 11.1 UNION-, INTERSECT- und EXCEPT- Operation Die klassischen Operationen der Mengenlehre werden auch von SQL zur Verfügung gestellt. Mengenoperation SQL - Schlüsselwort Vereinigung von Mengen UNION Schnitt von Mengen INTERSECT Differenz von Mengen EXCEPT Damit können die Ergebnismengen mehrerer SQL-Anfragen mit Mengenoperationen verknüpft werden. Beispiel: Welche Kolleginnen bzw. Kollegen haben gleichzeitig Fachbetreuung und Klassenleitung? SELECT Lehrkraft AS Doppelfunktion FROM hat_Fachbetreuung_in INTERSECT SELECT Klassenleitung FROM Klasse ; Bei der Verwendung der Mengenoperatoren ist zu beachten: ● Die Ergebnisse beider SELECT - Anweisungen müssen bezüglich Anzahl und Typ der Attribute identisch sein. ● Ohne das Schlüsselwort ALL werden vor der Mengenoperation Duplikate aus den beiden Teilergebnissen entfernt. ● Die beteiligten SELECT - Anweisungen dürfen nicht in Klammern geschrieben werden. Bemerkung: ● Statt dem Schlüsselwort EXCEPT verwendet ORACLE die Bezeichnung MINUS. ● In MS ACCESS und der Übungsdatenbank stehen die Mengenoperatoren INTERSECT und EXCEPT nicht zur Verfügung. 11.2 Übungen Aufgabe: Gesucht sind alle Schülerinnen und Schüler mit Ausnahme der Bekenntnislosen. Lösungsvorschlag: SELECT gehoert_zu AS Klasse, Name FROM Schueler EXCEPT SELECT gehoert_zu, Name FROM Schueler WHERE Konfession = 'bk' ; Aufgabe: Gesucht sind die Namen des Lehrerkollegiums und der Schülerschaft. Lösungsvorschlag: SELECT Name FROM Lehrkraft UNION SELECT Name FROM Schueler ; Aufgabe: Welchen Lehrkräften (Angabe der Personalnummer) wurden bereits Klassen zugeteilt? Lösungsvorschlag: SELECT PersNr FROM Lehrkraft INTERSECT SELECT Lehrkraft FROM ist_Fachlehrkraft_von ; 12 Weitere Sprachkonstrukte 12.1 Der LIKE-Operator Bei der Suche nach ähnlichen oder nicht genau bekannten Begriffen erweist sich oft die Konstruktion LIKE als hilfreich. SQL stellt dabei zwei Hilfen zur Verfügung: Zeichen Bedeutung % Platzhalter für beliebig viele Zeichen _ Platzhalter für genau ein Zeichen Bemerkung: Entsprechende Möglichkeiten werden auch in MS ACCESS zur Verfügung gestellt: ● * als Platzhalter für beliebig viele Zeichen, ● ? als Platzhalter für genau ein Zeichen Beispiel: Welche Namen der Lehrkräfte enthalten die Buchstabenfolge "us"? SQL - Anfrage SELECT Name FROM Lehrkraft WHERE Name LIKE '%us%' ; Ergebnis - Tabelle Beispiel: Welche Schülernamen haben an der vorletzten Stelle den Buchstaben i? SQL - Anfrage Ergebnis - Tabelle SELECT DISTINCT Name FROM Schueler WHERE Name LIKE '%i_' ; Um Duplikate bei den Schülernamen auszuschließen, wurde das Schlüsselwort DISTINCT verwendet. 12.2 Übungen Aufgabe: Welche Fächer mit dem Anfangsbuchstaben M gibt es? Lösungsvorschlag: SELECT Name FROM Fach WHERE Name LIKE 'M%' ; Aufgabe: Welche Lehrernamen haben an der zweiten Stelle den Buchstaben u? Lösungsvorschlag: SELECT Name FROM Lehrkraft WHERE Name LIKE '_u%' ; Aufgabe: Heißt die Schülerin aus der 11. Klasse Fabala oder Falbala? Lösungsvorschlag: SELECT Name FROM Schueler WHERE Name LIKE 'Fa%bala' ; 13 Das Erstellen von Sichten (Views) 13.1 Was sind Sichten (Views) Um Benutzern eines Datenbanksystems eine Sicht auf die für sie relevanten Daten zu ermöglichen, verwendet man sogenannte Sichten oder Views . Views kann man als virtuelle Tabellen auffassen, die ihre Einträge nicht selbst speichern, sondern bei Bedarf nach einer vorher festgelegten Vorschrift aus Basistabellen oder anderen bereits existierenden Views berechnen. Bemerkung: Views werden im Drei-Schichten-Modell von ANSI/SPARC als eigene Schicht eingeführt. Beispiel: Die Schuldatenbank soll zum Informationssystem für Eltern erweitert werden. Diese dürfen zwar beispielsweise die Namen der Fachbetreuer einsehen, nicht aber deren persönlichen Daten. Mittels einer View können die benötigten Informationen aus den Tabellen Lehrkraft und hat_Fachbetreuung_in berechnet werden. 13.2 Die CREATE VIEW - Anweisung Der CREATE VIEW-Befehl dient zur Festlegung einer Sicht. Beispiel: Die zulässigen Daten des obigen Beispiels kann man durch die SQL-Abfrage SELECT Fach, Name AS Betreuung FROM Lehrkraft, hat_Fachbetreuung_in WHERE PersNr = Lehrkraft ; herausfiltern. Mit Hilfe von CREATE VIEW kann dieser Anfrage ein Name, beispielsweise Fachbetreuung, zugeordnet werden und dann unter diesem Namen abgespeichert. Die entsprechende SQL-Anweisung lautet dann CREATE VIEW Fachbetreuung AS SELECT Fach, Name AS Betreuung FROM Lehrkraft, hat_Fachbetreuung_in WHERE PersNr = Lehrkraft ; Views sind damit nichts anderes als benannte SQL-Abfragen . Die Ergebnistabellen von Views werden beim Aufruf der View immer neu berechnet. Bemerkung: In MS ACCESS können Datenbankanfragen unter Verwendung von Namen abgespeichert werden. Diese Anfragen sind damit nichts anderes als Views. 13.3 Syntaxdiagramm 13.4 Arbeiten mit Views Views können bzgl. Anfragen genauso behandelt werden wie Basistabellen. Beispiel: Welche Lehrkräfte haben die Fachbetreuung im Fach Mathematik? SQL - Anfrage Ergebnis - Tabelle SELECT Betreuung AS Mathematikfachbetreuung FROM Fachbetreuung WHERE Fach = 'Mathematik' ; Beispiel: Gibt es einen Fachbetreuer von Wahlfächern? SQL - Anfrage Ergebnis - Tabelle SELECT Fach, Betreuung FROM Fachbetreuung, Fach WHERE Fach = Name AND Pflichtfach = 'nein' ; 13.5 Übungen Aufgabe: Es soll eine View mit dem Namen Klasse_5 erstellt werden, die die Namen aller Schüler der fünften Klasse zeigt. Lösungsvorschlag: CREATE VIEW Klasse_5 AS SELECT Name FROM Schueler WHERE gehoert_zu = 5 ; Aufgabe: Gibt es in der fünften Klasse einen Schüler mit dem Namen Asterix? Erstellen Sie eine View Schuelersuche unter Ausnutzung der Lösung der Vorgängeraufgabe. Lösungsvorschlag: CREATE VIEW Schuelersuche AS SELECT Name FROM Klasse_5 WHERE Name = 'Asterix' ; Aufgabe: Gewünscht ist eine Sicht mit dem Namen Lehrkraefte_5, die eine Liste mit den Lehrkräften, die in der Klasse 5 unterrichten, und dem entsprechenden Fach berechnet. Lösungsvorschlag: CREATE VIEW Lehrkraefte_5 AS SELECT Name, Fach FROM Lehrkraft, ist_Fachlehrkraft_von WHERE PersNr = Lehrkraft AND Klasse = 5 ; 14 Das Löschen von Sichten (Views) 14.1 Die DROP VIEW - Anweisung Der DROP VIEW - Befehl erlaubt das Löschen einer Sicht. Beispiel: Die Sicht Fachbetreuung wird nicht mehr benötigt. DROP VIEW Fachbetreuung; Bemerkung: Bei MS ACCESS und der Übungsdatenbank erfolgt das Löschen von Views (leider) über den DROP TABLE- Befehl. 14.2 Syntaxdiagramm 15 SQL mit MS ACCESS MS ACCESS stellt zum Erstellen von Tabellen, Abfragen usw. im Allgemeinen Assistenten zur Verfügung. Trotzdem ist auch das direkte Arbeiten mit SQL möglich! 15.1 Ansichten in MS ACCESS MS ACCESS unterscheidet bei Tabellen und Anfragen grundsätzlich: ● die Datenblattansicht: Damit kann die Instanz einer Basistabelle bzw. die Ergebnistabelle einer Anfrage angezeigt werden. Diese Ansicht erlaubt auch die Eingabe, die Änderung und das Löschen von Daten in einer Basistabelle. ● die Entwurfsansicht: Hier können Tabellen bzw. Anfragen "ohne"" SQL erzeugt werden. ● die SQL-Ansicht: Diese erlaubt das direkte Arbeiten mit SQL. 15.2 Die SQL-Ansicht in MS ACCESS Die SQL-Ansicht erlaubt ● die Definition von Tabellen (CREATE TABLE), ● das Ändern von Tabellen (ALTER TABLE), ● das Löschen von Tabellen (DROP TABLE), ● das Einfügen von Daten in Tabellen (INSERT INTO), ● das Ändern von Daten in Tabellen (UPDATE), ● das Löschen von Daten in Tabellen (DELETE) und ● die Erstellung von SQL-Anfragen (SELECT). 15.3 Aufruf der SQL-Ansicht 1. Wählen Sie als Objekt Abfragen . 2. Klicken Sie auf Neu in der Symbolleiste des Datenbankfensters. 3. Klicken Sie im Dialogfeld Neue Abfrage auf Entwurfsansicht und dann auf OK. 4. Klicken Sie im Dialogfeld Tabelle anzeigen auf Schließen, ohne Tabellen oder Abfragen hinzuzufügen. 5. Die SQL-Ansicht erhält man durch ❍ Auswahl des Punktes SQL-Ansicht im Menüpunkt Ansicht Ansicht oder ❍ ❍ Auswahl des Punktes SQL-Ansicht im Kontextmenü (rechte Maustaste), falls sich die Maus im Abfragefenster befindet oder Auswahl des des Punktes SQL-Ansicht in der Icon-Leiste 6. Geben Sie den SQL-Befehl in das SQL-Fenster ein. 7. Um die Abfrage auszuführen, klicken Sie in der Symbolleiste auf Ausführen. Unter dem Menüpunkt Abfrage finden Sie den Punkt Ausführen ebenfalls. Bemerkung: Der eingegebene SQL-Befehl kann unter einem frei wählbaren Namen abgespeichert werden. Es gilt: ● Anfragen an die Datenbank können durch Doppelklicken des Namens ohne Probleme mehrmals ausgeführt werden, da dabei keine Daten hinzugefügt, verändert oder gelöscht werden. ● Einmalige Aktionen, z.B. Ausführen von create table oder insert into, sollten nur einmal ausgeführt werden! Ist nämlich beispielsweise eine Tabelle mit dem Namen Beispiel bereits erstellt und mit Daten gefüllt, wird durch den Befehl create table Beispiel ... die Tabelle samt Inhalt gelöscht und eine neue (leere) Tabelle Beispiel erstellt!