Einführung in SQL

Werbung
Einführung in SQL
Jörn Lenhardt, Dipl. Ing. (FH)
1
EINFÜHRUNG .................................................................................................... 4
1.1
Historie .................................................................................................................................................... 4
1.2
Datenbanken ........................................................................................................................................... 4
1.3
Das relationale Modell ............................................................................................................................ 4
1.4
Normalisierung ....................................................................................................................................... 6
1.5
Die erste Normalform ............................................................................................................................. 6
1.6
Die zweite Normalform .......................................................................................................................... 7
1.7
Die dritte Normalform............................................................................................................................ 8
1.8
Integrität .................................................................................................................................................. 8
2
2.1
ABFRAGEN VON DATEN .................................................................................. 9
Einführung .............................................................................................................................................. 9
2.2
Einfache Abfragen .................................................................................................................................. 9
2.2.1
Spaltenaliase .................................................................................................................................. 10
2.2.2
Ändern der Spaltendaten beim Lesen ............................................................................................ 10
2.3
Einschränkung der Ergebnismenge .................................................................................................... 10
2.3.1
Die WHERE Klausel ..................................................................................................................... 10
2.3.2
Die IN Operator............................................................................................................................. 11
2.3.3
Die BETWEEN Operator .............................................................................................................. 12
2.4
Skalarfunktionen .................................................................................................................................. 13
2.4.1
Numerische Skalarfunktionen ....................................................................................................... 13
2.4.2
Zeichenketten Skalarfunkionen ..................................................................................................... 13
2.5
Aggregatfunktionen .............................................................................................................................. 13
2.5.1
Die COUNT Funktion ................................................................................................................... 14
2.5.2
Die SUM Funktion ........................................................................................................................ 14
2.5.3
Die MIN, MAX Funktionen .......................................................................................................... 14
2.5.4
Die AVG Funktion ........................................................................................................................ 15
2.5.5
Spalten mit und ohne Gruppierungsfunktion abfragen .................................................................. 15
2.6
Sortierung .............................................................................................................................................. 15
2.7
Gruppierungsfunktionen in WHERE Klauseln ................................................................................. 16
2.8
Kombination verschiedener Klauseln ................................................................................................. 16
Einführung in SQL
30.8.2001
Seite 2 von 31
2.9
ACCESS Ergänzungen ......................................................................................................................... 17
2.9.1
Selbstdefinierte VBA Funktionen ................................................................................................. 17
3
VIEWS ............................................................................................................... 18
3.1
Allgemeines ............................................................................................................................................ 18
3.2
Erstellen einer View .............................................................................................................................. 18
3.3
Lesen aus einer View ............................................................................................................................ 19
3.4
Ändern der Daten ................................................................................................................................. 19
3.5
ACCESS Ergänzungen ......................................................................................................................... 19
3.5.1
Abfragen........................................................................................................................................ 20
4
VERKNÜPFUNG VON TABELLEN .................................................................. 20
4.1
Equi Joins .............................................................................................................................................. 21
4.2
Non Equi Join ........................................................................................................................................ 23
4.3
Inner Join .............................................................................................................................................. 23
4.4
Outer Joins ............................................................................................................................................ 23
4.4.1
Left Outer Join .............................................................................................................................. 23
4.5
Right Outer Join ................................................................................................................................... 24
4.6
Tabellen mit sich selbst verknüpfen .................................................................................................... 25
5
UNTERABFRAGEN .......................................................................................... 26
5.1
Exists ...................................................................................................................................................... 27
5.2
Any / Some ............................................................................................................................................. 28
5.3
Korrelierende Unterabfragen .............................................................................................................. 28
6
ANHANG ........................................................................................................... 30
6.1
Tabellenverzeichnis .............................................................................................................................. 30
6.2
SQL Beispiele Verzeichnis ................................................................................................................... 30
6.3
Abbildungsverzeichnis.......................................................................................................................... 31
6.4
Quellen ................................................................................................................................................... 31
Einführung in SQL
30.8.2001
Seite 3 von 31
1 Einführung
Dieses Dokument soll eine kleine Einführung in die Datenbankabfragesprache SQL
darstellen.
Es behandelt die Grundlagen der Datenabfrage und der Datenänderung. Hierzu
gehören die Befehle SELECT, INSERT, UPDATE und DELETE. Dies sind die von
den Anwendern einer Datenbank am häufigsten genutzten Befehle.
Auf administrativen Tätigkeiten, wie das Erstellen von Tabellen, das Anlegen von
Indizes oder der Erstellung von referentieller Integrität wird bewußt nicht
eingegangen. Hierzu wird auf anderen Dokumente verwiesen.
Nach dem Durcharbeiten dieses Dokumentes soll der Anwender in die Lage versetzt
werden, Daten aus bestehenden Datenbanken abzufragen, entsprechend
aufzubereiten und manipulieren zu können.
Angesprochen werden hierin die einfachen Abfrage einer Tabelle, Skalarfunktionen
und Aggregatfunktionen, die Verknüpfung mehrerer Tabellen und Unterabfragen.
Desweiteren wird das Hinzufügen, das Ändern und das Löschen von Daten
aufgezeigt.
Berücksichtigt werden die Datenbanken von Microsoft (Access und SQL-Server) und
Oracle.
1.1 Historie
Die Sprache SQL (Structured Query Language) ist die de facto Standardabfragesprache für relationale Datenbanken. Sie entstand Ende der 70er Jahre bei
IBM für ihre Datenbank DB2.
SQL ist eine nicht prozedurale Sprache, d.h. man beschreibt das „was“, und nicht
das „wie“.
Relational bedeutet, das die Daten untereinander in Beziehung stehen. Durch
mengenalgebraische Operationen werden die Daten bearbeitet (abgefragt, eingefügt,
geändert, gelöscht).
Die Organisationen ANSI und ISO haben versucht, diese Sprache zu
standardisieren, aber wenige Hersteller halten sich an diese Normung.
1.2 Datenbanken
In den geschäftlichen und privaten Bereichen werden Daten bearbeitet, die
gespeichert werden müssen. Zur Speicherung dieser Daten hat man Datenbanken
entwickelt. Dies ist im Prinzip eine geordnete Sammlung von Daten, den
Informationen. Durch die rasante Entwicklung im PC/Homecomputerbereich werden
die Datenbanken immer mehr vom Großrechner auf die PCs verlagert und somit für
jeden Anwender erschwinglich.
1.3 Das relationale Modell
Im Jahre 1970 veröffentlichte Dr. E. F. Codd den Artikel „A Relational Model of Data
for Large Shared Data Banks“, der als Basis des relationalen Modells gilt. Er stützt
sich hierin auf math. Konzepte der relationalen Algebra, um Daten in Mengen und
untereinander in Beziehung stehende Untermengen aufzuteilen.
Einführung in SQL
30.8.2001
Seite 4 von 31
Informationen werden in verschiedenen Mengen gruppiert. Das relationale Modell
gliedert die Daten in Sätze und stellt diese in Form einer Tabelle dar. Diese
Tabellenstruktur besteht also aus einzelnen Datenelementen (Spalten oder Felder).
Als Datensatz bezeichnet man einen einzelnen Satz (Zeile), der eine Gruppe von
Feldern zusammenfaßt.
Tabelle
Spalte 1
Spalte 2
Spalte 3
A
E
I
B
F
J
C
G
K
D
H
L
Datum
Datensatz
(Zeile)
gleicher
Datentyp
Abbildung 1 - Aufbau einer Tabelle
Eine Relation ist als eine logisch zusammenhängende Objektmenge zu verstehen,
die in einer mn Matrix (Tabelle) festgehalten wird.
R  W 1  W 2  ...  Wm
Jedes Element r einer Relation muß aus einer geordneten Menge einzelner Werte w1
 W 1 ; w2  W 2 ; ... zusammengesetzt sein. Formal gilt
r = (w1, w2, ..., wn)
Auf eine Datenbank übertragen läßt sich festhalten:
Jede Relation ist eine Menge von Entitäten (oder Datensätzen) r. Jede Entität hat
verschiedene Eigenschaften, bzw. Attribute w, die den Spalten der Matrix R
entsprechen. Ein Attribut w ums sich im Wertebereich W  befinden.
Beispiel: Relation Kunde
KUNDE (Nummer, Name, Adresse, ...)
Die Relation Kunde wird durch die Attribute Nummer, Name, Adresse, ...
beschrieben. Einer Entität r wird jede dieser Attribute ein Wert aus der
jeweiligen Wertemenge zugeordnet (Kundennummer von 1 bis 9999)
Einführung in SQL
30.8.2001
Seite 5 von 31
Hinter diesem Ansatz steht, das die Daten in Tabellen (Relationen) abgelegt werden,
die in ihrer Gesamtheit die eigentliche Datenbank darstellen. Zu beachten ist, das die
Daten möglichst in redundanzfreier Form gespeichert werden sollen und
Beziehungen zwischen den Relationen berücksichtigt werden müssen.
Die Beziehung der Entitäten zueinander werden mit Hilfe von Schlüsselattributen
hergestellt. Jede Relation hat deshalb einen identifizierenden Primärschlüssel. Mit
Hilfe eines Bezugsschlüssels (foreign key) kann eine Beziehung zwischen den
Relationen hergestellt werden.
Hierbei unterscheidet man zwischen 3 Beziehungstypen
 In einer 1:1 Beziehung steht jede Entität Ex mit höchstens einer Entität Ey in
Beziehung B1 zueinander (Bsp.: jede Abteilung hat höchstens einen
Abteilungsleiter)
 Bei jeder 1:n Beziehung sind jeder Entität Ex n (mit n  0) Entitäten Ey mit der
Beziehung Bn zugeordnet. Umgekehrt steht jedes Ey mit höchstens einer
Entität Ex in Beziehung (Bsp.: Ein Abteilungsleiter „regiert“ eine Anzahl von
Mitarbeitern, ein Mitarbeiter wird von einem Abteilungsleiter „regiert“)
 Eine Beziehung vom Typ m:n liegt vor, wenn jede Entität E x mit n (n  0)
