SQL-Abfragen erstellen
Um Listen per SQL zu erstellen, beschäftigen Sie sich bitte auch mit der Datenstruktur der Datenbank.
Anlegen einer Tabelle mit SQL-Statement
Legen Sie als erstes im Reporter eine neue Tabelle an. Dazu gehen Sie auf "Datei" und "Neu" und wählen hier dann "Tabelle" aus.
Hier klicken Sie dann auf den Schalter .
Hier wählen Sie dann und können im Feld darunter das gewünschte SQL-Statement eintragen.
Gehen Sie nun auf den Schalter , um festzulegen, welche Felder aus Ihrem SQL-Statement in der Liste angezeigt werden sollen.
Einfache Abfrage mit SELECT und FROM
Um Tabelleninhalte einer relationalen Datenbank zu lesen, verwendet man den SELECT Befehl. Dieser besteht aus mehreren, in ihrer Reihenfolge festgelegten Teilen, auch Klauseln genannt. Jede Klausel beginnt mit einem Schlüsselwort.
Im einfachsten Fall besteht der SELECT Befehl aus einer SELECT- und einer FROM-Klausel sowie dem abschließenden
;
(Semikolon):
SELECT *
FROM COMPersonen;
Dieser SQL-Code erstellt eine Abfrage aller Felder aus Tabelle COMPersonen.
Einfache Abfrage mit SELECT und FROM mit ausgewählten Feldern
In der Regel werden nicht alle Felder einer Tabelle benötigt und man möchte eine Auswahl an Feldern treffen:
SELECT Name, Vorname
FROM COMPersonen;
Dieser SQL-Code erstellt eine Abfrage der Felder Name und Vorname aus der Tabelle COMPersonen.
Eine Abfrage sortieren
Mit dem Befehl ORDER BY lässt sich eine Sortierung festlegen. Im folgenden Beispiel sortieren wir nach Name und Vorname aufsteigend.
SELECT Name, Vorname
FROM COMPersonen
ORDER BY Name, Vorname;
Mit dem Befehl ORDER BY kann auch absteigend sortiert werden, wenn man den Befehl DESC hinter das Feld setzt, das absteigend sortiert werden soll. Im folgenden Beispiel sortieren wir nach Name aufsteigend und nach Vorname absteigend.
SELECT Name, Vorname
FROM COMPersonen
ORDER BY Name, Vorname DESC;
Spalten umbenennen mit Alias
Mit einem sogenannten Alias über den Befehl AS kann man z.B. den Spaltennamen in der Liste festlegen:
SELECT Name AS Nachname, Vorname
FROM COMPersonen;
Dieser SQL-Code erstellt eine Abfrage der Felder Name und Vorname aus der Tabelle COMPersonen, wo das Feld "Name" als Spalte "Nachname" angezeigt wird.
WHERE - Abfrage mit Filter (Bedingungen)
Wenn man Daten in einer SQL-Abfrage filtern möchte, funktioniert das mit dem Erstellen einer Bedingung über den Befehl WHERE. Dazu gibt es verschiedene Operatoren zum Vergleichen von Werten, die in den folgenden Beispielen erklärt werden.
Was soll gemacht werden?
|
Beispiel-Code
|
Nur Datensätze anzeigen, wo der Ort "Jena" ist.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort = "Jena";
|
Nur Datensätze anzeigen, wo der Ort anders "Jena" ist.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort <> "Jena";
|
Nur Datensätze anzeigen, wo der Ort mit "Ap" beginnt.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort LIKE "Ap*";
|
Nur Datensätze anzeigen, wo der Ort "ol" enthällt.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort LIKE "*ol*";
|
Nur Datensätze anzeigen, wo der Ort nicht "ol" enthällt.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort NOT LIKE "*ol*";
|
Nur Datensätze anzeigen, wo der Ort auf "na" endet.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort LIKE "*na";
|
Nur Datensätze anzeigen, wo der Ort leer ist.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort IS NULL;
|
Nur Datensätze anzeigen, wo der Ort nicht leer ist.
|
SELECT Name, Vorname, Ort
FROM COMPersonen
WHERE Ort IS NOT NULL;
|
Nur Datensätze anzeigen, wo das Geburtsdatum "25.02.1990" ist.
|
SELECT Name, Vorname
FROM COMPersonen
WHERE Geburtsdatum = #02/25/1990#;
|
Nur Datensätze anzeigen, die im Jahr 1990 geboren wurden.
|
SELECT Name, Vorname
FROM COMPersonen
WHERE Geburtsdatum LIKE "*1990";
|
Nur Datensätze anzeigen, die vor dem 01.01.1990 geboren wurden.
|
SELECT Name, Vorname, Geburtsdatum
FROM COMPersonen
WHERE Geburtsdatum < #1/1/1990#;
|
Nur Datensätze anzeigen, die nach dem 31.12.1989 geboren wurden.
|
SELECT Name, Vorname, Geburtsdatum
FROM COMPersonen
WHERE Geburtsdatum > #12/31/1989#;
|
Mehrere Bedingungen Verknüpfen
Verknüpfung mit logischem AND (Und)
Wenn man mehrere Bedingungen hat, die alle erfüllt sein sollen, damit ein Datensatz angezeigt wird, nutzt man AND, um diese zu verbinden.
AND - die ausgewählten Bedingungen müssen beide zutreffen, nur dann wird der Eintrag mit in die Liste übernommen
Logiktabelle (Wahrheitstabelle):
Bedingung1
|
Bedingung2
|
Ergebnis
|
Nein
|
Nein
|
Nein
|
Ja
|
Nein
|
Nein
|
Nein
|
Ja
|
Nein
|
Ja
|
Ja
|
Ja
|
Beispiel:
SELECT Vorname, Name
FROM COMPersonen
WHERE Geburtsdatum > #12/31/1989# AND Ort="Jena";
Diese Abfrage zeigt Personen an, die die nach dem 31.12.1989 geboren wurden und im Ort Jena wohnen.
Verknüpfung mit logischem OR (Oder)
Wenn man mehrere Bedingungen hat, von denen mindestens eine erfüllt sein soll, nutzt man OR, um diese zu verbinden.
OR – die ausgewählten Bedingungen können beide zutreffen. Das bedeutet, wenn eine oder beide Bedingungen zutreffen, wird der Eintrag mit in die Liste übernommen.
Logiktabelle (Wahrheitstabelle):
Bedingung1
|
Bedingung2
|
Ergebnis
|
Nein
|
Nein
|
Nein
|
Ja
|
Nein
|
Ja
|
Nein
|
Ja
|
Ja
|
Ja
|
Ja
|
Ja
|
Beispiel:
SELECT Vorname, Name
FROM COMPersonen
WHERE PLZ="07745" OR Ort="Jena";
Diese Abfrage zeigt Personen an, die die PLZ-Bereich 07745 oder im Ort Jena wohnen.
Abfrage mit verknüpften Tabellen
Zu der Haupttabelle COMPersonen, die die Personen enthält, gibt es noch Untertabellen, die mit dieser in Beziehung. Als Beispiel nehmen wir hier die Untertabelle COMPStatus, die die Mitgliedsarten aus dem Reiter Status / Funktionen enthält.
Tabellen können mit einem z.B mit einem INNER JOIN und ON verbunden werden:
SELECT Vorname, Name, [Status (Nr)], Von, Bis
FROM COMPStatus INNER JOIN COMPersonen ON COMPStatus.[Person (Nr)] = COMPersonen.Nummer;
Da auf dem Feld [Status (Nr)] die Mitgliedsart nur als Zahl erscheint, hängen wir nun noch die passende Voreinstellungstabelle COMStatus mit an, damit wir die Mitgliedsart im Klartext erscheint:
SELECT Vorname, Name, Status, Von, Bis
FROM (COMStatus INNER JOIN COMPStatus ON COMStatus.Nummer = COMPStatus.[Status (Nr)]) INNER JOIN COMPersonen ON COMPStatus.[Person (Nr)] = COMPersonen.Nummer;
Kombinieren von verschiedenen Methoden
Die genannten Abfrage-Möglichkeiten lassen sich natürlich auch kombinieren, um eine Abfrage ganz nach ihren Wünschen zu erzeugen.
Im folgenden kurzen Beispiel erstellen wir eine Liste der Personen mit Ihren E-Mail-Adressen der Anschlussart "privat E-Mail" (Nr. 9) aufsteigend nach Name und absteigend nach Vorname.
Dazu benötigen Sie die folgenden Tabellen:
COMPersonen
|
Enthält die Personendaten
|
COMPTelefone
|
Enthält die Telefondaten der Personen
|
Das SQL-Statement für dieses Beispiel lautet:
SELECT Name, Vorname, Telefon AS EMail
FROM COMPersonen INNER JOIN COMPTelefone ON COMPersonen.Nummer = COMPTelefone.[Person (Nr)]
WHERE Telefon LIKE "*@*" AND [Anschluss (Nr)] = 9
ORDER BY Name, Vorname DESC;
Erstellen einer Pivottabelle (Kreuztabelle)
Eine Pivottabelle bietet sich an, wenn man Daten aus Untertabellen übersichtlich aufarbeiten möchte. Hier hat man die Möglichkeit z.B. die Anschlussarten der Kommunikationsdaten als Überschrift zu verwenden und darunter dann die jeweiligen Kommunikationsdaten zu erhalten. Dadurch kann man Datensätze, die mehrere Eintragungen in einer Untertabelle haben, in einer Zeile darstellen, statt mehrere Zeilen zu erhalten.
Vergleich:
Normale Tabelle:
Pivottabelle:
Eine Pivottabelle benötigt mindestens eine Zeilenüberschrift, eine Spaltenüberschrift und einen Wert, die wie folgt festgelegt werden.
Art
|
Befehl
|
Zeilenüberschrift
|
SELECT mit GROUP BY
|
Spaltenüberschrift
|
PIVOT
|
Wert
|
TRANSFORM mit AS
|
Das SQL-Statement für die oben gezeigte Pivottabelle lautet:
TRANSFORM First(Telefon) AS Kommunikation
SELECT Name, Vorname
FROM COMAnschlüsse INNER JOIN (COMPersonen INNER JOIN COMPTelefone ON COMPersonen.Nummer = COMPTelefone.[Person (Nr)]) ON COMAnschlüsse.Nummer = COMPTelefone.[Anschluss (Nr)]
GROUP BY Name, Vorname
PIVOT Anschluss;
In diesem Beispiel werden die Felder Name und Vorname aus COMPersonen als Zeilenüberschriften, Anschluss aus COMAnschlüsse als Spaltenüberschrift und Telefon unter dem Alias Kommunikation aus COMPTelefone als Wert verwendet.
Erstellen einer Formel
In SQL lassen sich natürlich auch Formeln zur Berechnung verwenden. Im folgenden Beispiel wird das aktuelle Alter aus dem Datum berechnet:
SELECT Vorname, Name, Geburtsdatum, DateDiff("yyyy",[Geburtsdatum],Date())+(Format(Date(),"mmdd")<Format([Geburtsdatum],"mmdd")) AS [Alter]
FROM COMPersonen;
Man gibt die Formel dementsprechend im SELECT-Teil mit als Feld ein und benennt es mit der Alias-Funktion AS nach eigenem Belieben.
Eingaben in einer SQL-Abfrage
Es können über PARAMETERS auch Eingaben über eine SQL-Abfrage eingebaut werden, um eine Abfrage flexibler zu gestalten und nicht immer wieder die WHERE-Klausel anpassen zu müssen, wenn man einen anderen Wert abfragen möchte.
Code: PARAMETERS [Variable] Datentyp;
Mehrere Parameter werden mit einem Komma getrennt hintereinander gesetzt.
Code: PARAMETERS [Variable1] Datentyp, [Variable2] Datentyp;
Folgende Datentypen sind möglich:
Datentypen
|
Beschreibung
|
Int
|
Ganze Zahlen ohne Nachkommastellen Bsp.: 10
|
Double
|
Zahlen mit Nachkommastellen Bsp.: 5.2
|
String
|
Text Bsp.: Jena
|
DateTime
|
Datum Bsp.: 29.05.1986
|
Im folgenden Beispiel soll beim Aufruf der SQL-Abfrage die PLZ eingegeben werden.
PARAMETERS Eingabe string;
SELECT Vorname, Name, PLZ
FROM COMPersonen
WHERE COMPersonen.PLZ=[Eingabe];
ACHTUNG: Diese Parameter müssen im Reporter auch als Eingabe angelegt werden, da es sonst zu folgender Fehlermeldung kommt:
Zum Erstellen der Eingabe klicken Sie bitte auf den Schalter .
In der Maske Abfragebedingungen klicken Sie dann auf den Schalter .
Hier tragen Sie dann die Eingaben ein für unser Beispiel als Frage "PLZ?" und als Typ "Text". Bestätigen Sie die Einstellungen mit .
Beim Ausführen der Abfrage im Reporter erfolgt nun die folgende Abfrage: