SQL: SELECT-Abfragen, Teil II

Im ersten Teil dieser Artikelreihe haben Sie erfahren, wie Sie SELECT-Abfrage grundsätzlich aufbauen und wie Sie die gewünschten Felder zur Abfrage hinzufügen. Im zweiten Teil kümmern wir uns um die andere Möglichkeit, die angezeigten Daten einzuschränken: nämlich durch das Filtern der Datensätze mit entsprechenden Bedingungen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1201_SQLBedingungen.mdb.

Bedingungen in Abfragen

In der Entwurfsansicht von Abfragen stellen Sie Kriterien ganz einfach ein, indem Sie festlegen, für welches Feld das Kriterium gelten soll und den Vergleichswert unten in der Zeile Kriterium der entsprechenden Spalte eintragen (siehe Bild 1).

Eingeben von Abfragekriterien in der Entwurfsansicht einer Abfrage

Bild 1: Eingeben von Abfragekriterien in der Entwurfsansicht einer Abfrage

Wenn Sie Kriterien für verschiedene Spalten festlegen möchten, tragen Sie diese einfach in die gewünschten Spalten ein, und wenn Sie mehrere Kriterien durch AND oder OR verknüpfen möchten, bietet die Entwurfsansicht auch hierfür eine Möglichkeit.

Unter SQL ist das kaum komplizierter, und das beste ist: Wenn Sie sich einmal nicht sicher sind, wie ein SQL-Ausdruck mit einer Bedingung aussehen soll, dann stellen Sie die entsprechende Abfrage einfach in der Entwurfsansicht zusammen und wechseln dann in die SQL-Ansicht – dort finden Sie dann den passenden Ausdruck vor.

Leider gelingt dies nicht mit allen möglichen Bedingungen: Wenn Sie beispielsweise eine verschachtelte und mit AND und OR versehene Bedingung formulieren möchten, müssen Sie diese auch in der Entwurfsansicht einer Abfrage manuell eintragen.

Das WHERE-Schlüsselwort

Das wichtigste Element beim Zusammenstellen von SELECT-Abfragen mit Bedingungen heißt WHERE. Es leitet den Teil des SQL-Ausdrucks ein, der die Bedingungen enthält. Die SQL-Ansicht für die Abfrage aus der Abbildung liefert beispielsweise folgenden Ausdruck:

SELECT tblArtikel.ArtikelID, tblArtikel.Artikelname
FROM tblArtikel
WHERE (((tblArtikel.Artikelname)="Chai"));

Wie Sie bereits erfahren haben, kann es nie schaden, den Tabellennamen bei der Auflistung der anzuzeigenden Felder mit anzugeben – auf diese Weise verhindern Sie Fehler, wenn beispielsweise ein Feldname in mehreren per Abfrage verknüpften Tabellen vorkommt und nicht eindeutig zugeordnet werden kann. In der WHERE-Bedingung ist Access jedoch etwas übervorsichtig. Zwar schaden überzählige Klammern-Paare nicht, jedoch führen diese auch leicht zu Fehlern. Aus dem Ausdruck

WHERE (((tblArtikel.Artikelname)="Chai"));

können Sie auch leicht den folgenden machen, indem Sie einige Klammern entfernen:

WHERE tblArtikel.Artikelname="Chai";

Und wenn Sie, was bei einer Abfrage mit nur einer Herkunftstabelle leicht möglich ist, noch die Tabellenbezeichnung weglassen, erhalten Sie schließlich diese Abfrage als eine der einfachsten Varianten einer Auswahlabfrage mit Kriterium:

SELECT ArtikelID, Artikelname
FROM tblArtikel
WHERE Artikelname="Chai";

Fehlerquelle Zeichenkette

Hier ist gleich ein wichtiger Aspekt und eine häufige Fehlerquelle bei der Zusammenstellung von SQL-Abfragen sichtbar: Der Vergleichsausdruck wird in Anführungszeichen eingefasst. In der Entwurfsansicht einer Abfrage nimmt Access einem die Arbeit ab: Es nimmt Vergleichsausdrücke wie Chai für das Feld Artikelname klaglos entgegen, wandelt es dann aber in “Chai” um. Wenn Sie beispielsweise einen Zahlenwert als Kriterium für das Feld ArtikelID eingeben, geschieht dies nicht – die Zahl wird so beibehalten, und auch in der SQL-Ansicht erscheinen keine Anführungszeichen:

