Datenbank
SQL
2 Abfragen von Daten

Dieses Kapitel beschäftigt sich mit dem reinen Lesen von Datren aus einer Datenbank über die SQL Sprache.

 

Ich unterscheide bei der Definition zwischen Data Query Language (DQL), die sich mit der Abfrage von Daten beschäftigt (vgl select) und der Data Manipulation Language (DML), die sich mit der Manipulation von Daten beschäftigt (vgl. insert/update/delete).

 


2.1 Einführung

Eine der Hauptaufgaben von Datenbanken ist das zur Verfügung stellen der gespeicherten Informationen. Der Anwender hat mit der Abfragesprache SQL ein mächtiges Werkzeug, mit dem er die Daten aus relationalen Datenbanken abfragen kann.

 

Grundvoraussetzung ist jedoch, das der Anwender die gespeicherten Daten kennt. Das heißt, das der Anwender – bevor er eine Abfrage stellt – sich mit den Strukturen in der Datenbank auseinandersetzt. Er muß mindestens die Tabellen und die Schlüssel (Primär- als auch Fremdschlüssel) kennen.

 

Für das Abfragen von Informationen aus relationalen Datenbanken stellt SQL den Befehl SELECT zur Verfügung. Dieses Kapitel beschreibt die vielfältigen Einsatzmöglichkeiten dieses komplexen Befehls.

 

Der Befehl SELECT generiert aus den gespeicherten Daten und den Kriterien des Befehls eine Ergebnismenge, die dann am Bildschirm sichtbar gemacht wird. Man kann sich die Ergebnismenge so vorstellen, als ob der SELECT Befehl eine temporäre Tabelle erzeugt und diese dem Anwender präsentiert. Diese Vorstellung ist wichtig für das Verständnis einiger Aspekte, die wir weiter unten ansprechen werden.

 


2.2 Einfache Abfragen

Unter einen einfachen Abfrage versteht man das Auslesen von Rohdaten aus einer einzigen Tabelle. Man fragt also nur die Attribute aller Entitäten einer Relation ab.

 

Hierzu benutzt man den SQL Befehl SELECT, dem man die abzufragenden Spalten und den Tabellennamen mitgibt.

Die Syntax hierzu lautet

 

SELECT Spalte [, Spalte]{0..*} FROM Tabelle

 

SQL unterscheidet nicht zwischen Groß- und Kleinschreibung. Somit ist es egal, ob man die Schlüsselwörter ganz in Großbuchstaben, ganz in Kleinbuchstaben oder gemischt schreibt.

 

Genauso ist es nicht notwendig, den Befehl in eine einzige Zeile zu schreiben. Da es dem SQL Interpreter egal ist, in welcher Form die befehle formuliert sind, sollte man sich angewöhnen, eine Formatierung zu verwenden. Dies hilft dem besseren Verständnis des Befehls und der Lesbarkeit enorm.

 

Beispiel: Lesen der Kundendaten

SELECT

  Nummer,

  Name,

  Vorname,

  Jahre

FROM

  Kunde

 


2.2.1 Spaltenaliase

Es ist in SQL möglich, den Originalspaltennamen einen anderen Namen zu geben, den Alias. Den Aliasnamen schreibt man hinter den eigentlichen Spaltennamen. Sinnvoll wird dies, wenn die Spaltendaten vor der Ausgabe weiterverarbeitet werden.

 

Syntaktisch kann die Spaltenangabe somit so erfolgen

 

Spalte = Name [ [ As ] Aliasname ]

 

Beispiel: Umbenennen der Spaltennamen für Kundendaten

SELECT

  Nummer  As Nummer,

  Name  As Name,

  Vorname  As Vorname,

  Jahre  As ‘Alter‘

FROM

  Kunde

 


2.2.2 Ändern von Spaltendaten beim Lesen

Der Inhalt der Spalten der Ergebnismenge kann direkt durch die Abfrage geändert werden, ohne der Originalinhalt ändern zu müssen. Hierbei wird die Spalte z.B. mit einem arithmetischen Ausdruck verknüpft. Man macht sich den Umstand zu Nutze, das die Ergebnismenge fast unabhängig von den Originaldaten ist.

 

Beispiel: Kundenalter in fünf Jahren

SELECT

  Nummer  As Nummer,

  Name  As Name,

  Vorname  As Vorname,

  Jahre + 5 As Alter_In_5_Jahren

FROM

  Kunde

 


2.3 Einschränkung der Ergebnismenge

Um nicht alle Datensätze einer Tabelle als Ergebnis zu erhalten, kann man diese Menge durch eine Klausel einschränken.

 


2.3.1 Die Where Klausel

Mit Hilfe der WHERE Klausel kann die Ergebnismenge eingeschränkt werden.

 

Dieser Klausel gibt man eine Bedingung an, der die Ergebnismenge genügen muß. Diese Bedingung besteht normalerweise aus einzelnen Termen, die mit logischen Operatoren verknüpft sind.

 

SELECT Spalten(n) FROM Tabelle WHERE Bedingung

 

Ein Term dieser Bedingung ist aufgebaut „A Operator B“, wobei A und B Spalten, Literale oder wiederum Bedingungen sein können. Als Operatoren kommen die Basisvergleichsoperatoren Gleich (=), Ungleich (<>), Größer (>) und Kleiner (<) oder deren Kombination in Frage. Weitere Operatoren werden an geeigneter Stelle vorgestellt.

 

Beispiel: Abfragen bestimmter Kunden

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

  Name = ’Schmitt’

 

Die Bedingungsterme werden i.d.R. durch die logischen Operatoren AND, OR oder NOT miteinander verknüpft. Somit können mehrere Einschränkungen der Ergebnismenge parallel erfolgen.

 

Stringliterale werden dabei in einfache Hochkommata gesetzt und sind Case-Sensitiv. Zahlen werden direkt angegeben, man sollte jedoch das Format beachten. Formate der Datumsangaben sind von Datenbank zu Datenbank verschieden

 

Beispiel: Abfragen bestimmter Kunden (2)

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

        Name = ’Schmitt’

  AND Vorname = ’Friedhelm’

 


2.3.2 Der In Operator

Der IN Operator ist eine weitere Schreibweise eines speziellen OR Operators.

 

Bei diesem  Operator beziehen sich die Terme auf eine Spalte. Anstelle mehrerer, mit OR verknüpfter Terme zu formulieren, kann man einen einzigen Term mit dem In Operator formulieren.

 

Beispiel: Suche von Kunden in best. Städten

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

      Ort = ’Bad Dürkheim’

  OR Ort = ’Freinsheim’

 

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

  Ort IN (’Bad Dürkheim’, ’Freinsheim’)

 

Analog dazu können auch numerisch Werte in der IN Liste aufgezählt werden oder Datumsangaben verwendet werden.

 


2.3.3 Der Between Operator

Möchte man eine Einschränkung auf einen Bereich beziehen, so kann dies elegant mit dem BETWEEN Operator erfolgen.

 

Anstelle zweier – mit AND verknüpfter – Terme kann man einen Ausdruck mit BETWEEN formulieren.

 

Beispiel: Kunden zwischen 20 und 30 Jahren

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

       Jahre >= 20

  AND Jahre <= 30

 

SELECT

  Name,

  Vorname

FROM

  Kunde

WHERE

  Jahre BETWEEN 20 AND 30

 


2.4 Skalarfunktionen

Skalarfunktionen sind echte Funktionen im mathematischen Sinne, d.h. sie liefern zu einem Argument ein eindeutiges Ergebnis.

 

Das Argument ist ein Einzelwert (Skalar), und nicht wie bei den Aggregatfunktionen (Kapitel 2.5) eine Zusammenfassung mehrerer Spaltenwerte.

 

Allgemein angewendet werden diese Skalarfunktionen wie folgt

 

Ergebnis = Skalarfunktion ( Argument )

 

wobei das Ergebnis wiederum Argument einer weiteren Skalarfunktion sein kann.

 


2.4.1 Numerische Skalarfunktionen

...

ABS(), LN(), MOD(), POWER(), SIGN(), SQRT()

...

 


