Access 2010: Abfragen mit dem SQL Editor: Unterschied zwischen den Versionen
K |
|||
Zeile 58: | Zeile 58: | ||
Fassen wir noch einmal zusammen: In diesem Beispiel wurde mit dem SELECT Befehl eine Abfrage über die Felder „Name, Vorname und ICQ Nummer" aus der Tabelle Tabelle_Nutzer gefertigt. | Fassen wir noch einmal zusammen: In diesem Beispiel wurde mit dem SELECT Befehl eine Abfrage über die Felder „Name, Vorname und ICQ Nummer" aus der Tabelle Tabelle_Nutzer gefertigt. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
===Aufbau der SQL-Syntax=== | ===Aufbau der SQL-Syntax=== | ||
Zeile 119: | Zeile 119: | ||
Wird nun der Inhalt der Tabelle durch ein neues Buch ergänzt, erweitert sich die Abfrage beim nächsten Aufrufen um diese Tabelle. Der Vorteil liegt auf der Hand: Tabellenauszüge sind durch die Möglichkeit der Abfrage immer aktuell. | Wird nun der Inhalt der Tabelle durch ein neues Buch ergänzt, erweitert sich die Abfrage beim nächsten Aufrufen um diese Tabelle. Der Vorteil liegt auf der Hand: Tabellenauszüge sind durch die Möglichkeit der Abfrage immer aktuell. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====WHERE Bedingung==== | ====WHERE Bedingung==== | ||
Zeile 148: | Zeile 148: | ||
* Der Ausdruck wird dann entsprechend in Anführungszeichen "DVD" gesetzt. Die Anführungszeichen dürfen entfallen, wenn nach Zahlen gefiltert wird. | * Der Ausdruck wird dann entsprechend in Anführungszeichen "DVD" gesetzt. Die Anführungszeichen dürfen entfallen, wenn nach Zahlen gefiltert wird. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
===== Operatoren, Platzhalter und Bedingungsausdrücke===== | ===== Operatoren, Platzhalter und Bedingungsausdrücke===== | ||
Zeile 164: | Zeile 164: | ||
Im Kapitel [[Access 2010: Operatoren, Platzhalter und Bedingungsausdrücke]] sind die Bedingungen bereits ausführlich erklärt worden. Diese gelten in der SQL Syntax genauso. Wer diese nicht mehr parat hat, dem sei das Kapitel noch einmal ans Herz gelegt. | Im Kapitel [[Access 2010: Operatoren, Platzhalter und Bedingungsausdrücke]] sind die Bedingungen bereits ausführlich erklärt worden. Diese gelten in der SQL Syntax genauso. Wer diese nicht mehr parat hat, dem sei das Kapitel noch einmal ans Herz gelegt. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====Sortieren mit ORDER BY==== | ====Sortieren mit ORDER BY==== | ||
Zeile 201: | Zeile 201: | ||
Dabei ist zu beachten, bei der Abtrennung der Datenfelder das Komma nicht zu vergessen. | Dabei ist zu beachten, bei der Abtrennung der Datenfelder das Komma nicht zu vergessen. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====Gruppieren und Sortieren verbinden==== | ====Gruppieren und Sortieren verbinden==== | ||
Zeile 231: | Zeile 231: | ||
Beim Aufstellen der Syntax muss man nur auf die Reihenfolge der Befehle achten. ODER BY kann niemals vor der WHERE Klausel kommen. | Beim Aufstellen der Syntax muss man nur auf die Reihenfolge der Befehle achten. ODER BY kann niemals vor der WHERE Klausel kommen. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====Gruppieren - GROUP BY==== | ====Gruppieren - GROUP BY==== | ||
Zeile 253: | Zeile 253: | ||
|} | |} | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
=====COUNT ... GROUP BY ===== | =====COUNT ... GROUP BY ===== | ||
Zeile 278: | Zeile 278: | ||
|} | |} | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
=====COUNT ... MIN / MAX ===== | =====COUNT ... MIN / MAX ===== | ||
Zeile 290: | Zeile 290: | ||
GROUP BY Medium; | GROUP BY Medium; | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====AS (Namen zuweisen)==== | ====AS (Namen zuweisen)==== | ||
Zeile 318: | Zeile 318: | ||
Die GROUP BY Klausel ist, eine wichtige und starke Funktion für Abfragen von Datenbanken. | Die GROUP BY Klausel ist, eine wichtige und starke Funktion für Abfragen von Datenbanken. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
===Berechnungen mit Abfragen ausführen=== | ===Berechnungen mit Abfragen ausführen=== | ||
Zeile 386: | Zeile 386: | ||
(Siehe auch in der Datenbank_ Abfrage_Preise mit und ohne MWSt) | (Siehe auch in der Datenbank_ Abfrage_Preise mit und ohne MWSt) | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
===SELECT DISTINCT - Doppelte Datensätze vermeiden=== | ===SELECT DISTINCT - Doppelte Datensätze vermeiden=== | ||
Zeile 399: | Zeile 399: | ||
(Siehe auch in der Datenbank_ Abfrage_Medium mit DISTINCT) | (Siehe auch in der Datenbank_ Abfrage_Medium mit DISTINCT) | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====Verknüpfungen mehrer Tabellen mit INNER JOIN, LEFT JOIN und RIGHT JOIN==== | ====Verknüpfungen mehrer Tabellen mit INNER JOIN, LEFT JOIN und RIGHT JOIN==== | ||
Zeile 424: | Zeile 424: | ||
Damit es gleich zu Anfang nicht so komplex wird, soll zuerst einmal die Tabelle Ausleihe mit der Tabelle Titel verknüpft werden. Als Ergebnis erhält man dann eine Abfrage (Liste), in der verzeichnet ist, wann welches Buch ausgeliehen wurde. | Damit es gleich zu Anfang nicht so komplex wird, soll zuerst einmal die Tabelle Ausleihe mit der Tabelle Titel verknüpft werden. Als Ergebnis erhält man dann eine Abfrage (Liste), in der verzeichnet ist, wann welches Buch ausgeliehen wurde. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====LEFT JOIN==== | ====LEFT JOIN==== | ||
Zeile 454: | Zeile 454: | ||
Zur Erinnerung: Gute Datenbanken vermeiden Lücken in Titel. Daher hat es sich eingebürgert, dass man Lücken mit den Unterstrich (_) ausfüllt. | Zur Erinnerung: Gute Datenbanken vermeiden Lücken in Titel. Daher hat es sich eingebürgert, dass man Lücken mit den Unterstrich (_) ausfüllt. | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
====Abfragen über mehrere Tabellen ==== | ====Abfragen über mehrere Tabellen ==== | ||
Zeile 490: | Zeile 490: | ||
ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium; | ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium; | ||
[[Media:CD_Verwaltung. | [[Media:CD_Verwaltung.accdb]] Beispieldatei CD_Verwaltung.accdb | ||
=== Weiterführende Online-Tutorials === | === Weiterführende Online-Tutorials === |
Version vom 22. Juli 2014, 15:29 Uhr
Abfragen mit dem SQL Editor
Access ist so programmiert, dass alle Abfragen in einem Dialogfeld eingegeben werden können. Die Dialogfelder setzen nämlich nichts anderes als eine SQL Syntax (Structured Query Language) zusammen. Im Abschnitt SQL-Ansicht wurde bereits darauf hingewiesen. In diesem Abschnitt soll nun genauer auf die Möglichkeit eingegangen werden, ganze Abfragen im SQL-Syntax zu schreiben. Vorteilhaft ist dabei die gute Übersicht für Braillenutzer. Außerdem können durch diese Methode kompliziertere Abfragen erstellt werden. Die Arbeit setzt allerdings voraus, dass man sich in SQL als Abfragesprache einarbeitet. SQL hat sich mittlerweile als Standard für relationale Datenbanken durchgesetzt; und so ist es auch nicht verwunderlich, dass Access im Kern mit SQL arbeitet. Für den Entwickler und Nutzer erleichtert dies die Arbeit mit Datenbanken, da für verschiedene Systemumgebungen nicht verschiedene Sprachen gelernt werden müssen. Anwender, die bereits Erfahrungen mit SQL haben, werden feststellen, dass sich die Microsoft-SQL in der Syntaxstrukur geringfügig unterscheidet. Der Umstieg sollte aber nicht schwer fallen.
Allgemeiner Hinweis zur Methode
Um eine Abfrage im SQL Editor ( auch SQL-Ansicht genannt) einfügen bzw. bearbeiten zu können, muss man zuerst eine Abfrage in der bekannten Weise in der Entwurfansicht erstellen.
Ein Beispiel anhand der „CD_Verwaltung.mbd" soll das Vorgehen verdeutlichen. Es soll eine Abfrage über die Tabelle "Tabelle_Nutzer" erstellt werden, die nur Name, Vorname und ICQ Nummer beinhaltet.
Erster Schritt: Leere Abfrage erstellen
- Im ersten Schritte wird mittels der Entwurfansicht eine Abfrage über die Tabelle erstellt.
- Es genügt an dieser Stelle, nur den Punkt „Erstellen einer neuen Abfrage in der Entwurfsansicht" auszuführen und im Dialogfenster „Tabelle anzeigen" die "Tabelle_Nutzer" zu wählen und in der Abfrage HINZFÜGEN zu betätigen. Anschließend wird das Dialogfenster mit dem SCHLIEßEN Schalter oder der ESC Taste geschlossen.
- Nun hat man eine „leere" Abfrage, die noch keine Anweisungen enthält, welche Datenfelder aus der „Tabelle_Nutzer" zu lesen sind.
Zweiter Schritt: leere Abfrage in der SQL-ANSICHT öffnen
- Im nächsten Schritt kann man die SQL-ANSICHT über ENTWURF / ANSICHT / SQL-ANSICHT öffnen (ALT, JQ, 5, Q).
- In der SQL-Ansicht ist Folgendes zu lesen: SELECT … FROM Tabelle_Nutzer;
Dritter Schritt: SQL-ABFRAGE erstellen und ausführen
Access hat bis hier nur festgelegt, welche Tabelle abgefragt werden soll. Alles andere wird nun in den Editor der SQL-Abfrage eingetragen. Nun wird die SQL-Syntax ergänzt, die wie folgt lautet:
SELECT * FROM Tabelle_Nutzer;
Nun wird die Abfrage mit der Tastenkombination STRG+S gespeichert. Das sich öffnende Dialogfeld „Speichern unter" verlangt nach einem Abfragenamen. Standardmäßig ist in das Formularfeld „Abfrage 1" eingetragen. In unserem Beispiel nennen wir diese „Abfrage_ICQ_Nummern".
Hinweis: Um die Übersicht zu verbessern, sollte man sich bei der Bezeichnung in Access angewöhnen, immer den Qbjekttyp mit anzugeben, z.B. bei Abfragen „Abfrage_xxx" bei Tabellen „Tabelle_yyy" usw. Dies vereinfacht das Wiederfinden und verhindert, dass Objekte falsch behandelt werden. In Berichten kann man z.B. keine Daten eintragen. Gerade beim Braillenutzer können solche Verwechslungen leicht vorkommen, da die Objekttypen nur per Symbol zu unterscheiden sind.
Nach dem die Abfrage benannt und gespeichert wurde, kann man sich das Ergebnis seiner ersten Abfrage anschauen:
- Der einfachste Weg ist über ENTURF und ANSICHT in die DATENBLATTANSICHT zu wechseln.
- Es ist aber durchaus auch interessant, in den Navigationsbereich zu wechseln und unter Abfragen nachzuschauen. Dort befindet sich nun die neue Abfrage „Abfrage_ICQ_Nummer".
Hat man nun die Abfrage geöffnet und betrachtet sich die Felder der Datensätze, erkennt man, dass es sich um das Abbild der Tabelle_Nutzer handelt. Alle Datensätze werden eins zu ein dort aufgeführt.
Um dem Wunsch zu folgen, nur den Vornamen, Namen und die ICQ-Nummer anzuzeigen, wird die SQL-Syntax wie folgt geändert (hierfür wechselt man wieder in die SQL-Ansicht):
SELECT Vorname, Nachname, [ICQ Nummer] FROM Tabelle_Nutzer;
Was hat sich nun geändert?
Das Sternchen aus der ersten Anweisung wurde gegen die gewünschten Feldnamen getauscht. Sternchen (*) wird als Platzhalter für alle Datenfelder benutzt.
In diesem Beispiel stecken schon eine ganze Menge Tücken. So muss man genau darauf achten, dass Lücken nach den Kommata stehen müssen und dass „ICQ Nummer" in eckige Klammern gesetzt werden muss. Auch müssen die Feldnamen exakt aus der Tabelle übernommen werden. Fehler in der Groß- und Kleinschreibung oder Lücken sind nicht zulässig.
Das Feld „ICQ Nummer" ist ein gutes Beispiel dafür, wie man ein Datenfeld nicht benennen sollte.
Das Leerzeichen zwischen ICQ und Nummer führt leicht zu Fehlern. Deshalb gilt der Grundsatz, Datenfelder immer ohne Lücke anzulegen oder diese mit Unterstrich (_) zu füllen.
Hätte der Autor in diesem Beispiel diesen Grundsatz befolgt, könnte er auf die eckigen Klammern in der Syntax verzichten. Die eckigen Klammern binden hier die beiden Wörtchen ICQ und Nummer zu einem Ausdruck zusammen. Lässt man sie trotzdem weg, werden die beiden Wörter als zwei Befehle interpretiert, was dann zu einem Fehler führt.
Zum Abschließen der Syntax ist noch das Semikolon nötig, welches auch nicht vergessen werden darf.
Fassen wir noch einmal zusammen: In diesem Beispiel wurde mit dem SELECT Befehl eine Abfrage über die Felder „Name, Vorname und ICQ Nummer" aus der Tabelle Tabelle_Nutzer gefertigt.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Aufbau der SQL-Syntax
SQL Befehle können zum Abfragen, Anlegen, Ändern und Löschen von Datenbanken, Tabellenstrukturen und Tabelleninhalten verwendet werden. Im diesem Abschnitt wird systematisch auf die Syntax zum Abfragen von Tabellenstrukturen eingegangen.
Prinzipiell ist eine SQL Abfrage immer nach dem gleichen Schema aufgebaut:
SELECT Spalten FROM Tabellen;
Bei den in Großbuchstaben geschriebenen Wörtern handelt es sich um die Befehle. Das normal geschriebene "Spalten" bedeutet, dass an diese Stelle die Namen der Spalten eingetragen werden. Tabellen bedeutet, dass an diese Stelle der Name der Tabelle steht. Es sind im übrigen auch mehrere Tabellen möglich, das bedeutet dann einen Abfrage über mehrere Tabellen. Später dazu mehr.
SELECT Abfrage
- SELECT bedeutet wählen oder abfragen.
- FROM steht für die Herkunft, also in welcher Tabelle abgefragt werden soll.
Beginnen wir nun eine Abfrage über die Tabelle „Tabelle_Medium" zu erstellen. Die SQL Syntax lautet dann:
SELECT * FROM Tabelle_Medium;
Als Ergebnis dieser Abfrage erhält man den gesamten Inhalt der Tabelle_Medium.
Das * (Sternchen) steht hier als Platzhalter für alle Datenfelder. Man könnte auch alle Datenfelder aufführen. Das würde dann so aussehen:
SELECT id_Medium, Titel, Interpret_Autor, Medium FROM Tabelle_Medium;
- Die einzelnen Datenfelder werden durch ein Komma getrennt, nach dem Komma muss ein Leerzeichen sein.
- Alle Feldnamen müssen exakt so geschrieben werden, wie sie in der Tabelle vorkommen. Die Groß- und Kleinschreibung darf nicht vernachlässigt werden.
- Für die bessere Lesbarkeit sollte man sich angewöhnen, die Befehle (hier SELECT und FROM) groß zu schreiben.
- Am Ende der SQL-Anweisung darf das SEMIKOLON nicht vergessen werden!
Oft möchte man nur einen Teil der Datenfelder als Auswahl haben. Hierfür zählt man nur die gewünschten Feldnamen auf. Für die Felder Titel und Medium sieht das dann so aus:
SELECT Titel, Medium FROM Tabelle_Medium;
Als Ergebnis der Abfrage erhält man eine Tabelle mit zwei Spalten:
Titel | Medium |
Harry Potter | Buch |
Harry Potter | DVD |
Die unendliche Geschichte | Buch |
Herr der Ringe | DVD |
Karlsson vom Dach | Buch |
Wird nun der Inhalt der Tabelle durch ein neues Buch ergänzt, erweitert sich die Abfrage beim nächsten Aufrufen um diese Tabelle. Der Vorteil liegt auf der Hand: Tabellenauszüge sind durch die Möglichkeit der Abfrage immer aktuell.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
WHERE Bedingung
WHERE Bedingungen dienen dazu, Abfragen weiter einschränken. In unserem Beispiel soll die Abfrage so einschränkt werden, dass alle DVD´s der Sammlung angezeigt werden. Dies lässt sich sehr leicht durch Anhängen des WHERE Befehls erledigen. Die WHERE Abfrage entspricht einem FILTER, wie im Kapitel Access: Filter beschrieben.
SELECT Titel, Medium FROM Tabelle_Medium WHERE Medium="DVD";
Das Ergebnis sieht dann so aus:
Titel | Medium |
Harry Potter | DVD |
Herr der Ringe | DVD |
(Siehe auch in der Datenbank: Abfrage_Meine Sammlung)
- Die WHERE Bedingung wird immer hinter den FROM Befehl gestellt.
- Anschließend folgt das Datenfeld, in dem nach bestimmten Kriterien (hier DVD) gesucht werden soll.
- Das Gleichheitszeichen macht eine direkte Zuweisung zum folgenden Ausdruck.
- Der Ausdruck wird dann entsprechend in Anführungszeichen "DVD" gesetzt. Die Anführungszeichen dürfen entfallen, wenn nach Zahlen gefiltert wird.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Operatoren, Platzhalter und Bedingungsausdrücke
Man kann anstatt des Gleichheitszeichens (=) auch LIKE benutzen. Dieser Zuweisungsbefehl ist immer dann vorzuziehen, wenn man nach Teilbegriffen im Datenfeld suchen will. In unserem Beispiel ist dies sehr sinnvoll, wenn man z.B. alle Titel mit dem Inhalt Fantasie abfragen möchte. Da aber im Feld Inhalt die englische und deutsche Schreibweise (Fantasy, Fantasie) benutzt wurde, möchte man nun beide erfassen, trotz unterschiedlicher Schreibweise. Hier bietet sich die LIKE Methode an, um nur nach dem gleichen Wortbestandteil „Fanta" zu suchen. Hinter „Fanta" folgt nun noch der Platzhalter *. Dies bedeutet, dass das Wort mit „Fanta" beginnt und beliebig enden darf.
SELECT Titel, Medium, Inhalt FROM Tabelle_Medium WHERE Inhalt LIKE "Fanta*";
- Der Platzhalter darf auch am Anfang der Buchstabenfolge stehen.
- Mit diese Methode lassen sich auch sehr gut alle Namen die mit B beginnen heraussuchen (LIKE „B*" usw.
- Mit > größer < kleiner lassen sich genauso leicht Abfragen erstellen. "PLZ>68549" bedeutet, dass alle mit der PLZ größer als 68549 herausgesucht werden.
Im Kapitel Access 2010: Operatoren, Platzhalter und Bedingungsausdrücke sind die Bedingungen bereits ausführlich erklärt worden. Diese gelten in der SQL Syntax genauso. Wer diese nicht mehr parat hat, dem sei das Kapitel noch einmal ans Herz gelegt.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Sortieren mit ORDER BY
Es ist auch möglich nach verschiedenen Bedingungen zu sortieren. In unserem Beispiel sollen die Titel nach dem Alphabet sortiert werden. Der Sortierbefehl lautet: ORDER BY, die entsprechende Syntax sieht dann so aus:
SELECT Titel, Medium, Inhalt FROM Tabelle_Medium ORDER BY Titel;
Natürlich gibt es auch die Möglichkeit, die Sortierrichtung anzugeben.
- ASC (ascending) steht für aufsteigend,
- DESC (descending) steht für absteigend.
Die Bestimmung der Sortierrichtung wird einfach hinter das zu sortierende Datenfeld geschrieben.
SELECT Titel, Medium, Inhalt FROM Tabelle_Medium ORDER BY Titel ASC;
oder
SELECT Titel, Medium, Inhalt FROM Tabelle_Medium ORDER BY Titel DESC;
Gibt man weder ASC noch DESC an, wird standardmäßig absteigend (also ASC) sortiert.
Generell gilt für die Sortierung, dass man mehrere Sortieroptionen angeben kann. Man kann zuerst nach dem Titel und danach nach dem Inhalt sortieren, usw.
SELECT Titel, Medium, Inhalt FROM Tabelle_Medium ORDER BY Titel DESC, Inhalt ASC;
Dabei ist zu beachten, bei der Abtrennung der Datenfelder das Komma nicht zu vergessen.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Gruppieren und Sortieren verbinden
Der einfache Aufbau der SQL-Syntax erlaubt Bedingungen und Sortieren einfach zu verbinden.
Man kann also mit WHERE eine Auswahl treffen und mit ORDER BY die Ergebnisse sortieren.
SELECT Titel, Medium FROM Tabelle_Medium WHERE Medium="DVD" ORDER BY Titel DESC;
Das Ergebnis sieht dann so aus:
Titel | Medium |
Momo | DVD |
Herr der Ringe | DVD |
Harry Potter | DVD |
Beim Aufstellen der Syntax muss man nur auf die Reihenfolge der Befehle achten. ODER BY kann niemals vor der WHERE Klausel kommen.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Gruppieren - GROUP BY
Man kann Datensätze nach einen oder mehreren Kriterien zusammenfassen. Dies kann man auch als Gruppieren bezeichnen. Alle DVD´s, alle Bücher, alle CD´s werden zusammengefasst dargestellt.
Das Gruppieren ermöglicht nun im Gegensatz zum Sortieren, dass man die Gruppen mit Aggregatsfunktionen verknüpfen kann. Aggregatsfunktionen dienen eigentlich dazu, dass man die Anzahl von Minimalwerten oder Maximalwerten einer Spalte ermittelt.
In unserem Beispiel soll ermittelt werden, wie viele Medien jeden Typs in der Datenbank gespeichert sind. Die SQL Klausel für das Gruppieren lautet: GROUP BY.
Zunächst sollen erst einmal alle Gruppen erfasst werden.
SELECT Medium FROM Tabelle_Medium GROUP BY Medium;
Medium |
Buch |
DVD |
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
COUNT ... GROUP BY
Das Abfrageergebnis sagt aus, dass es in der Tabelle nur DVD´s und Bücher gibt.
Nun wird die GROUP BY Klausel mit einer Aggregatsfunktion verknüpft. Mit dieser kann man die Anzahl der DVD´s und die der Bücher ermitteln.
SELECT Medium, COUNT(Medium) AS Anzahl FROM Tabelle_Medium GROUP BY Medium;
Die Syntax wird um "COUNT(Medium) AS Anzahl" erweitert. Die Aggregatsfunktion sagt aus, dass alle gleichen Medien gezählt werden und das Ergebnis in einer neuen Spalte mit dem Namen Anzahl angezeigt werden soll.
Die Klausel AS weist der Abfrage eine neue Spalte mit einem neuen Namen zu.
Medium | Anzahl |
Buch | 3 |
DVD | 3 |
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
COUNT ... MIN / MAX
Die gleiche Abfragestruktur lässt sich auch mit MIN oder MAX erstellen.
Hat man seine Datenbank so erweitert, dass in der Tabelle_Medium auch der Preis aufgeführt wird, so kann man sich mit MAX den teuersten Titel einer Gruppe heraussuchen lassen.
SELECT Medium, MAX(Preis) AS [teuerstes Medium] FROM Tabelle_Medium GROUP BY Medium;
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
AS (Namen zuweisen)
Mit der AS Klausel kann man einem Spaltennamen leicht einen beliebigen anderen Namen zuweisen.
In Datenbanken kommt es oft vor, dass die Feldnamen der Spalten einen kryptischen Kurznamen bekommen. Z.B. VorK diese Abkürzung steht für Vorname Kunde. Möchte man eine lesbare Abfrage der Tabelle haben, empfiehlt es sich, die Tabelle mit einem lesbaren Spaltennamen zu versehen. Dazu benutzt man die AS Klausel. Ein Beispiel verdeutlicht dies:
SELECT VorK AS [Vorname Kunde] FROM tabelle_kunde;
Medium | teuerstes Medium |
Buch | 33 |
DVD | 36 |
(Siehe auch in der Datenbank: Abfrage_Teuerste Bücher einer Gruppe)
Genauso kann man für das billigste Medium jeder Gruppe vorgehen.
Die GROUP BY Klausel ist, eine wichtige und starke Funktion für Abfragen von Datenbanken.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Berechnungen mit Abfragen ausführen
Es ist ein Leichtes, in Abfragen Berechnungen durchzuführen und als eigenständige Spalte darzustellen. In unserem Beispiel wollen wir die Preise der Bücher und DVD´s auch ohne MWSt anzeigen.
Zunächst erstellen wir eine Abfrage über Titel, Interpret_Autor, Medium und Preis.
SELECT Titel, Interpret_Autor, Medium, Preis FROM Tabelle_Medium;
Diese Abfrage ergänzen wir um die Berechnung des Preises ohne die in Deutschland üblichen 19% MWSt. Der Preis ohne MWSt berechet sich: Preis_ohne =PREIS *0,81
Zusammengesetzt sieht das dann so aus:
SELECT Titel, Interpret_Autor, Medium ,Preis, Preis*0.81 AS Preis_ohne_MWST FROM Tabelle_Medium;
Achtung! Bei der Eingabe der Kommazahl muss man unbedingt darauf achten, dass ein Punkt zur Abtrennung der Dezimalen verwendet wird. Access verwendet die amerikanische Dezimaltrennung!
Ergebnis:
Titel | Interpret_Autor | Medium | Preis | Preis_ohne_MWST |
Harry Potter | Rowling | Buch | 27 | 21,87 |
Harry Potter | Rowling | DVD | 19 | 15,39 |
Die unendliche Geschichte | Michael Ende | Buch | 33 | 26,73 |
Herr der Ringe | J.R.R. Tolkien | DVD | 36 | 29,16 |
Karlsson vom Dach | Astrid Lindgren | Buch | 12 | 9,72 |
Momo | Michael Ende | DVD | 18 | 14,58 |
(Siehe auch in der Datenbank_ Abfrage_Preise mit und ohne MWSt)
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
SELECT DISTINCT - Doppelte Datensätze vermeiden
In der Praxis kommt es immer mal wieder vor, dass Datensätze doppelt eingegeben werden. Diese lässt sich leicht durch SELECT DISTINCT vermeiden.
In unserem Beispiel ist das Buch Harry Potter zweimal eingegeben. SELECT DISTINCT schafft Abhilfe und zeigt es in der Abfrage nur noch einmal an:
SELECT DISTINCT Titel, Interpret_Autor, Medium FROM Tabelle_Medium;
(Siehe auch in der Datenbank_ Abfrage_Medium mit DISTINCT)
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Verknüpfungen mehrer Tabellen mit INNER JOIN, LEFT JOIN und RIGHT JOIN
Möchte man Inhalte aus mehreren Tabellen abfragen, kann man die Tabellen verknüpfen, also in Beziehung zueinander setzen.
Im Kapitel Beziehungen wurden die Grundlagen bereits beschrieben und sollten entsprechend dort nachgelesen werden.
Beim Erstellen von Beziehungen in Access Datenbanken kann es von Vorteil sein, die entsprechende SQL-Syntax zu kennen. So kann man schnell Fehler erkennen oder aufwendigere Abfragen erstellen, die nicht über die Entwurfansicht möglich sind.
Die entsprechenden Befehle für eine ...
- Eins-zu-eins-Beziehung lautet: INNER JOIN
- Eins-zu-viele-Beziehung lautet: LEFT JOIN
- Viele-zu-eins-Beziehung lautet: RIGHT JOIN
- Viele-zu-viele-Beziehung lautet: OUTER JOIN
In unserer Beispieldatenbank sollen für jeden Nutzer die ausgeliehenen Medien (Bücher, DVD, etc.) abgefragt werden.
Dazu müssen die Tabellen Nutzer, Medien und Ausleihe verknüpft werden. Eine Tabellenverknüpfung muss immer über einen Schlüssel erfolgen, der in beiden Tabellen enthalten ist. Zudem muss er eindeutig sein. Hierfür bieten sich ID´s, Personalnummern oder eindeutige Namen an. In unserem Beispiel bietet sich die id_Ausleihe und die id_Titel an. Beide sind in der Tabelle Ausleihe verzeichnet. Genau genommen werden an die Tabelle Ausleihe zwei Tabellen angeknüpft. Die Tabelle Nutzer und die Tabelle Medium.
Da ein Nutzer mehrere Titel ausleihen kann, muss man sich bei der Verknüpfung einer "Eins-zu-viele-Beziehung", also einer LEFT JOIN Beziehung, bedienen.
Damit es gleich zu Anfang nicht so komplex wird, soll zuerst einmal die Tabelle Ausleihe mit der Tabelle Titel verknüpft werden. Als Ergebnis erhält man dann eine Abfrage (Liste), in der verzeichnet ist, wann welches Buch ausgeliehen wurde.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
LEFT JOIN
Zwischen der Tabelle Ausleihe und der Tabelle Titel gibt es eine "Ein-zu-viele-Beziehung", da es zu jedem Ausleihdatum ein Buch gibt, aber nicht alle Titel zwangsläufig ausgeliehen sein müssen.
Die SQL Abfrage lautet:
SELECT Tabelle_Medium.Titel, Tabelle_Medium.Interpret_Autor, [Tabelle_Ausleihe.ausgeliehen am] FROM Tabelle_Ausleihe LEFT JOIN Tabelle_Medium ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium;
Analisiert man die Abfrage, so lässt sich folgende Grundstruktur ausmachen:
SELECT (Tabellentitel) FROM (linke Tabelle) LEFT JOIN (rechte Tabelle) ON (linke Tabellenverknüpfung) = (rechte Tabellenverknüpfung)
Neu in dieser Abfrage ist, dass sich die Titelnamen auf verschiedene Tabellen beziehen. Deshalb muss man nun die Tabellennamen mit Punkt (.) abgetrennt vor den Titelnamen setzen:
Tabellennamen.Titelnamen
z.B. Tabelle_Ausleihe.id_Titel
In dieser Abfrage hat sich noch ein kleiner Stolperstein eingeschlichen. Im Titel "ausgeliehen am" befindet sich ein Leerzeichen. Titel mit Leerzeichen müssen in eckige Klammern gesetzt werden, da sonst Access mit dem Leerzeichen das Ende des Titelnamens annimmt. Richtig muss es folgendermaßen aussehen:
[Tabelle_Ausleihe.ausgeliehen am]
Zur Erinnerung: Gute Datenbanken vermeiden Lücken in Titel. Daher hat es sich eingebürgert, dass man Lücken mit den Unterstrich (_) ausfüllt.
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Abfragen über mehrere Tabellen
Abfragen über mehrere Tabellen muss man genau planen, dann ist das Aufstellen der SQL-Anweisung nur noch Fleißarbeit.
Die Tabelle_Ausleihe hat Beziehungen zu beiden anderen Tabellen über die id_Medium und die id_Nutzer. Um die Bindung zu beiden anderen Tabellen herstellen zu können, muss die Tabelle_Ausleihe in der SQL-Anweisung zwischen den beiden anderen Tabellen stehen.
Das bedeutet, dass die oben benutze Anweisung umgeschrieben werden muss. Die Tabellen werden in der Reihenfolge getauscht, demnach wird auch LEFT JOIN in RIGHT JOIN getauscht.
SELECT Tabelle_Medium.Titel, Tabelle_Medium.Interpret_Autor, [Tabelle_Ausleihe.ausgeliehen am] FROM Tabelle_Medium RIGHT JOIN Tabelle_Ausleihe ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium;
Im Ergebnis ändert sich zunächst nichts.
Die zweite Bindung lautet:
Tabelle_Ausleihe LEFT JOIN Tabelle_Nutzer ON Tabelle_Ausleihe.id_Nutzer=Tabelle_Nutzer.id_Nutzer
Diese wird in Klammern gesetzt und ersetzt die Bindung "Tabelle_Ausleihe".
SELECT Tabelle_Medium.Titel, Tabelle_Medium.Interpret_Autor, [Tabelle_Ausleihe.ausgeliehen am] FROM Tabelle_Medium RIGHT JOIN (Tabelle_Ausleihe LEFT JOIN Tabelle_Nutzer ON Tabelle_Ausleihe.id_Nutzer=Tabelle_Nutzer.id_Nutzer) ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium;
Nun ist die Bindung zwischen den drei Tabellen fertig. Nach der SELECT Anweisung wird noch der Name des Ausleihers eingetragen (Tabelle_Nutzer.Vorname, Tabelle_Nutzer.Name).
SELECT Tabelle_Nutzer.Vorname, Tabelle_Nutzer.Nachname, Tabelle_Medium.Titel, Tabelle_Medium.Interpret_Autor, [Tabelle_Ausleihe.ausgeliehen am] FROM Tabelle_Medium RIGHT JOIN (Tabelle_Ausleihe LEFT JOIN Tabelle_Nutzer ON Tabelle_Ausleihe.id_Nutzer=Tabelle_Nutzer.id_Nutzer) ON Tabelle_Ausleihe.id_Titel = Tabelle_Medium.id_medium;
Media:CD_Verwaltung.accdb Beispieldatei CD_Verwaltung.accdb
Weiterführende Online-Tutorials
Nutzer, die sich weiterführend mit SQL auseinandersetzen wollen, sei eines der hier aufgeführten Online-Tutorials empfohlen.
- www.sql-und-xml.de
- SQL-Grundlagen - gute Einführung mit Beispielen
- SQL Wiki-Book