So schreiben Sie Microsoft Access-SQL-Abfragen von Grund auf

So schreiben Sie Microsoft Access-SQL-Abfragen von Grund auf

Microsoft Access ist wohl das leistungsstärkste Tool in der gesamten Microsoft Office-Suite, aber es verwirrt (und manchmal erschreckt) Office-Power-User. Wie soll sich jemand mit einer steileren Lernkurve als Word oder Excel mit der Verwendung dieses Tools auseinandersetzen? Bruce Epper wird sich diese Woche mit einigen der Themen befassen, die durch diese Frage eines unserer Leser angeregt wurden.



Ein Leser fragt:

Ich habe Probleme beim Schreiben einer Abfrage in Microsoft Access.Ich habe eine Datenbank mit zwei Produkttabellen, die eine gemeinsame Spalte mit einem numerischen Produktcode und einem zugehörigen Produktnamen enthalten.Ich möchte herausfinden, welche Produkte aus Tabelle A gefunden werden können in Tabelle B. Ich möchte eine Spalte namens Ergebnisse hinzufügen, die den Produktnamen aus Tabelle A enthält, falls vorhanden, und den Produktnamen aus Tabelle B, wenn er nicht in Tabelle A vorhanden ist. Haben Sie einen Rat?





Bruces Antwort:

Microsoft Access ist ein Datenbankverwaltungssystem (DBMS), das für die Verwendung auf Windows- und Mac-Computern entwickelt wurde. Es verwendet die Jet-Datenbank-Engine von Microsoft für die Datenverarbeitung und -speicherung. Es bietet auch eine grafische Benutzeroberfläche, die das Verständnis der Structured Query Language (SQL) fast überflüssig macht.





SQL ist die Befehlssprache, die verwendet wird, um in der Datenbank gespeicherte Informationen hinzuzufügen, zu löschen, zu aktualisieren und zurückzugeben sowie um Kerndatenbankkomponenten wie das Hinzufügen, Löschen oder Ändern von Tabellen oder Indizes zu ändern.

Startpunkt

Wenn Sie mit Access oder einem anderen RDBMS noch nicht vertraut sind, empfehle ich Ihnen, mit diesen Ressourcen zu beginnen, bevor Sie fortfahren:



  • Was ist also eine Datenbank? wo Ryan Dube Excel verwendet, um die Grundlagen relationaler Datenbanken zu zeigen.
  • Eine Kurzanleitung für die ersten Schritte mit Microsoft Access 2007 Dies ist eine allgemeine Übersicht über Access und die Komponenten, aus denen eine Access-Datenbank besteht.
  • Ein kurzes Tutorial zu Tabellen in Microsoft Access 2007 wirft einen Blick auf das Erstellen Ihrer ersten Datenbank und Tabellen zum Speichern Ihrer strukturierten Daten.
  • Ein kurzes Tutorial zu Abfragen in Microsoft Access 2007 untersucht die Mittel, um bestimmte Teile der in den Datenbanktabellen gespeicherten Daten zurückzugeben.

Wenn Sie ein grundlegendes Verständnis der in diesen Artikeln bereitgestellten Konzepte haben, wird das Folgende etwas leichter zu verdauen sein.

Datenbankbeziehungen und Normalisierung

Stellen Sie sich vor, Sie leiten ein Unternehmen, das weltweit 50 verschiedene Arten von Widgets verkauft. Sie haben einen Kundenstamm von 1.250 und verkaufen in einem durchschnittlichen Monat 10.000 Widgets an diese Kunden. Sie verwenden derzeit eine einzige Tabelle, um all diese Verkäufe zu verfolgen – praktisch eine einzige Datenbanktabelle. Und jedes Jahr fügt Ihrer Tabelle Tausende von Zeilen hinzu.





Die obigen Bilder sind Teil der von Ihnen verwendeten Tabelle zur Auftragsverfolgung. Angenommen, diese beiden Kunden kaufen mehrmals im Jahr Widgets von Ihnen, sodass Sie für beide weit mehr Zeilen haben.





Wenn Joan Smith Ted Baines heiratet und seinen Nachnamen annimmt, muss jetzt jede einzelne Zeile, die ihren Namen enthält, geändert werden. Das Problem wird noch verschlimmert, wenn Sie zufällig zwei verschiedene Kunden mit dem Namen 'Joan Smith' haben. Aufgrund eines recht häufigen Ereignisses ist es gerade viel schwieriger geworden, Ihre Verkaufsdaten konsistent zu halten.

Durch die Verwendung einer Datenbank und die Normalisierung der Daten können wir Artikel in mehrere Tabellen wie Inventar, Kunden und Bestellungen aufteilen.