2.4.2 Zeichenketten Skalarfunktionen

...

UPPER(), LOWER(), MID() / SUBSTR(), INSTR(), LENGTH()

...

 


2.5 Aggregatfunktionen

Häufig kommt es vor, das bestimmte Datensätze nicht einzeln ausgewertet werden sollen, sondern erst zusammengefaßt werden müssen und daraus das Ergebnis ermittelt wird. Als Beispiel stelle man sich eine Umsatzliste pro Kunde vor, bei dem die Einzelaufträge des Kunden zuerst zusammengerechnet werden, bevor das Ergebnis ermittelt wird.

 

Für diese Anforderung hat man Aggregatfunktionen (Gruppierungsfunktionen) zur Verfügung, die einem diese Arbeit elegant lösen lassen.

 

Man beachte, das die Aggregatfunktionen Werte liefern, die aus mehreren Zeilen einer Spalte zusammengefaßt sind, d.h. diese Zeilen sind dann gruppiert worden.

 

Zum Zusammenfassen von bestimmten Zeilen wird die GROUP BY Klausel verwendet. Hierbei wird angegeben, das die Zeilen mit gleichem Inhalt zusammengefaßt werden sollen.

 

Wichtig bei dieser Klausel ist, das die angegebenen Spalten komplett sein müssen. Man kann keine Zeilen Zusammenfassen, in denen andere Spalten noch unterschiedliche Werte besitzen.

 

Wird keine GROUP BY Klausel angegeben, so beziehen sich die Aggregatfunktionen auf die gesamte Tabelle, d.h. die Ergebnismenge besteht aus einer Zeile mit dem gruppierten Wert für die ganze Tabelle.

 


2.5.1 Die Count Funktion

Die COUNT Funktion liefert die Anzahl der Zeilen der Gruppierung zurück.

 

Wird keine Gruppierung angegeben, so bezieht sich COUNT auf die komplette Quellmenge, die ja dann eine einzige Gruppe darstellt.

 

Selbstverständlich kann die Ergebnismenge eingeschränkt werden und keine  Gruppierung angegeben werden. Damit erhält man die Anzahl der Datensätze, die dieser Einschränkung genügen.

 

Bsp.: Anzahl der Kunden, die 29 Jahre alt sind

select

  COUNT(*)

from

  Kunde

where

  Alter = 29

 


2.5.2 Die Sum Funktion

Mit der SUM Funktion wird die Summe der gruppierten Werte einer Spalte berechnet.

 

Bsp.: Die Gesamtsumme eines Auftrages

select

  SUM(Betrag)

From

  Auftrag_Artikel

Where

  Auftrag_Nummer = 1

 


2.5.3 Die Min/Max Funktion

Den kleinsten und den größten Wert einer gruppierten Spalte wird über die beiden Funktionen MIN und MAX bestimmt.

 

Bsp.: Der jüngste und der älteste Kunde

select

  MIN(Alter),

  MAX(Alter)

From

  Kunde

 


2.5.4 Die Avg Funktion

Um den Durchschnittswert der zusammengefaßten Werte zu berechnen, wird die AVG (Average) Funktion eingesetzt.

 

Bsp.: Durchschnittsalter der Kunden

select

  AVG(Alter)

From

  Kunde

 


2.5.5 Spalten mit und ohne Gruppierungsfunktion abfragen

Werden Gruppierungsfunktionen mit anderen Spalten ohne eine solche Gruppierungsfunktion abgefragt, so muß ein Gruppierungskriterium angegeben werden, sonst kann die Gruppierungsfunktion nicht korrekt arbeiten.

 

Es ist nicht möglich, Zeilen zusammenfassen, in denen Spalten existieren, die noch unterschiedliche Werte haben. Darauf muß man beim Erstellen einer solchen Abfrage achten.

 

Bsp.: Auftragsnummer und –betrag aller Aufträge

select

  Auftrag_Nummer,

  SUM(Betrag)

from

  Auftrag_Artikel

GROUP BY

  Auftrag_Nummer

 


2.6 Sortierung