SELECT ArtikelID, Artikelname
FROM tblArtikel
WHERE ArtikelID=1;

Access prüft hier automatisch, welchen Datentyp das Feld hat, für das Sie die Bedingung anlegen, und fügt im Falle des Datentyps Text automatisch Anführungszeichen hinzu. Zuvor prüft es jedoch, ob der angegebene Ausdruck eventuell einem Funktionsnamen oder Feldnamen entspricht. Wenn Sie einen fixen Vergleichsausdruck für ein Textfeld festlegen, müssen Sie Anführungszeichen verwenden. Am besten noch einfache Anführungszeichen, dann können Sie einen solchen SQL-Ausdruck später besser in VBA verwenden:

SELECT ArtikelID, Artikelname
FROM tblArtikel
WHERE Artikelname='Chai';

Vergleichsausdruck zusammenstellen

Der Platz für die WHERE-Klausel ist immer direkt hinter der Auflistung der beteiligten Tabellen. Die WHERE-Klausel besteht aus einem oder mehreren Ausdrücken der Art . Der Ausdruck enthält meist den Feldwert, einen Ausdruck wie zum Beispiel =, >, >=, <, <=, <> oder LIKE und den statischen oder dynamischen Vergleichswert wie einen Zahlenwert, eine Zeichenkette oder auch einen Verweis auf ein anderes Feld der Datenherkunft der Abfrage. Unter Access können Sie sogar Verweise auf Inhalte von Steuerelementen in Formularen oder Funktionen angeben – sowohl eingebaute als auch benutzerdefinierte Funktionen sind dabei zulässig. Je nach dem Felddatentyp und dem verwendeten Vergleichsoperator sind verschiedene Vergleichsoperatoren möglich – mehr dazu weiter unten.

Vergleichsausdrücke mit OR oder AND verknüpfen

Wenn Sie gleich mehrere Vergleichsausdrücke angeben, müssen Sie sich entscheiden, ob die Abfrage alle Ergebnisse zurückgibt, für die mindestens einer der Ausdrücke wahr ist oder ob alle Ausdrücke wahr sein müssen – und gelegentlich werden Sie sogar Mischformen verwenden.

Wenn Sie beispielsweise alle Bestellungen ermitteln möchten, die durch die Kunden mit dem Wert 1 oder 2 im Feld KundeID getätigt wurden, verwenden Sie etwa folgende Abfrage:

SELECT BestellungID, KundeID
FROM tblBestellungen
WHERE KundeID=1 OR KundeID=2;

Wenn Sie einen Kunden ermitteln möchten, dessen Firma mit A und dessen Postleitzahl mit 1 beginnt und die Abfrage alle Felder zurückliefern soll, verwenden Sie etwa folgenden Ausdruck:

SELECT *
FROM tblKunden
WHERE Firma Like 'A*' AND PLZ Like '1*';

Klammernsetzung

Gelegentlich werden Sie Kombinationen aus mit AND und/oder OR verknüpften Bedingungen auswerten. Die Abfrage aus Bild 2 etwa soll alle Artikel liefern, deren Artikelname mit dem Buchstaben C beginnt und deren Feld LieferantID den Wert 1 oder 2 besitzt. Bei der Notation in der Abbildung setzt Access im SQL-Ausdruck automatisch LieferantID = 1 OR LieferantID = 2 in Klammern und wertet diesen Ausdruck aus, bevor die Bedingung für den Artikelnamen hinzukommt.

AND und OR in einer einzigen Abfrage

Bild 2: AND und OR in einer einzigen Abfrage

SELECT tblArtikel.ArtikelID, tblArtikel.Artikelname, 
tblArtikel.LieferantID
FROM tblArtikel
WHERE tblArtikel.Artikelname Like 'C*' AND 
(tblArtikel.LieferantID = 1 OR 
tblArtikel.LieferantID = 2);

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar