Abfragen mit SQL
Inhalt der Seite
Was ist eine Abfrage?
Ganz allgemein ist eine Abfrage der gezielte Zugriff auf die Information einer oder mehrerer Tabellen. Das Ergebnis gleicht einer geordneten Tabelle. Zur Erinnerung: In Tabellen liegen Daten ungeordnet vor.
Etwas fachsprachlicher ist eine Abfrage ein strukturierter Zugriff auf Tabellen, dessen Ergebnis eine Datensatzgruppe ist.
Zum Zugriff auf die Daten mit Abfragen benutzt man die Abfragesprache SQL (=Structured Query Language)
Der Vorteil der Verwendung von Abfragen gegenüber der Verwendung von Tabellen ist, dass nur die Daten geladen werden, die den Abfragekriterien entsprechen, und dass die Daten aus mehreren Tabellen stammen können. Tabellen werden nämlich immer komplett in den Arbeitsspeicher geladen, was die Systemleistung stark beanspruchen kann.
Arten von Abfragen
Man unterscheidet Auswahlabfragen und Aktionsabfragen.
Auswahlabfragen liefern als Ergebnis eine nach bestimmten Kriterien zusammengestellte Auswahl an Daten. Weder die Datenmenge noch die Daten in der Datenbak ändern sich.
Aktionsabfragen verändern die Daten oder die Datenmenge in der Datenbank, denn sie dienen dem kriterienabhängigen Aktualisieren, Löschen bzw. Anfügen von Daten.
Struktur von Abfragen
Abfragen bestehen aus Anweisungen, Ortsangaben und Kriterien. Die Angabe der Kriterien ist optional. Am Ende steht ein Semikolon (;).
Anweisungen sind zum Beispiel:
- SELECT = auswählen
- DELETE = löschen
- INSERT = einfügen
- UPDATE = aktualisieren
Ortsangaben sind zum Beispiel:
- SELECT * FROM tblTitel = alle Spalten aus der Tabelle tblTitel auswählen
- SELECT tblAlben.Genre FROM tblAlben = nur die Spalte Genre aus der Tabelle tblAlben auswählen
Kriterien sind zum Beispiel
- WHERE tblAlben.Interpret = "Tori Amos"
- WHERE tblAlben.ID_Interpret > 142
Vollständige Abfragen sehen zum Beispiel so aus:
- SELECT * FROM tblTitel; = alles aus der Tabelle tblTitel auswählen
- SELECT * FROM tblAlben WHERE tblAlben.Genre = "Rock"; = alle Alben aus der Tabelle tblAlben, deren Genre Rock ist
- DELETE * FROM tblAlben WHERE tblAlben.Jahr = 1983; = alle Alben des Jahres 1983 löschen
Kriterien und Vergleichoperatoren in Abfragen
Wie Sie schon in den Beispielen gesehen haben, werden Kriterien mit Hilfe von Vergleichsoperatoren an die Abfrage übergeben. In den beiden Beispielabfragen ist es das Gleichheitszeichen. Andere Vergleichsoperatoren sind z. B.: <, >, <=, =>, <>.
Ebenfalls wichtig ist bei Abfragen die Beachtung des Datentyps: Ist das Kriterium eine Zeichenkette wie "Tori Amos", erkennbar an den die Zeichenkette einschließenden Anführungszeichen, oder ist es eine Zahl oder ein Datum?
Zeichenketten können Sie zeichenweise vergleichen wie im Beispiel, wobei auch Platzhalter wie der Asterix * (steht für beliebige Zeichen) in Verbindung mit Buchstaben verwendet werden können. Allerdings steht dann in der Abfrage nicht das Gleichheitszeichen, sondern der Vergleichsoperator "WIE" bzw. englisch "LIKE". z. B.:
Diese Abfrage würde alle Gruppen finden, deren Name mit B beginnt.
Bei Zeichenketten ist der Einsatz der Vergleichsoperatoren < und > nicht ganz unproblematisch: Es kann zu unerwarteten Ergebnissen kommen. Besser ist bei Zeichenketten der Einsatz des Operators "BETWEEN" und "AND". z. B.:
Diese Abfrage würde alle Gruppen finden, deren Name mit B, C, D oder E beginnt. Achtung: Gruppennamen mit F werden nicht mit in die Abfrage eingeschlossen!
Wenn die Kriterien für die Abfrage Zahlen (also keine Zeichenketten) sind, brauchen Sie diese nicht in Anführungszeichen einzuschließen. (Tun Sie es doch, betrachtet die Abfrage die Zahl nicht als Zahl, sondern als Zeichenkette!)
Der Einsatz der Vergleichsoperatoren <,>, =, <> (ungleich), <=, => dürfte keine Schwierigkeiten bereiten. z. B.:
Diese Abfrage würde alle Gruppen und deren Alben finden, die nach 1970 erschienen sind.
Query By Example (QBE)
Falls Sie jetzt Angst haben sollten, dass Sie viel schreiben müssen, dann seien Sie beruhight, denn in Access gibt es neben dem Abfrageassistenten ein Fenster zur Query By Example (QBE), das den größten Teil des Schreibens per Hand abnimmt - man kann aber jederzeit in die genuine SQL-Schreibweise umschalten.
Das entsprechende Fenster sieht wie folgt aus:
- QBE - eine Abfrage in der Entwurfsansicht: Im oberen Teil sehen Sie die Tabelle, auf die sich die Abfrage bezieht, darunter werden die Felder angezeigt, die in die Abfrage einbezogen werden. Im Feld Jahr steht als Kriterium 1983.
Mann kann mehrere Tabellen oder auch Abfragen zur Datengrundlage einer Abfrage machen. Dann sieht das QBE-Fenster zum Beispiel so aus.
- QBE - eine Abfrage auf zwei Tabellen in der Entwurfsansicht: Die zwischen den Tabellen definierten Beziehungen werden automatisch für die Tabellen übernommen. Es werden alle Interpreten angezeigt, deren Namen mit O beginnen. Das * steht als Platzhalter für beliebig viele weitere Zeichen. Die Verknüpfungslinie zwischen den Tabellen zeigt die 1:n-Beziehung an.
Abfragen über mehrere Tabellen
Die Möglichkeit, Daten in verschiedene Tabellen aufzuteilen, Beziehungen zwischen Tabellen zu definieren und Abfragen über mehrere Tabellen durchzuführen, sind die Stärke relationaler Datenbanken. Allerdings ist das nicht ganz trivial, wenn man bedenkt, dass eine Access-Abfrage Daten aus bis zu 32 Tabellen liefern und aus bis zu 64.000 Zeichen bestehen kann.
Abfragen über zwei Tabellen per SQL
In der Standard-SQL verknüpft man zwei Tabelle mit der WHERE-Bedingung. Das sieht zum Beispiel so aus:
FROM tblInterpreten, tblAlben
WHERE tblInterpreten.ID_Interpret = tblAlben.ID_Interpret
ORDER BY tblInterpreten.Interpret;
Die Abfrage hat allerdings den Nachteil, dass die Daten in der Abfrage nicht bearbeitet werden können.
Um die Daten dennoch bearbeiten zu können, stellt Access eigene Verknüpfungsbefehle für Abfragen zur Verfügung. Dazu werden die zwischen den Tabellen definierten Beziehungen ausgewertet. Man kann aber auch Beziehungen ausschließlich für eine Abfrage definieren.
Abfragen über zwei Tabellen per Access-eigenem INNER JOIN ... ON ...
Erstellt man mit dem Abfrage-Assistenten die oben genannte Abfrage, so sieht sie im Entwurf wi in der letzten Abbildung aus. Die 1-n-Beziehung wird vom Assistenten automatisch übernommen. Der SQL-COde dieser Abfrage sieht so aus:
FROM tblInterpreten INNER JOIN tblAlben ON tblInterpreten.ID_Interpret = tblAlben.ID_Interpret
ORDER BY tblInterpreten.Interpret;
Wie Sie sehen, wird in der FROM-Klausel per INNER JOIN die zu verknüpfende Tabelle genannt und dann werden mit Hilfe der Anweisung ON die Felder mit der Vernüpfungsinformation bestimmt.
Das Ergebnis der Abfrage lässt sich jetzt zwar direkt bearbeiten, die Abfrage hat aber immer noch einen Nachteil: Sie liefert nämlich nur Interpreten, zu denen es bereits Alben gibt. Falls nur ein Interpret, aber noch kein Album eingetragen wurde, wird der Interpret nicht angezeigt. Das ist aber auch logisch, denn das Verknüpfungskriterium ID_Interpret ist in der Tabelle tblAlben nicht enthalten.
Dieses Problem lässt sich durch die Verwendung von OUTER JOINS lösen.
Abfragen über zwei Tabellen per Access-eigenem OUTER JOINS
Ein OUTER JOIN liefert alle Daten einer Tabelle und die vorhandenen Daten aus einer zweiten. Sind keine passenden Daten vorhanden, bleiben die Felder in den Spalten der zweiten Tabelle leer.
Da die Tabellen beim Festlegen der Verknüpfungseigenschaften nebeneinander stehen, unterscheidet man nach LEFT JOIN und RIGHT JOIN, je nach in welcher Tabelle alle Daten angezeigt werden.
Im Assistenten zum Festlegen der Verknüpfungseigenschaften, den man per rechtem Mausklick auf die Verknüpfungslinie aufruft, sieht das so aus:
- Beim Festlegen der Verknüpfungseigenschaften in einer Abfrage kann man zwischen den Access-eigenen (1) INNER JOIN, (2) RIGHT JOIN und (3) LEFT JOIN wählen.
Nach dem Festlegen eines OUTER JOINS ändert sich das Aussehen der Verknüpfungslinie im QBE-Assistenten:
- Das Aussehen der Verknüpfungslinie ändert sich in Abhängigkeit von der gewählten Art des JOINS. Beim LEFT JOIN hat die Linie einen Pfeil zur rechten Tabelle.
Der vom Assistenten dazu produzierte SQL-CODE sieht so aus:
FROM tblInterpreten LEFT JOIN tblAlben ON tblInterpreten.ID_Interpret = tblAlben.ID_Interpret
ORDER BY tblInterpreten.Interpret;
Abfragen über drei und mehr Tabellen
Mit Hilfe von JOINS sind Abfragen über bis zu 32 Tabellen möglich, alledings gibt es dabei Beschränkungen:
- Die Daten dieser Abfragen sind in der Regel nicht direkt bearbeitbar.
- Beim Verschachteln von JOINS kann man OUTER JOINS in INNER JOINS verschachteln, aber nicht umgekehrt.
Allerdings kann man die letzte Beschränkung mit Hilfe von Unterabfragen bzw. temporären Tabellen umgehen.