Bisher wurden die Ergebniszeilen ohne eine erkennbare Sortierung geliefert. Oft ist es aber sinnvoll, ein Sortierkriterium auf die Daten anzuwenden, damit z.B. der Auftrag mit dem größten Umsatz an erster Stelle erscheint.

 

Hierzu wird in SQL die ORDER BY Klausel verwendet. Ihr werden die Spalten angegeben, nach denen sortiert wird. Werden mehr als eine Spalte angegeben, so wir die Sortierung in der Reihenfolge erfolgen, in der die Spalten angegeben wurde.

 

Zuerst wird nach der zuerst angegebenen Spalte sortiert. Bei Gleichheit werden die Daten nach der zweiten Spalte sortiert. Dies wird so weit fortgeführt, bis alle Sortierspalten berücksichtigt wurden, anschließend ist die Sortierung wieder nicht bestimmbar.

 

Es ist nicht notwendig, das die Sortierspalten in der SELECT Liste enthalten sein müssen.

 

Bsp.: Kundenliste mit Altersangabe alphabetisch sortiert

select

  Name,

  Vorname,

  Alter

From

  Kunde

Order by

  Name,

  Vorname

 


2.7 Gruppierungsfunktionen in Where Klauseln

Es ist nicht möglich, Gruppierungsfunktionen in einer WHERE Klausel einzusetzen.

 

In einer WHERE Klausel werden die Vergleiche zeilenweise ausgeführt. Gruppierungsfunktionen fassen aber die Zeilen zuerst zusammen und können damit nicht in Verbindung mit einer WHERE Klausel benutzt werden.

 

Dazu nutzt man die HAVING Klausel, die dieses Manko umgeht. HAVING wird auf die gruppierten Daten angewendet, d.h. die Gruppierung wird zuerst durchgeführt.

 

Bsp.: Kundenliste, die jünger sind als das Durchschnittsalter

select

  Name,

  Vorname

from

  Kunde

where

  Alter < AVG(Alter) SO NICHT !!

 

 

select

  Name,

  Vorname

from

  Kunde

having

  Alter < AVG(Alter)

 


2.8 Kombination verschiedener Klauseln

Die angesprochenen Klauseln lassen sich natürlich beliebig kombinieren. Man kann die Einschränkung mit der Gruppierung und der Sortierung benutzen.

 

Bsp.: Sortierte Auftragsliste, die bestimmten Kriterien genügen

select

  SUM(Betrag),

  Auftrag_Nummer

from

  Auftrag_Artikel

where

  Auftrag_Nummer IN (1,3,5,7,9)

having

  SUM(Betrag) > 100

order by

  Auftrag_Nummer

 

Beachte, das die Verwendung einer WHERE Klausel die Daten, die zum Gruppieren herangezogen werden, beeinflußt, da die WHERE Klausel auf der Quelldatenmenge arbeitet.

 


2.9 Access Ergänzung

In ACCESS hat man die Möglichkeit, eigene VBA Funktionen zu schreiben.

 

Diese Funktionen können dann in einem SELECT Befehl wie Skalarfunktionen verwendet werden. Desweiteren können integrierte VBA Funktionen verwendet werden.

 

Beispielsweise könnte man sich seine eigene UPPERCASE Funktion schreiben.

In einem Modul:

Public Function Uppercase(strText as String) As String

    Uppercase = UCase(strText)

End Function

 

Die Abfrage:

select

  Uppercase (kd.Name),

  Uppercase (kd.Vorname)

from

  Kunde kd

where

  kd.Nummer = 1

 

Beachte, das ACCESS hier die alle zu Grunde liegenden Daten anpacken muß, um das Ergebnis zu liefern. Bei jeder einzelnen Zeile wird der Ausdruck Uppercase() angewendet und dann erst diese Daten in die Ergebnismenge aufgenommen.

 

Das heißt auch, das eine Abfrage mit einer WHERE Klausel keinen Index benutzen kann, um die Ergebnismenge schnell auffinden zu können, da zuerst die Funktion auf alle Zeilen der Tabelle angewendet wird und anschließend erst die WHERE Klausel ausgewertet wird.

 



Last update:  12.07.2005