Home > Artikel > Ausgabe 12/2011 > SQL: SELECT-Abfragen, Teil I

SQL: SELECT-Abfragen, Teil I

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

Früher oder später ist es soweit: Sie formulieren Ihre erste eigene SQL-Abfrage. Der Abfrage-Editor kann den Zeitpunkt aufschieben, aber irgendwann wollen Sie beispielsweise für den Einsatz in einem DAO-Recordset mal eben selbst eine SELECT-Anweisung zusammenstellen. Glücklicherweise ist SQL kein Buch mit sieben Siegeln. Die Grundlagen zum Auswählen von Daten mit der SELECT-Anweisung lernen Sie in diesem Artikel kennen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1112_SQLSELECT.mdb.

SQL – was ist das?

SQL steht für Structured Query Language, was wiederum Strukturierte Abfragesprache bedeutet. SQL kommt in mehreren Dialekten, die sich von Hersteller zu Hersteller unterschieden – Microsoft's SQL Server, MySQL und andere Systeme verwenden alle Abfragesprachen mit kleinen Unterschieden. So auch Access: Es setzt Access-SQL ein, das weitgehend mit ANSI-89 Level 1 kompatibel ist. Weitgehend bedeutet hier, dass Access-SQL einige Elemente hinzufügt (wie etwa das Referenzieren von Formularen und Steuerelementen aus der SQL-Anweisung heraus), andere Features aber nicht konsequent übernimmt. Tatsache ist, dass grundlegende SQL-Kenntnisse anderer Dialekte bei Verwendung von Access-SQL nicht schaden können.

Access-SQL besteht im wesentlichen aus zwei Teilen: DDL (Data Definition Language) enthält Anweisungen, mit denen Sie Datenbanken, Tabellen, Felder und Indizes definieren. DML (Data Manipulation Language) wiederum liefert die Techniken zum Abfragen und zum Ändern von Daten, also zum Anlegen, Bearbeiten oder Löschen von Datensätzen.

Den ersten Teil der Data Manipulation Language, also das Abfragen von Daten, deckt weitgehend der SELECT-Befehl ab. Mit diesem können Sie alle Abfragen mit SQL definieren, die sich auch mit der Abfrage-Entwurfsansicht erstellen lassen.

Ein Beispiel ist die Abfrage aus Bild 1. Die Abfrage enthält zwei Tabellen und ein Kriterium. Wenn Sie im Kontextmenü der Titelleiste des Abfragefensters den Eintrag SQL-Ansicht auswählen, erhalten Sie die Ansicht aus Bild 2. Das sieht für jemanden, der noch nie eine SQL-Anweisung gesehen hat, möglicherweise etwas kompliziert aus. In der Tat enthält dieser kleine Text alle Informationen, die Sie über die Abfrage-Entwurfsansicht eingetragen haben.

Abfrage mit zwei Tabellen und einem Kriterium in der Abfrage-Entwurfsansicht ...

Bild 1: Abfrage mit zwei Tabellen und einem Kriterium in der Abfrage-Entwurfsansicht ...

... und in der SQL-Ansicht.

Bild 2: ... und in der SQL-Ansicht.

Wohin damit?

SQL-Ausdrücke, die in einfachen Fällen etwa SELECT * FROM tblArtikel lauten und alle Datensätze der Tabelle tblArtikel zurückliefern, können Sie an sehr vielen Stellen einsetzen.

Wenn Sie beispielsweise eine UNION-Abfrage wie in Daten zusammenführen mit UNION-Abfragen beschrieben erstellen, kommen Sie um den Einsatz der SQL-Ansicht einer Abfrage nicht herum.

Wenn Sie die Datenherkunft für Formulare oder Berichte festlegen oder die Datensatzherkunft für Kombinations- und Listenfelder, wird diese ebenfalls als SQL-Ausdruck gespeichert (siehe Bild 3). Erst wenn Sie die Abfrage unter einem eigenen Namen speichern, sodass diese im Datenbankfenster oder im Navigationsbereich sichtbar wird, enthält auch die entsprechende Eigenschaft diesen Namen.

SQL-Ausdruck als Wert der Eigenschaft Datenherkunft eines Formulars

Bild 3: SQL-Ausdruck als Wert der Eigenschaft Datenherkunft eines Formulars

Auch die Eigenschaft Datensatzherkunft von Tabellenfeldern, für die Sie mit dem Nachschlagefeld-Assistenten ein Nachschlagefeld eingerichtet haben, wird mit dem entsprechenden SQL-Ausdruck gefüllt (siehe Bild 4).

SQL-Ausdrücke in Nachschlagefeldern

Bild 4: SQL-Ausdrücke in Nachschlagefeldern

Sollten Sie mit DAO arbeiten, um per VBA-Code auf die Daten in den Tabellen Ihrer Datenbank zuzugreifen, können Sie ebenfalls sowohl den Namen von Tabellen oder Abfragen, aber auch einen expliziten SQL-Ausdruck angeben (mehr dazu beispielsweise im Artikel DAO: Recordsets öffnen, lesen und bearbeiten).

