Eine der wichtigsten Fähigkeiten von Abfragen ist, Datensätze nach beliebigen Kriterien bzw. Bedingungen zu filtern. Hier ein einfaches Beispiel:
Abfrage1 | |||||
---|---|---|---|---|---|
|
SELECT txtOrt FROM tblOrte WHERE txtOrt = "München";
Feld: | txtOrt | |
Tabelle: | tblOrte | |
Sortierung: | ||
Anzeigen: | ||
Kriterien: | "München" | |
oder: | ||
Die Abfrage gibt jetzt nur noch Datensätze aus, bei denen im Feld
txtOrt
„München“ eingetragen ist:
Abfrage1 |
---|
txtOrt |
München |
Im SQL-Code, den Access aus diesen Eingaben erzeugt, müssen das Feld und die Bedingung mit einem Operator verknüpft werden. Standardmäßig verwendet Access dafür ein Gleichheitszeichen =, aber man kann auch andere Operatoren verwenden.
SELECT * FROM tblOrte WHERE lngLand < 3;
Feld: | tblOrte.* | lngLand |
Tabelle: | tblOrte | tblOrte |
Sortierung: | ||
Anzeigen: | ||
Kriterien: | <3 | |
oder: | ||
So werden alle Datensätze ausgegeben, bei denen im Feld lngLand
ein Wert kleiner als 3 steht:
Abfrage1 | ||
---|---|---|
IDOrt | txtOrt | lngLand |
3 | München | 2 |
6 | Stuttgart | 1 |
Hier eine Auflistung der Operatoren:
Operatoren | ||
---|---|---|
Operator | Beispiel | Bedeutung |
= | =1 | gleich |
<> | <>1 | ungleich |
< | <1 | kleiner als |
> | >1 | größer als |
<= | <=1 | kleiner oder gleich |
>= | >=1 | größer oder gleich |
Zwischen ... und | Zwischen 1 und 3 | Zwischen zwei Werten (jeweils einschließlich) |
Ist Null | Ist Null | gibt leere Felder zurück |
Wie | Wie "X*" | entspricht einem Textmuster |
In | In ('Müller', 'Mayer', 'Schulze') | in einer Liste enthaltene Werte |
Ist Null sucht nach einem komplett leeren Feld. Das ist nicht zu verwechseln mit einer leeren Zeichenfolge oder dem Zahlenwert 0: In einem Zahlenfeld kann entweder den Wert 0 stehen oder, wenn es die Feldeinstellungen erlauben, gar nichts. Um nach einer 0 zu suchen, hieße das Kriterium =0, um nach einem leeren Feld zu suchen, würde es Ist Null heißen. Eine leere Zeichenfolge hingegen wird mit "" (ohne Leerzeichen dazwischen) gesucht.
Operatoren unterscheiden nicht nach Felddatentypen. Man kann z. B. Wie "*1*" verwenden, um nach allen Zahlen suchen, die an irgendeiner Stelle eine „1“ enthalten, oder mit >"L" nach allen Texten suchen, die alphabetisch nach „L“ kommen.
Wie gerade erwähnt, können mit dem Wie−Operator Platzhalterzeichen verwendet werden, um alle Elemente zu finden, die einem Muster entsprechen.
SELECT * FROM tblOrte WHERE txtOrt Like "*r*";
Feld: | tblOrte.* | txtOrt |
Tabelle: | tblOrte | tblOrte |
Sortierung: | ||
Anzeigen: | ||
Kriterien: | Wie "*r*" | |
oder: | ||
Die Abfrage gibt jetzt alle Datensätze aus, die ein „r“ im Ortsnamen enthalten:
Abfrage1 | ||
---|---|---|
IDOrt | txtOrt | lngLand |
1 | Berlin | 3 |
2 | Hamburg | 6 |
5 | Frankfurt | 7 |
6 | Stuttgart | 1 |
7 | Düsseldorf | 10 |
8 | Dortmund | 10 |
Außer dem Sternchen * sind noch einige andere Platzhalterzeichen möglich:
Platzhalterzeichen | |||
---|---|---|---|
Symbol | Beispiel | Ergebnis | Verwendung |
* | Wie "*er" | findet Maier, Müller, Junker | Eine beliebige Anzahl Zeichen |
? | Wie "Ma?er" | findet Maier, Majer und Mayer | Ein beliebiges einzelnes Zeichen |
# | Wie "1#3" | findet 103, 113, 123 | Eine einzelne Ziffer |
[ ] | Wie "Ma[iy]er" | findet Maier und Mayer, aber nicht Majer | Ein einzelnes Zeichen innerhalb der eckigen Klammern |
! | Wie "Ma[!iy]er" | findet Majer, aber nicht Maier oder Mayer | Keines der Zeichen innerhalb der eckigen Klammern |
- | Wie "b[a-c]d" | findet bad, bbd oder bcd | Ein einzelnes Zeichen im angegebenen Bereich |
Mit dem oben erwähnten In-Operator könnte man nach Datensätzen suchen, die einem Kriterium in einer Liste entsprechen. Wie wir noch sehen werden, geht das allerdings auch einfacher. Interessant wird der In-Operator erst mit sogenannten Unterabfragen: In der folgenden Abfrage enthält der In-Operator selbst eine komplette Abfrage als SQL-Code. Die Unterabfrage liefert eine Liste mit den Nummern aller Bundesländer, in denen es einen Ort gibt, der mit „n“ endet. Die Hauptabfrage gibt dann alle Orte zurück, die in einem solchen Land liegen, in dem es einen entsprechenden Ort gibt - ohne, dass man wissen muss, in welchen Bundesländern es einen solchen Ort gibt.
SELECT txtOrt, lngLand FROM tblOrte WHERE lngLand In ( SELECT lngLand FROM tblOrte WHERE txtOrt Like "*n" );
Feld: | txtOrt | lngLand |
Tabelle: | tblOrte | tblOrte |
Sortierung: | ||
Anzeigen: | ||
Kriterien: | In (SELECT lngLand FROM tblOrte WHERE txtOrt Like "*n") | |
oder: | ||
Abfrage1 | |
---|---|
txtOrt | lngLand |
München | 2 |
Berlin | 3 |
Dortmund | 10 |
Düsseldorf | 10 |
Köln | 10 |
Leider ist es nicht möglich, eine Unterabfrage direkt in der Entwurfsansicht grafisch zu erstellen. Wenn man nicht genug SQL-Kenntnisse hat, um eine Unterabfrage von Hand zu erstellen, kann man in der Entwurfsansicht einer neuen Abfrage zuerst eine Abfrage erstellen, die die Unterabfrage darstellen soll, dann zur SQL-Ansicht wechseln und die Unterabfrage von dort in die Hauptabfrage kopieren.
Unterabfragen können auch in der Zeile „Feld“ stehen, wenn man nämlich einen Feldnamen überhaupt erst per Abfrage ermitteln will. Sogar als Datenquelle, also im FROM-Teil der Abfrage, sind Unterabfragen möglich (Dann ohne den In-Operator) Man sieht: Unterabfragen sind mächtig. Andererseits werden sie in der Praxis nicht allzu oft benötigt.