Kriterien

Bedingungen

Eine der wichtigsten Fähigkeiten von Abfragen ist, Datensätze nach beliebigen Kriterien bzw. Bedingungen zu filtern. Hier ein einfaches Beispiel:

Abfrage1
tblOrte
*
IDOrt
txtOrt
lngLand
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

Operatoren

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.

Der Wie-Operator

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
1Berlin3
2Hamburg6
5Frankfurt7
6Stuttgart1
7Düsseldorf10
8Dortmund10

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

Der In-Operator

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ünchen2
Berlin3
Dortmund10
Düsseldorf10
Köln10

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.