Für Aktionsabfragen wie die Anfüge-, die Lösch-, die Aktualisierungs- und die Tabellenerstellungsabfrage gibt es sogar noch weitere Möglichkeiten:

  • Sie können solche Abfragen direkt als Parameter der RunSQL-Methode des DoCmd-Objekts angeben.
  • Auch die Execute-Methode des Database-Objekts ist für das Ausführen von Aktionsabfragen im SQL-Format prädestiniert.
  • Und schließlich bieten auch Makros eine Möglichkeit, direkt SQL-Ausdrücke auszuführen – nämlich mit der Makroaktion AusführenSQL (siehe Bild 5).
  • Aktionsabfrage per Makro

    Bild 5: Aktionsabfrage per Makro

SQL-Ansicht anzeigen

Die SQL-Ansicht können Sie überall dort aktivieren, wo die Abfrage auch in der Entwurfsansicht erscheint. Je nach Access-Version gibt es dafür verschiedene Einträge im Menü beziehungsweise im Ribbon.

Daher verwenden Sie am einfachsten die versionsübergreifende Methode: den bereits erwähnten Eintrag SQL-Ansicht des Kontextmenüs der Titelzeile einer Abfrage.

Alle Daten einer Tabelle ermitteln

Wenn Sie einer Datenherkunft eines Formulars oder Berichts, der Datensatzherkunft eines Kombinations- oder Listenfeldes oder einer OpenRecordset-Methode alle Datensätze einer Tabelle übergeben möchten, reicht es eigentlich aus, den Namen der Tabelle anzugeben. Die entsprechende SQL-Anweisung, die alle Felder für alle Datensätze der angegebenen Tabelle zurückliefert, besteht aus dem Tabellennamen und vorangestelltem SELECT * FROM:

SELECT * FROM tblArtikel

Dies ist jedoch nur die Kurzform. Der Vollständigkeit halber sollten Sie dem Sternchen als Platzhalter für alle Felder noch den Tabellennamen voranstellen:

SELECT tblArtikel.* FROM tblArtikel

Nur bestimmte Felder ausgeben

Wenn Sie nicht alle Felder der Tabelle ausgeben möchten, sondern nur bestimmte Felder, geben Sie diese als komma-separierte Liste anstelle des Sternchens an. Dies sieht für die beiden Felder ArtikelID und Artikelname etewa so aus:

SELECT ArtikelID, Artikelname FROM tblArtikel;

Wenn Sie diese Abfrage mit der Abfrage-Entwurfsansicht anlegen (siehe Bild 6) und dann zur SQL-Ansicht wechseln, sieht der SQL-Ausdruck so aus:

Abfrage mit nur zwei Feldern der Quelltabelle

Bild 6: Abfrage mit nur zwei Feldern der Quelltabelle

SELECT tblArtikel.ArtikelID, tblArtikel.Artikelname FROM tblArtikel;

Zwingend notwendig wird dies, wenn die Abfrage Daten aus mehreren Tabellen anzeigen soll und Felder gleichen Namens in mehr als einer Tabelle vorkommen.

Ein Beispiel ist die folgende Abfrage (die Details zu den Schlüsselwörtern INNER JOIN et cetera klären wir später):

SELECT ArtikelID, Artikelname, LieferantID FROM tblLieferanten INNER JOIN tblArtikel ON tblLieferanten.LieferantID = tblArtikel.LieferantID;

Diese Abfrage liefert beim Versuch, in die Datenblatt- oder Entwurfsansicht zu wechseln, die Fehlermeldung aus Bild 7. Um dies zu verhindern, reicht es aus, Felder mit mehrfach vorkommenden Feldnamen durch Voranstellen des Tabellennamens zu kennzeichnen.

Fehlermeldung beim Einsatz einer Abfrage mit Feldern, die in mehreren beteiligten Tabellen vorkommen

Bild 7: Fehlermeldung beim Einsatz einer Abfrage mit Feldern, die in mehreren beteiligten Tabellen vorkommen

Feldnamen mit Sonderzeichen

Auch wenn es normalerweise nicht der Fall sein sollte: Gelegentlich werden Sie auf Feldnamen treffen, die Sonderzeichen wie das Leerzeichen, Minuszeichen et cetera enthalten. Wenn also beispielsweise das Feld ArtikelID den Namen Artikel-ID erhält (wie in der Tabelle tblArtikelAlt der Beispieldatenbank) und Sie eine Abfrage wie folgt ausführen, treffen Sie auf Probleme – und zwar in Form der Abfrage eines Parameters wie in Bild 8 (im Anschluss fragt Access noch nach einem Wert für das Feld ID):

Parameterabfrage beim Auftauchen von Sonderzeichen

Bild 8: Parameterabfrage beim Auftauchen von Sonderzeichen

SELECT tblArtikel_Alt.Artikel-ID, tblArtikel_Alt.Artikelname FROM tblArtikel_Alt;

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!