Wenn wir uns nur den Client-Teil unseres Beispiels ansehen, würden wir die Spalten für Client Name und Client Address entfernen und sie in eine neue Tabelle einfügen. Im obigen Bild habe ich auch die Dinge besser aufgegliedert, um einen genaueren Zugriff auf die Daten zu erhalten. Die neue Tabelle enthält auch eine Spalte für einen Primärschlüssel (ClientID) – eine Zahl, die verwendet wird, um auf jede Zeile in dieser Tabelle zuzugreifen.

In der ursprünglichen Tabelle, in der wir diese Daten entfernt haben, würden wir eine Spalte für einen Fremdschlüssel (ClientID) hinzufügen, der auf die richtige Zeile mit den Informationen für diesen bestimmten Client verweist.

Wenn Joan Smith nun ihren Namen in Joan Baines ändert, muss die Änderung nur einmal in der Client-Tabelle vorgenommen werden. Jede andere Referenz aus verknüpften Tabellen wird den richtigen Kundennamen abrufen und ein Bericht, der untersucht, was Joan in den letzten 5 Jahren gekauft hat, erhält alle Bestellungen sowohl unter ihrem Mädchen- als auch unter ihrem Ehenamen, ohne dass die Erstellung des Berichts geändert werden muss. .

Als zusätzlicher Vorteil reduziert dies auch den Gesamtspeicherverbrauch.

Join-Typen

SQL definiert fünf verschiedene Arten von Joins: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER und CROSS. Das Schlüsselwort OUTER ist in der SQL-Anweisung optional.

Microsoft Access ermöglicht die Verwendung von INNER (Standard) , LEFT OUTER, RIGHT OUTER und CROSS. FULL OUTER wird als solches nicht unterstützt, aber durch die Verwendung von LEFT OUTER, UNION ALL und RIGHT OUTER kann es auf Kosten von mehr CPU-Zyklen und E/A-Operationen gefälscht werden.

Die Ausgabe eines CROSS-Joins enthält jede Zeile der linken Tabelle gepaart mit jeder Zeile der rechten Tabelle. Das einzige Mal, dass ich jemals gesehen habe, dass ein CROSS-Join verwendet wurde, waren Lasttests von Datenbankservern.

Schauen wir uns an, wie die grundlegenden Verknüpfungen funktionieren, und passen sie dann an unsere Bedürfnisse an.

Beginnen wir damit, zwei Tabellen, ProdA und ProdB, mit den folgenden Entwurfseigenschaften zu erstellen.

Die AutoNumber ist eine automatisch inkrementierende lange Ganzzahl, die Einträgen zugewiesen wird, wenn sie der Tabelle hinzugefügt werden. Die Option Text wurde nicht geändert, daher wird eine Textzeichenfolge mit einer Länge von bis zu 255 Zeichen akzeptiert.

Füllen Sie sie nun mit einigen Daten aus.

Um die Unterschiede in der Funktionsweise der 3 Join-Typen zu zeigen, habe ich die Einträge 1, 5 und 8 aus ProdA gelöscht.

Nächste, eine neue Abfrage erstellen indem du zu gehst Erstellen > Abfragedesign . Wählen Sie beide Tabellen aus dem Dialog Tabelle anzeigen und Klicken Sie auf Hinzufügen , dann Nah dran .

Klicken Sie auf ProductID in der Tabelle ProdA, ziehen Sie es auf ProductID in der Tabelle ProdB und lassen Sie die Maustaste los, um die Beziehung zwischen den Tabellen herzustellen.

Klicken Sie mit der rechten Maustaste auf die Linie zwischen den Tabellen, die die Beziehung zwischen den Elementen und . darstellen Wählen Sie Verbindungseigenschaften .

Standardmäßig ist Join-Typ 1 (INNER) ausgewählt. Option 2 ist ein LEFT OUTER-Join und 3 ist ein RIGHT OUTER-Join.

Wir werden uns zuerst den INNER-Join ansehen, also klicken Sie auf OK, um den Dialog zu schließen.

Wählen Sie im Abfrage-Designer die Felder aus, die wir aus den Dropdown-Listen sehen möchten.

Wenn wir die Abfrage ausführen (das rote Ausrufezeichen im Menüband), wird das Feld ProductName aus beiden Tabellen mit dem Wert aus der Tabelle ProdA in der ersten Spalte und ProdB in der zweiten angezeigt.

Beachten Sie, dass die Ergebnisse nur Werte anzeigen, bei denen ProductID in beiden Tabellen gleich ist. Obwohl in der Tabelle ProdB ein Eintrag für ProductID = 1 vorhanden ist, wird dieser nicht in den Ergebnissen angezeigt, da ProductID = 1 in der Tabelle ProdA nicht vorhanden ist. Gleiches gilt für ProductID = 11. Sie existiert in der Tabelle ProdA aber nicht in der Tabelle ProdB.