Entitäten Ey in Beziehung Bn steht und jede Entität Ey mit m (m  0) Entitäten
Ex in Beziehung Bm steht. (Bsp.: Mitarbeiter arbeiten an mehreren Projekten
und ein Projekt wird von mehreren Mitarbeitern bearbeitet)
1.4 Normalisierung
Die Normalisierung ist ein Prozeß. Bei dem die zu bearbeitenden Daten in ein
logisches Modell gebracht werden. Dieses logische Modell wird daraufhin verfeinert,
das die Bearbeitung der Daten optimiert wird. Hierbei unterscheidet man 3 Formen
der Normalisierung, die im folgenden aus einem Beispiel heraus dargestellt werden.
Als Beispiel soll eine Arbeitertabelle dienen, die folgende Einträge hat
Name Geburtsdatum
Adresse
Heinz
01.01.70 Bad
Sepp
01.07.80 Dürkheim
Freinsheim
Jupp
04.09.75 Wachenheim
Jochen
04.03.60 Deidesheim
Jürgen
05.08.73 Forst
Thomas
03.03.69 Herxheim
Hans
02.04.68 Frankental
Manager
Josef
Josef
Karl
Karl
Karl
Karl
Josef
Faehigkeit1 Faehigkeit2 Faehigkeit3
malen
techn.
rechnen
Zeichnen
kreativ
organisieren unterhalten
planen
schreiben
Geographie
Tabelle 1 - Die Arbeitertabelle
1.5 Die erste Normalform
Im ersten Schritt werden die Daten in separate Tabellen verschoben, wobei
gleichartige Daten in eigene Tabellen zusammengefaßt werden. Jede Tabelle
bekommt einen Primärschlüssel, einen eindeutigen Kennzeichner oder Bezeichner.
So kann man z.B. die Fähigkeiten eines Arbeiters in einer eigenen Tabelle
zusammenfassen. Man kann dann pro Arbeiter mehr als drei Fähigkeiten angeben,
Einführung in SQL
30.8.2001
Seite 6 von 31
anstatt in der Arbeitertabelle mehr als einen Eintrag für einen Arbeiter einzufügen.
Als nächstes definiert man dann pro Tabelle einen Primärschlüssel. Dies ist ein für
diese Tabelle eindeutiger Bezeichner. Somit erhält man eine neue Arbeitertabelle
und eine Fähigkeitentabelle, die hier aufgeführt sind.
Name Geburtsdatum
Adresse
Manager
Heinz
01.01.70 Bad Dürkheim Josef
Sepp
01.07.80 Freinsheim
Josef
Jupp
04.09.75 Wachenheim Karl
Jochen
04.03.60 Deidesheim
Karl
Jürgen
05.08.73 Forst
Karl
Thomas
03.03.69 Herxheim
Karl
Hans
02.04.68 Frankental
Josef
Tabelle 2 - Die Arbeitertabelle (1NF)
Name
Hans
Heinz
Jupp
Jupp
Jupp
Jürgen
Sepp
Sepp
Thomas
Faehigkeit
Geographie
malen
kreativ
organisieren
unterhalten
planen
rechnen
techn. Zeichnen
rechnen
Beschreibung
Kennt sich überall gut aus
Landschaftsbilder
viele gute Ideen
guter Überblick
kennt Witze
gute Terminvoraussagen
Analysis, Algebra
Motorenbilder
Numerik
Tabelle 3 - Die Fähigkeitentabelle (1NF)
Primärschlüssel der Arbeitertabelle ist der Name, die beiden Spalten Bame und
Fähigkeit bilden bei der Fähigkeitentabelle den Primärschlüssel.
Die Fähigkeitentabelle hat noch einen Nachteil. Die Beschreibung der Fähigkeit
hängt von der Fähigkeit ab, nicht vom Namen. Dieser Nachteil wird in einem weiteren
Normalisierungsschritt eliminiert.
1.6 Die zweite Normalform
Die zweite Normalform entfernt die Daten aus einer Tabelle, die nur von einem Teil
des Primärschlüssels abhängen. Also wird hier die Fähigkeit und die Beschreibung
dieser in getrennten Tabellen untergebracht.
Wenn die Fähigkeit und die Beschreibung in der 1NF gelassen werden, dann kann
nur eine Beschreibung für eine Fähigkeit angegeben werden, d.h. man kann keine
zwei Beschreibungen für eine Fähigkeit angeben (vgl. rechnen: Analysis, Algebra vs.
Numerik)
Wenn ein Arbeiter mit einer besonderen Fähigkeit die Stadt verläßt und damit aus
der Datenbank entfernt wird, dann wird auch diese Fähigkeit aus der Datenbank
gelöscht. Mit der 2NF kann die Datenbank diese Fähigkeit speichern, obwohl zur Zeit
niemand diese Fähigkeit besitzt.
Einführung in SQL
30.8.2001
Seite 7 von 31
Name
Hans
Heinz
Jochen
Jupp
Jürgen
Sepp
Thomas
Geburtsdatum
02.04.68
01.01.70
04.03.60
04.09.75
05.08.73
01.07.80
03.03.69
Adresse
Frankental
Bad Dürkheim
Deidesheim
Wachenheim
Forst
Freinsheim
Herxheim
Manager
Josef
Josef
Karl
Karl
Karl
Josef
Karl
Tabelle 4 - Die Arbeitertabelle 2NF
Faehigkeit
Geographie
kreativ
malen
organisieren
planen
rechnen
techn. Zeichnen
unterhalten
Tabelle 5 - Tabelle Fähigkeiten 2NF
Name
Hans
Heinz
Jupp
Jupp
Jupp
Jürgen
Sepp
Sepp
Thomas
Faehigkeit
Geographie
malen
kreativ
organisieren
unterhalten
planen
rechnen
techn. Zeichnen
rechnen
Beschreibung
kennt sich überall gut aus
Landschaftsbilder
viele gute Ideen
guter Überblick
kennt Witze
gute Terminvoraussagen
Analysis, Algebra
Motorenbilder
Numerik
Tabelle 6 - Die Arbeiter-Fähigkeiten-Tabelle 2NF
1.7 Die dritte Normalform
In dieser dritten Normalform, die man für jedes Modell anstreben soll, werden alle
Elemente aus den Tabellen entfernt, die nicht unmittelbar vom Primärschlüssel
abhängen.
... überspringen wir
1.8 Integrität
... überspringen wir
Einführung in SQL
30.8.2001
Seite 8 von 31
2 Abfragen von Daten
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
Einführung in SQL
30.8.2001
Seite 9 von 31
Kunde
SQL 1 - Lesen der Kundendaten
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
Name
As Nummer,
As Name,
Vorname
Jahre
As Vorname,
As ‘Alter‘
FROM
Kunde
SQL 2 - Lesen der Kundendaten mit Spaltenalias
2.2.2 Ändern der 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
Name
As Nummer,
As Name,
Vorname
Jahre + 5
As Vorname,
As Alter_In_5_Jahren
FROM
Kunde
SQL 3 - Ändern der Spalteninhalte der Ergebnismenge
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
Einführung in SQL
30.8.2001
Seite 10 von 31
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’
SQL 4 - Einschränkung der Ergebnismenge
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 CaseSensitiv. 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’
SQL 5 - Einschränkung der Ergebnismenge (2)
2.3.2 Die 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.
Einführung in SQL
30.8.2001
Seite 11 von 31
Beispiel: Suche von Kunden in best. Städten
SELECT
Name,
Vorname
FROM
Kunde
WHERE
Ort = ’Bad Dürkheim’ OR
Ort = ’Freinsheim’
SQL 6 - Terme gleicher Spalten mit OR verknüpfen
SELECT
Name,
Vorname
FROM
Kunde
WHERE
Ort IN (’Bad Dürkheim’, ’Freinsheim’)
SQL 7 - Anwendung des IN Operators
Analog dazu können auch numerisch Werte in der IN Liste aufgezählt werden oder
Datumsangaben verwendet werden.
2.3.3 Die 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
SQL 8 - Einschränkung der Ergebnismenge auf einen Bereich
SELECT
Name,
Vorname
FROM
Kunde
WHERE
Jahre BETWEEN 20 AND 30
SQL 9 - Einschränkung der Ergebnismenge auf einen Bereich (2)
Einführung in SQL
30.8.2001
Seite 12 von 31
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
Pla
ABS, LN, MOD, POWER, SIGN, SQRT
2.4.2 Zeichenketten Skalarfunkionen
Pla
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.
Einführung in SQL
30.8.2001
Seite 13 von 31
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
SQL 10 - Die COUNT Funktion
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
SQL 11 - Die SUM Funktion
2.5.3 Die MIN, MAX Funktionen
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
SQL 12 - Die MIN und MAX Funktion
Einführung in SQL
30.8.2001
Seite 14 von 31
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
SQL 13 - Die AVG Funktion
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
SQL 14 - Gemischte Abfrage mit und ohne Gruppierungsspalten
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
Einführung in SQL
30.8.2001
Seite 15 von 31
Select
Name,
Vorname,
Alter
From
Kunde
Order by
Name,
Vorname
SQL 15 - Alphabetisch Sortierte Kundenliste
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)
SQL 16 - die HAVING Klausel
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
Einführung in SQL
30.8.2001
Seite 16 von 31
where
Auftrag_Nummer IN (1,3,5,7,9)
having
SUM(Betrag) > 100
order by
Auftrag_Nummer
SQL 17 - Sortierte Auftragsliste mit Kriterien
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änzungen
2.9.1 Selbstdefinierte VBA Funktionen
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
SQL 18 - Eine selbstgeschriebene VBA Funktion nutzen
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.
Einführung in SQL
30.8.2001
Seite 17 von 31
3 Views
3.1 Allgemeines
Mit einer Sicht (engl. View) kann man komplexe Abfragen kapseln. Das heißt, man
schreibt nicht mehr einen komplexen SQL-Befehl, sondern kann die Daten von
dieser View – wie bei einer einfachen Tabelle – direkt abfragen, als ob man die
Daten aus einer Tabelle liest. Man muß sich das wie eine virtuelle Tabelle vorstellen,
die aber einigen Einschränkungen bei der operativen Bearbeitung unterliegt.
Änderungen an der zu Grunde liegenden Daten wirken sich direkt auf die View aus,
diese liefert dann sofort die neuen Daten. Das heißt auch, das die View die Daten
nicht gesondert speichert, sondern auf die vorhandenen Daten zurückgreift. Somit
belegt eine View auch keinen Speicherplatz in der Datenbank (bis auf die
Deklaration).
Eine View wird eingesetzt, um dem Anwender eine besondere Sicht auf die Daten zu
geben. Wenn den Anwender nicht an allen Daten interessieren oder der Anwender
nicht alle Daten sehen darf, werden Views eingesetzt. Als Beispiel sei eine
Mitarbeitertabelle, in der auch das Gehalt eines Mitarbeiters gespeichert ist. Nur die
Geschäftsleitung soll das Gehalt sehen. Der Mitarbeiter, der die Wochenpläne
aufstellt, soll die Gehälter nicht sehen und benötigt diese auch nicht für seine
Arbeitspläne. Hier kann man dem Anwender eine View auf die Mitarbeitertabelle zur
Verfügung stellen, in der nur der Name und die Abteilung enthalten sind, der
Geschäftsleitung erteilt man den kompletten Zugriff auf die Mitarbeitertabelle.
3.2 Erstellen einer View
Eine View wird mit dem Befehl CREATE VIEW erzeugt. Diesem Befehl gibt man die
zu Grunde liegende Abfrage mit. Die Spaltennamen der View ergeben sich aus der
Abfrage oder werden explizit vergeben. Hiermit kann man die Spaltennamen nach
seinen eigenen Bedürfnissen anpassen. Der Datentyp der Ergebnisspalten werden
aus den zu Grunde liegenden Tabellenspalten vererbt.
CREATE VIEW <Name> [<Spalte 1> (,<Spalte x>){0..n} AS
SELECT <Spalte 1> (,<Spalte y){0..n}
FROM ...
SQL 19 - Syntax für das Anlegen einer View
Für die Erstellung View, die minimale Kundendaten zur Verfügung stellt, schreibt
man also
Create view Minimale_Kundendaten (Nummer, Name, Vorname) AS
Select
kd.Nummer,
kd.Name,
kd.Vorname
from
Einführung in SQL
30.8.2001
Seite 18 von 31
Kunde kd
SQL 20 - Eine einfahce Sicht auf die Kundendaten
Man kann für den zu Grunde liegenden Abfragebefehl fast alle Elemete des SELECT
Befehls verwenden, also die Daten mit WHERE Einschränken usw. Einschränkungen
bestehen darin, das man bei der Abfrage keine UNION Klausel verwenden darf und
das keine ORDER BY Klausel verwenden darf.
3.3 Lesen aus einer View
Wie oben angedeutet kann man sich eine View wie eine virtuelle Tabelle vorstellen.
Das bedeutet gleichzeitig, das man die Daten mit einem SELECT Befehl lesen kann.
Bei dem Lesen aus einer View unterliegt man bezüglich der verwendbaren Klauseln
des SELECT Befehls keinen Einschränkungen.
Für die Abfrage der Daten aus der oben erstellten View schreibt man
Select
*
from
Minimale_Kundendaten
SQL 21 - Abfrage von Daten aus einer View
3.4 Ändern der Daten
Bezüglich der Änderung der Daten, die eine View liefert, gibt es einige
Einschränkungen. Diese werden hier aufgeführt
 Aus Sichten, die aus mehreren Tabellen bestehen, können keine Zeilen gelöscht
werden
 In Sichten, die aus Tabellen besteht, die NOT NULL Spalten haben, diese aber
nicht in der View enthalten sind, können keine Daten eingefügt werden
 Wenn Daten in einer Sicht eingefügt oder geändert werden, müssen die Daten zu
einer einzigen physikalischen Tabelle gehören
 Wird bei der Erzeugung die DISTINCT Klausel verwendet, können keine Daten
eingefügt oder geändert werden
 Enthält die View virtuelle Spalten (berechnete Spalten), so können keine Daten
eingefügt oder geändert werden
Dies sind die wichtigsten Einschränkungen, jedes DBMS hat noch seine eigenen
Einschränkungen, die in der Produktbeschreibung nachzulesen sind.
3.5 ACCESS Ergänzungen
Einführung in SQL
30.8.2001
Seite 19 von 31
3.5.1 Abfragen
Bei ACCESS wird eine View in der Regel nicht mit dem Befehl CREATE VIEW
erzeugt. Hier wird eine Abfrage angelegt, der man nur den SELECT Befehl angibt.
Diese Abfrage wird dann unter einen Namen – dem Viewnamen – abgespeichert und
kann dann damit arbeiten.
Beachte, das die ACCESS Abfragen nicht nur Views sein müssen. Hierbei kann
ACCESS jeden Befehl ausführen. Der Name ist hierbei leicht verwirrend.
4 Verknüpfung von Tabellen
Neben der Abfrage von Daten aus einer Tabelle kommt es viel häufiger vor, Daten
aus mehreren Tabellen gleichzeitig abzufragen. Hierbei kommen Verknüpfungen
(engl. join) zum Einsatz. Es gilt hierbei alles, was bisher dargestellt wurde.
Die zu verknüpfenden Tabellen werden in der FROM Klausel aufgezählt, wobei die
Reihenfolge keine Rolle spielt. Die Verknüpfung wird in der WHERE Klausel
deklariert. Bei den Spalten wird – wenn die Namen nicht eindeutig sind – der
Tabellenname oder ein Alias mit angegeben. Doch Vorsicht bei dem Fehlen der
Tabellenbezeichnern. Ich empfehle, diesen bei Verknüpfungen immer mitanzugeben.
SELECT [[<Tabelle.>]Spalte(,)]{1..n} FROM [Tabelle(,)]{1..n}
Als erstes Beispiel soll folgende Verknüpfung dienen:
select
Tabelle1.Spalte1,
Tabelle1.Spalte2,
Tabelle2.Spalte1,
Tabelle2.Spalte2
from
Tabelle1,
Tabelle2
SQL 22 - Das karthesische Produkt
Hierbei wird das kartesische Produkt Tabelle1 x Tabelle2 zurückgegeben, da keine
Verknüpfung einschränkend angegeben wurde. Dies nennt man dann auch
Crossjoin.
Anstelle des Tabellennamens – der meist lang ist – kann man einen Aliase für jede
Tabelle vergeben, mit denen der Befehl verkürzt wird. Hierdurch wird der Befehl
meist lesbarer. Diesen Alias schreibt man direkt hinter die Tabellenangabe in der
FROM Klausel.
Einführung in SQL
30.8.2001
Seite 20 von 31
select
t1.Spalte1,
t1.Spalte2,
t2.Spalte1,
t2.Spalte2
from
Tabelle1 as t1,
Tabelle2 as t2
SQL 23 - das karthesische Produkt mit Tabellenaliase
Die Angabe von AS bei der Aliasdeklaration ist optional.
4.1 Equi Joins
Bei dieser – am häufigsten eingesetzten – Verknüpfungsform werden zwei Tabellen
miteinander Verknüpft, die über gleiche Spalten verfügen, in denen gleiche Werte
stehen. Dies sind in der Regel der Primärschlüssel einer Tabelle und der
Fremdschlüssel dieser Tabelle in der zweiten Tabelle.
Man nennt diese Verknüpfungsart equi join, da die beiden Tabellen mit den gleichen
Spalten über ein Gleichheitszeichen verknüpft werden.
Bsp.: Aufträge und ihre Artikel
select
aa.Auftrag_Nummer,
art. Nummer,
art.Bezeichnung
from
AuftragArtikel aa,
Artikel art
where
aa.Artikel_Nummer = art. Nummer
SQL 24 - Aufträge und deren Artikel
Dies Abfrage bewirkt, das alle Artikel eines Auftrags zusammen ausgegeben werden,
und dies für jeden Auftrag, der in der Datenbank steht.
Natürlich können mehrere einschränkende Bedingungen in der WHERE Klausel
angegeben werden. Diese Bedingung wird auf die Verknüpfung angewendet. Hiermit
ist es z.B. möglich, die Artikeldaten nur eines Auftrags abzurufen.
select
aa.Auftrag_Nummer,
art. Nummer,
art.Bezeichnung
from
AuftragArtikel aa,
Artikel art
where
Einführung in SQL
30.8.2001
Seite 21 von 31
aa.Artikel_Nummer = art. Nummer
AND aa.Auftrag_Nummer = 1
SQL 25 - Auftrag 1 mit deren Artikeln
Genauso kann man die Umsätze jedes Artikels bestimmen.
Select
SUM (aa.Anzahl * art.Preis)
From
Artikel art,
Auftrag_Artikel aa
Where
aa.Artikel_Nummer = art. Nummer
AND art.Bezeichnung = ‘Dosenbier‘
SQL 26 - Umsatz eines Artikels
Beachte hierbei die Aliasnamen der beiden Tabellen. Der erste Term der WHERE
Klausel stellt die Verknüpfung dar und der zweite Term ist eine einschränkende
Bedingung.
Natürlich kann man mehr als zwei Tabellen verknüpfen. Hierbei werden jeweils zwei
Tabellen in einem Term verknüpft und jeweils eine weitere Tabelle in einem weiteren
Term verknüpft.
select
kd.Name,
kd.Vorname,
art.Bezeichnung,
art.Preis * aa.Anzahl,
au.Nummer
from
Artikel art,
Auftrag au,
Kunde kd
where
kd. Nummer = au.Kunde_Nummer
AND au. Nummer = aa.Auftrag_Nummer
AND aa.Artikel_Nummer = art. Nummer
SQL 27 - Abfrage über mehrere Tabellen
Man sieht an der Ergebnismenge, das, wenn mehr als eine entsprechende Zeile in
der zweiten Tabelle existiert, mehrere Zeilen für dieselben Daten der ersten Tabelle
generiert werden. Desweiteren sind keine Kunden in der Ergebnismenge enthalten,
die bisher keinen Bestellung (=> Auftrag) aufgegeben haben, da hier keine Gleichheit
existiert. Dies ist ein ganz wichtiger Punkt, der häufig vergessen wird.
Hinweis. Diese Art der Abfrage ist sehr viel schneller, als die Daten der drei Tabellen
einzeln anzufordern. D.h. man nimmt die Kundentabelle, sucht zu jeder
Kundennummer die Aufträge und zu jedem Auftrag die Artikel in jeweils einzelnen
SQL Befehlen. Dieser Lösungsansatz ist zwar genau so richtig, kostet aber sehr viel
Zeit und Prozessorlast. Also Finger davon und ein großer SQL Befehl schreiben.
Einführung in SQL
30.8.2001
Seite 22 von 31
4.2 Non Equi Join
Als non equi join bezeichnet man jede Verknüpfung, die nicht das Gleichheitszeichen
verwendet. Diese Art wird jedoch sehr selten eingesetzt und wird hier nicht weiter
erläutert.
4.3 Inner Join
Eine andere Schreibweise für die equi joins ist der inner join. Diese Begriffe sind
gleich zu verwenden. Microsoft (mit Sybase) hat diese Syntaxform eingeführt,
beherrscht aber auch noch die andere Syntax. Die meisten anderen Datenbanken
verstehen aber nur die equi join Form (oder zum teil wieder Eigenentwicklungen).
Die allgemeine Syntax lautet:
SELECT <Spalten> FROM <Tabelle1>
INNER JOIN <Tabelle2> ON
<Tabelle1.Spalte> = <Tabelle2.Spalte>
SQL 28 - Die Inner Join Syntax
Beachte, das hier keine WHERE Klausel angegeben wird, um die Verknüpfung zu
beschreiben.
4.4 Outer Joins
Bei den equi join (inner join) Abfragen sieht man, das nur Ergebniszeilen geliefert
werden, die eine Entsprechung in beiden Tabellen haben.
Häufig ist es aber wichtig, alle Zeilen einer Tabelle zu bekommen, auch wenn keine
entsprechenden Zeilen in der verknüpften Tabelle existieren. Beispielsweise möchte
man eine Kunden Umsatz Tabelle haben, in der alle Kunden vorhanden sind, auch
solche, mit denen man keinen Umsatz gemacht hat. Hierbei kommt man mit einem
equi join nicht weiter.
Dieses Problem kann mit den outer joins gelöst werden. Hierbei macht man der
Datenbank klar, das alle Zeilen der einen Tabelle zur Ergebnismenge gehören
sollen. Die Datenbank generiert dann für die Spalten der Ergebniszeilen NULL
Einträge, in denen es keine Entsprechungen gibt.
Welche Tabelle alle Zeilen zur Ergebnismenge hinzufügt wird über die left oder die
right outer join Befehle festgelegt.
4.4.1 Left Outer Join
Bei dem left outer join werden alle Zeilen der linken Tabelle der Ergebnismenge
zugefügt. Links bedeutet hier die Tabelle in dem SQL Befehl, die weiter links steht,
also zuerst in dem Befehl angegeben wird.
Einführung in SQL
30.8.2001
Seite 23 von 31
Bsp.: Kunden Auftrag Tabelle
select
Kd.Name,
kd.Vorname,
au.Nummer
from
Kunde kd
left outer join
Auftrag au
on
au.Kunden_Nummer = kd.Nummer
SQL 29 - Ein einfacher left outer join Befehl
Das Ergebnis enthält alle Kunden. Die entsprechende Auftragsspalte sind evtl. durch
einen NULL Eintrag gefüllt. Ein Kunde kann mehrfach vorkommen, da zu einem
Kunde mehr als ein Auftrag existieren kann.
Das left bezieht sich hier auf die Tabelle Kunde, da diese im Befehl als erstes
angegeben wurde, also weiter links steht.
Beachte, das hier zwar das Gleichheitszeichen angegeben wird, es sich aber nicht
um einen reinen equi join handelt.
Diese Syntax kennt nur Microsoft (Sybase). Die von anderen Datenbanken
verwendete Syntax hat das o.g. Schlüsselwort nicht. Hierbei wird die equi join Syntax
verwendet. Die Tabelle, die die NULL Einträge liefern soll, wird mit einem (+) hinter
der Verknüpfung gekennzeichnet.
Allgemein lautet die Syntax:
SELECT <Spalten> FROM <Tabellen>
WHERE <Tabelle1> = <Tabelle2>(+)
SQL 30 - Die allgemeine outer join Syntax
Obiges Beispiel mit dieser Syntax lautet dann
select
kd.Name,
kd.Vorname,
au.Nummer
from
Kunde kd,
Auftrag au
where
kd.Nummer = au.Kunden_Nummer(+)
SQL 31- Ein einfaches outer join Beispiel (2)
4.5 Right Outer Join
Wie gesehen, fügt bei dem left outer join die linke Tabelle alle Zeilen zur
Ergebnismenge bei. Soll jedoch die zweite Tabelle alle Zeilen der Ergebnismenge
Einführung in SQL
30.8.2001
Seite 24 von 31
beifügen, so setzt man den right outer join ein. Die Syntax ist analog zu o.g. Syntax,
jedoch wird die Klausel right outer join eingesetzt.
Voriges Beispiel schreibt man als right outer join folgendermaßen:
select
kd.Name,
kd.Vorname,
au.Nummer
from
Auftrag au
right outer join
Kunde kd
on
kd.Nummer = au.Kunden_Nummer
SQL 32 - Ein einfaches right outer join Beispiel
Wie man sieht, ist der right outer join die Umkehrung des left outer join (Vertauschen
der Tabellenreihenfolge und Vertauschen von left/right).
Die analoge Syntax der restlichen – nicht Microsoft – Welt, lautet:
select
kd.Name,
kd.Vorname,
au.Nummer
from
Kunde kd,
Auftrag au
where
au.Kunden_Nummer(+) = kd.Nummer
SQL 33 - Ein einfaches outer join Beispiel (2)
4.6 Tabellen mit sich selbst verknüpfen
Durch die Vergabe von Aliasnamen können Tabellen mit sich selbst verknüpft
werden. Diese Technik wird jedoch seltener eingesetzt.
Bsp.: Suchen nach doppelten Einträgen in einer Tabelle
select
kd.Nummer,
kd.Name
from
Kunde kd,
Kunde kd2
where
kd.Nummer = kd2.Nummer
AND kd.Name <> kd2.Name
SQL 34 - Tabelle mit sich selbst verknüpft
Einführung in SQL
30.8.2001
Seite 25 von 31
5 Unterabfragen
Eine weitere Art der Verknüpfung ist die Unterabfrage. Hierbei wird das Ergebnis
einer Abfrage dazu genutzt, die Eingabe einer weiteren Abfrage zu bilden.
Einfach ausgedrückt bedeutet dies, ein Zwischenergebnis zu berechnen und daraus
das Gesamtergebnis zu bestimmen. Das hat den Vorteil, das man den kompletten
Befehl zerlegen kann. Somit kann das Zwischenergebnis kontrolliert werden und
dann daraus das Gesamtergebnis berechnet werden. Dies ist vorteilhaft für die
Fehlersuche und für einen schrittweise Entwicklung komplexer Abfragen.
Als Beispiel wollen wir die Kunden bestimmen, deren Alter über dem
Durchschnittsalter aller Kunden liegt. Zuerst ermitteln wir also das Durchschnittsalter
aller Kunden.
select
AVG(Jahre)
from
Kunde
SQL 35 - Das Durchschnittsalter aller Kunden
Diese Ergebnis vergleicht man mit der Altersangabe jedes einzelnen Kunden und
wählt die aus, die älter als das Durchschnittsalter sind.
select
kd.Name,
kd.Vorname
from
Kunde kd
where
Jahre > {berechnetes Durchschnittsalter}
SQL 36 - Kunden über dem Durchschnittsalter (1)
Wenn man jetzt weiß, das man Unterabfragen in Klammern setzten muß, dann kann
man den ganzen Befehl hinschreiben
select
kd.Name,
kd.Vorname
from
Kunde kd
where
Jahre >
(
select
AVG(Jahre)
from
Kunde kd
Einführung in SQL
30.8.2001
Seite 26 von 31
)
SQL 37 Kunden über dem Durchschnittsalter (2)
Unterabfragen haben keine Beschränkung bezüglich der Verwendung von
Syntaxelementen. Achten Sie aber darauf, das die so verknüpften Daten
zusammenpassen. Desweiteren muß man auf die Kardinalität achten.
Liefert die Unterabfrage mehr als einen Datensatz, so funktionieren die einfachen
Verknüpfungsoperatoren verständlicherweise nicht mehr. Dann müssen andere
Operatoren eingesetzt werden.
Beispielsweise kann eine Liste der Aufträge von Kunden aus Bad Dürkheim
folgendermaßen bestimmt werden
select
kd.Name,
kd.Vorname,
au.Nummer
from
Kunde kd,
Auftrag au
where
kd.Nummer = au.Kunden_Nummer
AND kd.Nummer IN
(
select
kd.Nummer
from
Kunde kd
where
Kd.Ort = ‘Bad Dürkheim‘
SQL 38 - Auftragsliste der Kunden aus Bad Dürkheim
5.1 Exists
Interessiert für die Haupt-/Oberabfrage nur, ob die Unterabfrage Zeilen liefert, jedoch
nicht deren Inhalt, so nutzt man das EXISTS Schlüsselwort. Dies ist eine boole‘sche
Auswertung der Ergebnismenge, die TRUE liefert, sobald eine Ergebnismenge
vorhanden ist. Sind keine Zeilen in der Ergebnismenge enthalten (leere Menge),
dann liefert dieser Ausdruck FALSE.
Als Beispiel wollen wir wissen, ob wir Kunden mit dem Nachnamen Schmitt in
unserer Kundenkartei haben
select
‘Ja‘
from
Dual
where
Einführung in SQL
30.8.2001
Seite 27 von 31
exists
(
select
*
from
Kunde kd
where
kd.Name = ‘Schmitt‘
)
SQL 39 - Gibt es Kunden mit einem bestimmten Namen
Beachte, das die Hauptabfrage so viele Zeilen liefert, wie die Tabelle der
Hauptabfrage Zeilen hat. Dies kommt daher, das bei der Auswertung nur auf TRUE
oder FALSE geprüft wird, Im TRUE Falle wird die Hauptabfrage ausgeführt, sonst
nicht.
Eine Anwendung hierfür sind z.B. Updatescripte für Datenbankschemata, die dann
ausgeführt werden, wenn bestimmte Daten noch nicht vorhanden sind.
5.2 Any / Some
Im Gegensatz zu Exists liefern die Any und die Some Klauseln für jede
entsprechende Zeile der Unterabfrage zur Oberabfrage.
Als Beispiel soll die Auftragsliste der Kunden aus Bad Dürkheim ermittelt werden.
select
kd.Name,
kd.Vorname,
au.Nummer
from
Kunde kd,
Auftrag au
where
kd.Nummer = any
(
select
kd.Nummer
from
Kunde kd
where
kd.Ort = ‘Bad Dürkheim‘
SQL 40 - Auftragsliste der Kunden aus Bad Dürkheim (mit ANY)
Wie man sieht, liefert diese Abfrage dasselbe Ergebnis wie die Abfrage mit IN. Der
Unterschied zwischen IN und ANY / SOME besteht darin, das IN nur auf Gleichheit
prüfen kann, ANY / SOME kann dahingegen mit allen Operatoren verwendet werden.
5.3 Korrelierende Unterabfragen
Einführung in SQL
30.8.2001
Seite 28 von 31
Die bisher verwendeten Abfragen waren Unabhängig voneinander. Die
korrelierenden haben eine Referenz zur Ober-/Hauptabfrage.
Einführung in SQL
30.8.2001
Seite 29 von 31
6 Anhang
6.1 Tabellenverzeichnis
Fehler! Es konnten keine Einträge für ein Abbildungsverzeichnis gefunden
werden.
6.2 SQL Beispiele Verzeichnis
SQL 1 - Lesen der Kundendaten .............................................................................. 10
SQL 2 - Lesen der Kundendaten mit Spaltenalias .................................................... 10
SQL 3 - Ändern der Spalteninhalte der Ergebnismenge ........................................... 10
SQL 4 - Einschränkung der Ergebnismenge ............................................................ 11
SQL 5 - Einschränkung der Ergebnismenge (2) ....................................................... 11
SQL 6 - Terme gleicher Spalten mit OR verknüpfen ................................................ 12
SQL 7 - Anwendung des IN Operators ..................................................................... 12
SQL 8 - Einschränkung der Ergebnismenge auf einen Bereich................................ 12
SQL 9 - Einschränkung der Ergebnismenge auf einen Bereich (2) .......................... 12
SQL 10 - Die COUNT Funktion ................................................................................ 14
SQL 11 - Die SUM Funktion ..................................................................................... 14
SQL 12 - Die MIN und MAX Funktion ....................................................................... 14
SQL 13 - Die AVG Funktion...................................................................................... 15
SQL 14 - Gemischte Abfrage mit und ohne Gruppierungsspalten ............................ 15
SQL 15 - Alphabetisch Sortierte Kundenliste............................................................ 16
SQL 16 - die HAVING Klausel .................................................................................. 16
SQL 17 - Sortierte Auftragsliste mit Kriterien ............................................................ 17
SQL 18 - Eine selbstgeschriebene VBA Funktion nutzen ......................................... 17
SQL 19 - Syntax für das Anlegen einer View............................................................ 18
SQL 20 - Eine einfahce Sicht auf die Kundendaten .................................................. 19
SQL 21 - Abfrage von Daten aus einer View ............................................................ 19
SQL 22 - Das karthesische Produkt ......................................................................... 20
SQL 23 - das karthesische Produkt mit Tabellenaliase ............................................ 21
SQL 24 - Aufträge und deren Artikel......................................................................... 21
SQL 25 - Auftrag 1 mit deren Artikeln ....................................................................... 22
SQL 26 - Umsatz eines Artikels ................................................................................ 22
SQL 27 - Abfrage über mehrere Tabellen ................................................................ 22
SQL 28 - Die Inner Join Syntax ................................................................................ 23
SQL 29 - Ein einfacher left outer join Befehl ............................................................. 24
SQL 30 - Die allgemeine outer join Syntax ............................................................... 24
SQL 31- Ein einfaches outer join Beispiel (2) ........................................................... 24
SQL 32 - Ein einfaches right outer join Beispiel........................................................ 25
SQL 33 - Ein einfaches outer join Beispiel (2) .......................................................... 25
Einführung in SQL
30.8.2001
Seite 30 von 31
SQL 34 - Tabelle mit sich selbst verknüpft ............................................................... 25
SQL 35 - Das Durchschnittsalter aller Kunden ......................................................... 26
SQL 36 - Kunden über dem Durchschnittsalter (1) ................................................... 26
SQL 37 Kunden über dem Durchschnittsalter (2) ..................................................... 27
SQL 38 - Auftragsliste der Kunden aus Bad Dürkheim ............................................. 27
SQL 39 - Gibt es Kunden mit einem bestimmten Namen ......................................... 28
SQL 40 - Auftragsliste der Kunden aus Bad Dürkheim (mit ANY) ............................ 28
6.3 Abbildungsverzeichnis
Abbildung 1 - Aufbau einer Tabelle ............................................................................ 5
6.4 Quellen
Einführung in SQL
30.8.2001
Seite 31 von 31
Herunterladen