Home > Schule > Datenbanken > Grundlagen > Abfragen

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:

Ortsangaben sind zum Beispiel:

Kriterien sind zum Beispiel

Vollständige Abfragen sehen zum Beispiel so aus:

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.:

SELECT tblAlben.Interpret, tblAlben.Album FROM tblAlben WHERE tblAlben.Interpret LIKE "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.:

SELECT tblAlben.Interpret, tblAlben.Album FROM tblAlben WHERE tblAlben.Interpret BEETWEEN "B*" AND "F*";

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.:

SELECT tblAlben.Interpret, tblAlben.Album, tblAlben.Jahr FROM tblAlben WHERE tblAlben.Jahr > 1970);

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:

Eine Abfrage in der Entwurfsansicht
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.

Eine Abfrage auf zwei Tabellen in der Entwurfsansicht
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:

SELECT tblInterpreten.ID_Interpret, tblInterpreten.Interpret, tblAlben.Album, tblAlben.Jahr, tblAlben.Genre
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:

SELECT tblInterpreten.ID_Interpret, tblInterpreten.Interpret, tblAlben.Album, tblAlben.Jahr, tblAlben.Genre
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:

Verknüpfungseigenschaften festlegen
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:

Aussehen der Verknüpfungslinie in Abhängigkeit von der gewählten Art des JOINS
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:

SELECT tblInterpreten.ID_Interpret, tblInterpreten.Interpret, tblAlben.Album, tblAlben.Jahr, tblAlben.Genre
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:

  1. Die Daten dieser Abfragen sind in der Regel nicht direkt bearbeitbar.
  2. 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.