Home > Artikel > Ausgabe 1/2012 > SQL: SELECT-Abfragen, Teil II

SQL: SELECT-Abfragen, Teil II

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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);

Dies ist durchaus bedeutungsvoll. Wenn Sie die Klammer nämlich weglassen, arbeitet Access die Bedingungen einfach von links nach rechts ab:

tblArtikel.Artikelname Like 'C*'

AND tblArtikel.LieferantID = 1

OR tblArtikel.LieferantID = 2;

Das bedeutet, das Access zuerst alle Einträge ermittelt, deren Artikelname mit C beginnt und die gleichzeitig den Lieferanten mit der ID 1 haben. Im zweiten Schritt kommen dann alle Artikel hinzu, deren LieferantID den Wert 2 hat – unabhängig vom Anfangsbuchstaben. Und das liefert tatsächlich ein ganz anderes Ergebnis als der vorherige Ausdruck. Schließlich sieht auch der Abfrageentwurf ganz anders aus (siehe Bild 3).

Zwei verknüpfte Tabellen in der Entwurfsansicht einer Abfrage

Bild 3: Zwei verknüpfte Tabellen in der Entwurfsansicht einer Abfrage

Vergleichsoperatoren

Access-SQL stellt die folgenden Vergleichsoperatoren zusammen:

  • gleich (=), größer als (>), kleiner als (<), größer gleich (>=), kleiner gleich (<=) und ungleich (<>)
  • Nicht (NOT)
  • Zwischen (BETWEEN ... AND ...)
  • Mengenvergleich (IN)
  • Vergleich mit Nullwert (IS NULL)
  • Wie (LIKE, dient zum Vergleich mit Platzhaltern und ist nur für Zeichenketten vorgesehen)

Wenn Sie den Inhalt von Feldern der Abfrage mit Zahlen vergleichen möchten, verwenden Sie die üblichen Operatoren wie größer, kleiner, gleich und deren Kombinationen:

SELECT * FROM tblArtikel WHERE Einzelpreis > 10

Wenn Sie Artikel ermitteln möchten, deren Preis in einem bestimmten Bereich liegt, haben Sie mehrere Möglichkeiten. Intuitiv scheint die Angabe zweier mit AND verknüpfter Kriterien:

SELECT * FROM tblArtikel

WHERE Einzelpreis > 10 AND Einzelpreis < 20

Sie können für diesen Zweck aber auch den BETWEEN-Operator verwenden:

SELECT * FROM tblArtikel

WHERE Einzelpreis BETWEEN 10 AND 20

Letztere schließt allerdings auch Artikel ein, die 10,- Euro oder 20,- Euro kosten. Das genaue Pendant mit größer/kleiner/gleich müsste also so aussehen:

SELECT * FROM tblArtikel

WHERE Einzelpreis >= 10 AND Einzelpreis =< 20

Sollten Sie Dezimalzahlen als Vergleichswerte verwenden, geben Sie diese mit dem Punkt als Dezimaltrennzeichen an, außerdem dürfen Sie keine weiteren Zeichen wie etwa Währungssymbole oder Prozentzeichen einfügen:

SELECT * FROM tblArtikel WHERE Einzelpreis > 7.5

Textvergleiche

Wenn Sie den Inhalt von Textfeldern mit Texten vergleichen möchten, verwenden Sie meist das Gleichzeitszeichen (wenn der exakte Ausdruck gesucht werden soll) oder den LIKE-Operator. Der LIKE-Operator erlaubt im Gegensatz zum Gleichheitszeichen den Einsatz von Platzhaltern (einige Beispiele haben Sie oben bereits kennengelernt – zum Beispiel, als wie alle Kunden ermittelt haben, deren Firma mit A beginnt).

Es gibt zwei Platzhalter, die Sie beliebig einsetzen können:

  • Das Sternchen (*) steht stellvertretend für beliebig viele beliebige Zeichen,
  • das Fragezeichen (?) steht für genau ein beliebiges Zeichen.

Hier sind einige Beispiele für WHERE-Bedingungen mit dem LIKE-Operator:

  • Artikelname LIKE 'A*': Liefert alle Artikel, deren Name mit A beginnt
  • Artikelname LIKE '*saft': Liefert alle Artikel, deren Name mit saft endet.
  • Artikelname LIKE '*A*': Liefert alle Artikelnamen, die ein A enthalten.
  • Artikelname LIKE '?-Saft': Liefert alle Artikel, deren Name auf -Saft endet und nur einen weiteren, führenden Buchstaben enthält - also beispielsweise A-Saft und O-Saft.

Für den Vergleich mit Zeichenketten können Sie auch die Operatoren >, <, =, >=, <= und <> verwenden:

  • Artikelname < 'C' liefert beispielsweise alle Artikel, die mit A oder B beginnen.
  • Artikelname >= 'A' AND Artikelname < 'N': Alle Artikelnamen, die mit A bis M beginnen.

Datumsvergleiche

Wenn Sie Datensätze nach dem Inhalt von Datumsfeldern vergleichen möchten, hilft die Entwurfsansicht für Abfragen ein gutes Stück weiter. Sie erkennt Datumsangaben und fasst diese gleich in Raute-Zeichen (#) ein (siehe Bild 4). Allerdings landet der Ausdruck =#01.01.2010# nicht genau so im SQL-Ausdruck. Für diesen werden nämlich noch die Punkte durch Schrägstriche ersetzt:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!