Wenn Sie die Schaltfläche Ansicht im Menüband verwenden und zur SQL-Ansicht wechseln, können Sie die vom Designer generierte SQL-Abfrage anzeigen, die zum Abrufen dieser Ergebnisse verwendet wurde.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Wechseln Sie zurück zur Entwurfsansicht und ändern Sie den Verbindungstyp in 2 (LINKS AUSSEN). Führen Sie die Abfrage aus, um die Ergebnisse anzuzeigen.

Wie Sie sehen, wird jeder Eintrag in der Tabelle ProdA in den Ergebnissen dargestellt, während nur die Einträge in ProdB, die einen übereinstimmenden ProductID-Eintrag in der Tabelle ProdB haben, in den Ergebnissen erscheinen.

Das Leerzeichen in der Spalte ProdB.ProductName ist ein spezieller Wert (NULL), da kein übereinstimmender Wert in der Tabelle ProdB vorhanden ist. Dies wird sich später als wichtig erweisen.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Versuchen Sie dasselbe mit der dritten Verbindungsart (RIGHT OUTER).

Die Ergebnisse zeigen alles aus der Tabelle ProdB, während leere (als NULL bezeichnete) Werte angezeigt werden, bei denen die ProdA-Tabelle keinen übereinstimmenden Wert hat. Damit sind wir bisher den gewünschten Ergebnissen unserer Leserfrage am nächsten.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Verwenden von Funktionen in einer Abfrage

Die Ergebnisse einer Funktion können auch als Teil einer Abfrage zurückgegeben werden. Wir möchten, dass in unserem Resultset eine neue Spalte mit dem Namen 'Ergebnisse' angezeigt wird. Sein Wert ist der Inhalt der Spalte ProductName der Tabelle ProdA, wenn ProdA einen Wert hat (er ist nicht NULL), andernfalls sollte er aus der Tabelle ProdB genommen werden.

Die Funktion Immediate IF (IIF) kann verwendet werden, um dieses Ergebnis zu generieren. Die Funktion benötigt drei Parameter. Die erste ist eine Bedingung, die zu einem True- oder False-Wert ausgewertet werden muss. Der zweite Parameter ist der zurückzugebende Wert, wenn die Bedingung True ist, und der dritte Parameter ist der zurückzugebende Wert, wenn die Bedingung False ist.

Das vollständige Funktionskonstrukt für unsere Situation sieht so aus:

IIF(ProdA.ProductID Is Null, ProdB.ProductName,ProdA.ProductName)

Beachten Sie, dass der Bedingungsparameter nicht auf Gleichheit prüft. Ein Nullwert in einer Datenbank hat keinen Wert, der mit einem anderen Wert verglichen werden kann, einschließlich einem anderen Nullwert. Mit anderen Worten, Null ist nicht gleich Null. Je. Um dies zu umgehen, überprüfen wir stattdessen den Wert mit dem Schlüsselwort 'Is'.

Wir hätten auch 'Is Not Null' verwenden und die Reihenfolge der True- und False-Parameter ändern können, um das gleiche Ergebnis zu erhalten.

Wenn Sie dies in den Query Designer eingeben, müssen Sie die gesamte Funktion in den Feld:-Eintrag eingeben. Damit es die Spalte 'Ergebnisse' erstellt, müssen Sie einen Alias ​​verwenden. Stellen Sie dazu der Funktion 'Ergebnisse:' voran, wie im folgenden Screenshot zu sehen.

Der entsprechende SQL-Code dazu wäre:

SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null,ProdB.ProductName,ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Wenn wir diese Abfrage jetzt ausführen, werden diese Ergebnisse erzeugt.

So öffnen Sie das Terminal auf dem Chromebook

Hier sehen wir für jeden Eintrag, bei dem die Tabelle ProdA einen Wert hat, dieser Wert in der Ergebnisspalte widergespiegelt wird. Wenn es keinen Eintrag in der ProdA-Tabelle gibt, erscheint der Eintrag von ProdB in den Ergebnissen, was genau das ist, was unser Leser gefragt hat.

Weitere Ressourcen zum Erlernen von Microsoft Access finden Sie in Joel Lees How to Learn Microsoft Access: 5 Free Online Resources .

Teilen Teilen Tweet Email Lohnt sich ein Upgrade auf Windows 11?

Windows wurde neu gestaltet. Aber reicht das aus, um Sie davon zu überzeugen, von Windows 10 auf Windows 11 umzusteigen?

Weiter lesen
Verwandte Themen
  • Produktivität
  • Fragen Sie die Experten
Über den Autor Bruce Epper(13 veröffentlichte Artikel)

Bruce spielt seit den 70er Jahren mit Elektronik, seit den frühen 80er Jahren mit Computern und beantwortet präzise Fragen zu Technologien, die er die ganze Zeit nicht verwendet oder gesehen hat. Er nervt sich auch selbst, indem er versucht, Gitarre zu spielen.

Mehr von Bruce Epper

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um sich zu abonnieren