SQL
SQL
Oktober 2000
A
Inhalt
A.1 A.2 A.3
A.4
A.8
Definitionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Beziehungen zwischen Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Einfache Operationen auf Tabellen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 A.3.1 Projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 A.3.2 Selektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 A.3.3 Selektion und Projektion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Tabellen verbinden: Die Join-Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 A.4.1 Grundlegendes zu Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 A.4.2 Theta-Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 A.4.3 Equi Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 A.4.4 Natural Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 A.4.5 Outer Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 A.4.6 Inner Join. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Weitere Operationen auf Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Schlssel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 SQL-bersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 A.7.1 Skalare Operatoren und Funktionen . . . . . . . . . . . . . . . . . . . . . . . 17 A.7.2 Aggregatfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A.7.3 Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A.7.4 Virtuelle Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A.7.5 Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 A.7.6 Persistent gespeicherte Module (PSM) . . . . . . . . . . . . . . . . . . . . . 19 Datenmanipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 A.8.1 SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 A.8.2 INSERT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 A.8.3 DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
A.8.4 UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Datendefinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 A.9.1 CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.9.2 ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.9.3 DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.10 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 A.9
A.1
Definitionen
Unter einer Datenbank ist eine auf Dauer angelegte Datenorganisation zu verstehen, und unter dem Begriff Datenorganisation werden alle Verfahren zusammengefasst, die dazu dienen, Daten zu strukturieren, zu speichern und verfgbar zu halten. In relationalen Datenbanken sind die Strukturelemente Relationen, zwischen denen logische Abhngigkeiten bestehen. Relationen manifestieren sich in der Praxis fast immer als Tabellen, d.h. die beiden Begriffe Relation und Tabelle knnen fast immer synonym verwenden werden. Im Folgenden wird vorzugsweise der Terminus Tabelle verwendet. Ein Datenbankverwaltungssystem (DBMS DataBase Management System) oder kurz Datenbanksystem (DBS) ist ein Programmsystem zur Verwaltung der Daten von Datenbanken. RDBMS ist die relationale DBMS-Variante. Sie ist der heute vorherrschende Datenbanktyp. Datenbanksprachen dienen dem Zugriff auf die Bestnde und Strukturen einer Datenbank. Sie ermglichen in solchen Bestnden das Suchen, Lschen, Verndern und Einfgen von Daten in Tabellen (SELECT, DELETE, UPDATE und INSERT) bzw. die Definition, nderung und Elimination der Tabellen selbst (CREATE, ALTER, DROP). Die in Klammern stehenden Begriffe entstammen der prominentesten unter diesen Sprachen, nmlich SQL, die in nahezu allen RDBMS blich ist. Die Tabellen relationaler Datenbanken lassen sich mittels SQL zu virtuellen Tabellen, die auch als Sichten oder Views bezeichnet werden, zusammenbinden. Die Elemente relationaler Datenbanken sind also Tabellen (oder Relationen, s.o.), die zueinander in Beziehung stehen. Jede Tabelle hat einen Tabellennamen und besteht aus Spalten. Und jede Spalte hat ihrerseits einen Spaltennamen und besteht aus in Zeilen angeordneten Werten (Spalten heien manchmal auch Attribute und Spaltenwerte Ausprgungen der Attribute). Mit den Werten von Spalten ist der Begriff Domne verbunden. Darunter ist die Menge der erlaubten Werte in einer Spalte, also ihr Wertebereich zu verstehen. Zur Verdeutlichung folgt ein einfaches Beispiel in Form der Tabelle Personen mit den Spalten nachname, vorname und pcode (pcode stellt eine Kodierung dar, ber die jede der Zeilen in der Tabelle eindeutig identifiziert ist, vgl. Abschnitt 2.7).
A.1 Definitionen
3 Tabellenname: Personen
pcode 23 88 24 101
Zunchst sei das Vorangegangene in einer der blicheren Schreibweisen auch etwas formaler zusammengefasst:
Tabelle (spalte1, spalte2, spalte3, ...)
und daraus die Tabelle Personen, dargestellt als Menge {...} von n-Tupeln (...), als Teilmenge der Kombintion von Spaltenwerten:
Personen( nachname, vorname, pcode ) = { (Mller, Hanne, 23), (Khan, Dschingis, 88), (Schmidt, Lothar, 24), (Kunze, Sieglinde, 101)
An Tabellen knnen Operationen ausgefhrt werden, und in den Operationen werden unterschieden: unre oder monadische Operatoren, die nur auf eine Tabelle, und binre oder dyadische Operatoren, die auf zwei Tabellen einwirken.
Das Ergebnis aller auf Tabellen ausgefhrter Operationen sind selbst wieder Tabellen (Abgeschlossenheitseigenschaft der Tabellen). Auf Resultattabellen von Operationen sind wiederum Operationen ausfhrbar etc. Operationen knnen also nach Belieben verschachtelt werden.
A.2
Tabellen drfen nicht isoliert betrachtet werden, denn zwischen ihnen bestehen gewhnlich Beziehungen oder Assoziationen. So gehren in Abb. 1-2 die beiden Zeilen kcode=2 und kcode=4 in der Tabelle Kurse zu der Zeile mit dcode=3 in der Tabelle Dozenten. Zu einer Zeile in Dozenten knnen also grundstzlich keine (dcode=27) oder eine (dcode=5) oder 2 oder allgemein N Zeilen in Kurse gehren. Man sagt, dass zwischen den beiden Tabellen eine Beziehung des Typs 1:N bzw. eine 1:N-Beziehung besteht. Eine Sammlung von Tabellen wird erst durch solche Beziehungen zwischen den Tabellen zur relationalen Datenbank, und auf derartigen Beziehungen zwischen Tabellen baut insbesondere die noch zu besprechende Tabellenoperation Join (Abschnitt 2.5) auf. Dozenten
dcode 2 3 4 5 9 10 27 nachname Leutner Gernhardt Weizenbaum Duffing Mergel Ludwig vorname Brigitte Wolfgang Josephine Julienne Brries Luigi
Kurse
kcode dcode 1 2 3 4 5 10 3 2 3 5 bezeichnung Objektorientierte JavaScript JDBC HTML datum 27.04.98 29.06.98 30.06.98 13.07.98
GUI-Programmie 09.06.98
Meyer-Bricke Julius
Die Beziehungstypen im einzelnen sind: die 1:1-Beziehung: jedem Dozenten ist genau ein Bankkonto zugeordnet.
Dozenten 1 1 Bankkonten
die 1:N-Beziehung: ein Dozent leitet mehrere Kurse, und jeder Kurs wird von hchstens einem bzw. genau einem Dozenten geleitet.
Dozenten 1 N Kurse
die N:M-Beziehung: eine Person nimmt teil an mehreren Kursen, und an einem Kurs knnen mehrere Personen teilnehmen.
Personen N M Kurse
Das Ergebnis von N:M-Beziehungen zwischen Tabellen ist nicht direkt in Tabellenform darstellbar. Sie mssen daher unter Zwischenschaltung einer weiteren, assoziativen Tabelle in zwei 1:N-Beziehungen nach dem folgendem Vorgehensmuster aufgelst werden: Eine Person kann mehrmals Kursteilnehmer sein, und fr einen Kurs knnen mehrere Teilnehmer gebucht haben. In der Musterdatenbank Kurse ist es das die assoziative Tabelle Teilnehmer, die, wie im folgenden Bild gezeigt, die N:M-Beziehung zwischen Kurse und Dozenten
Personen N M Kurse
Personen
Teilnehmer
Kurse
Beim Entwerfen einer relationalen Datenbank werden also zum einen die Daten kategorisiert und in Tabellen gesammelt und zum anderen diese Tabellen zueinander in Beziehung gesetzt, wobei auch die Typen all dieser Beziehungen festgelegt werden mssen. Dieses Vorgehen ist Bestandteil des so genannten Datenmodellierungsprozesses.
A.3
Zwei Mglichkeiten, Tabellen zu bearbeiten, bieten sich unmittelbar an, nmlich das zeilenweise und das spaltenweise Auswhlen von Werten. Die entsprechenden Operationen auf eine Tabelle heien Projektion fr die Spaltenwahl und Selektion bzw. Restriktion fr die Auswahl von Zeilen. Beide wirken jeweils auf eine Tabelle, sind also so genannte unre oder monadische Operationen. Das Ergebnis sind wiederum Tabellen. In den drei folgenden Abschnitten sollen aus der untenstehenden Tabelle Personen beispielhaft ausgewhlt werden: die beiden Spalten nachname und pcode (A.3.1); die Zeilen mit allen Werten von nachname, die mit "K" beginnen (A.3.2); die Spalte vorname und daraus nur diejenigen Zeilen, in denen die Werte von nachname gleich "Khan" sind (A.3.3).
nachname Mller Khan Schmidt Kunze vorname Hanne Dschingis Lothar Sieglinde pcode 23 88 24 101
A.3.1
Projektion
Durch Projektion einer Tabelle wird aus den vorhandenen Spalten ausgewhlt. Das Resultat ist wiederum eine Tabelle, die im Allgemeinen weniger Spalten als die ursprngliche hat. Im folgenden Beispiel wird so aus der Tabelle Personen mit den drei Spalten nachname, vorname und pcode durch Projektion eine Tabelle mit den beiden Spalten nachname und pcode erzeugt.
nachname Mller Khan Schmidt Kunze Abb. 1-3: Projektion vorname Hanne Dschingis Lothar Sieglinde pcode 23 88 24 101 nachname Mller Khan Schmidt Kunze pcode 23 88 24 101
In der Datenbanksprache SQL hat diese Operation den Namen SELECT. SELECT leitet in SQL aber auerdem eine ganze Klasse von Ausdrcken ein, die alle eine Auswahl in einer oder mehreren verknpften Tabellen bewirken (Query oder Abfrage), ist also sowohl das Schlsselwort fr Abfragen als auch der Name des Projektionsoperators. Die SQL-Anweisung fr die im Bild gezeigte Projektion ist: SELECT nachname, pcode whle die Spalten nachname und pcode aus der Tabelle Personen FROM Personen Viele der geschilderten und in diesem Kapitel noch zu schildernden Sachverhalte lassen sich mit SQL einfach und przise darstellen. Dazu wird nur eine kleine Untermenge von SQL bentigt. Aus diesem Grunde wird im Vorgriff auf Abschnitt A.7 und folgende diese Untermenge, im wesentlichen die SELECT-Anweisung in ihren einfachsten Varianten bereits hier eingefhrt. Man kann in der Regel eine SQL-Anweisung mittels Leerstellen und Zeilenumbrchen freizgig formatieren, d.h. die beiden folgenden Schreibweisen sind mit der vorangehenden vllig gleichwertig:
SELECT nachname, pcode FROM Personen SELECT nachname, pcode FROM Personen
A.3.2
Selektion
Selektion in einer Tabelle bewirkt die Auswahl von Zeilen. Das Resultat ist wiederum eine Tabelle, die hchstens gleich viele, in der Regel aber weniger Zeilen hat als die ursprngliche. Im Beispiel wird so aus der vierzeiligen Tabelle Personen durch Selektion eine Tabelle mit nur zwei Zeilen.
A.4 Tabellen verbinden: Die Join-Operation nachname Mller Khan Schmidt Kunze vorname Hanne Dschingis Lothar Sieglinde pcode 23 88 24 101 nachname Khan Kunze vorname Dschingis Sieglinde pcode 88 101
Die dem Bild entsprechende SQL-Anweisung lautet: RDBMS und SQL nachname fngt mit K an Die Tabelle Personen wird mit SELECT * FROM Personen also erst auf sich selbst projiziert, und aus dieser Tabelle werden dann mittels WHERE diejenigen Zeilen selektiert, in denen jeweils der entsprechende Wert in der Spalte nachname mit dem Buchstaben K beginnt (LIKE 'K%'). Man beachte, dass in SQL-Strings als Joker das Prozentzeichen % und nicht der sonst blichere Asteriskus * verwendet wird.
SELECT * FROM Personen WHERE nachname LIKE 'K%'
A.3.3
Die Kombination von Selektion und Projektion in SQL entsprechend dem folgenden Bild sollte keine Schwierigkeiten mehr bereiten. Im wesentlichen muss nur der Asteriskus nach SELECT durch eine Spaltenliste ersetzt werden, um eine entsprechend reduzierte Tabelle zu erhalten.
nachname Mller Khan Schmidt vorname Hanne Dschingis Lothar pcode 23 88 24 101 vorname Dschingis
Kunze Sieglinde Abb. 1-5: Selektion und Projektion SELECT vorname FROM Personen WHERE nachname LIKE 'Khan'
A.4
A.4.1
hnlich wie die Zeilen einer Tabelle als Kombination von Spaltenwerten darstellbar sind, kann das Resultat von Join-Operationen als Kombination von Tabellenzeilen aller beteiligten Tabellen beschrieben werden. Die Kombination wird durch Selektion gesteuert,
also durch Abhngigkeiten von Spalten der beteiligten Tabellen untereinander, beispielsweise ber die WHERE-Klausel. In der berwiegenden Zahl der Flle werden Tabellen ber gleiche Spaltenwerte zusammengefgt. Dazu ein Beispiel in SQL (dem man zugleich entnehmen kann, wie gleiche Spaltenbezeichnungen in unterschiedlichen Tabellen durch Qualifizieren mit dem Tabellennamen unterschieden werden):
SELECT * FROM Kurse, Dozenten WHERE Kurse.dcode = Dozenten.dcode
Die beiden Tabellen Kurse und Dozenten werden in allen folgenden Beispielen verwendet und daher in der folgenden Abb. 1-6 einleitend vorgestellt. Dozenten
dcode 2 3 4 5 9 10 27 nachname Leutner Gernhardt Weizenbaum Duffing Mergel Ludwig vorname Brigitte Wolfgang Josephine Julienne Brries Luigi
Kurse
kcode dcode 1 2 3 4 5 10 3 2 3 5 bezeichnung Objektorientierte JavaScript JDBC HTML datum 27.04.98 29.06.98 30.06.98 13.07.98
GUI-Programmie 09.06.98
Meyer-Bricke Julius
Die obenstehende SQL-Anweisung, die auf diese beiden Tabellen angewandt wird, hat als Resultat diese Tabelle:
Kurse. Kurse. kcode bezeichnung 3 2 4 5 1 JDBC JavaScript HTML GUI-Programmierung Objektorientierte Progra Kurse. datum 30.06.98 29.06.98 13.07.98 09.06.98 27.04.98 Kurse. dcode 2 3 3 5 10 Dozenten. Dozenten. dcode nachname 2 3 3 5 10 Leutner Gernhardt Gernhardt Duffing Ludwig Dozenten. vorname Brigitte Wolfgang Wolfgang Julienne Luigi
Die Operation verbindet die beiden Tabellen zu einer einzigen Tabelle und trgt daher die Bezeichnung Join. In die SQL-Anweisung kann noch eine Projektion einbezogen werden, mit der berflssige oder unerwnschte Spalten eliminiert werden knnen:
SELECT Kurse.datum, Dozenten.nachname, Dozenten.vorname, Kurse.bezeichnung FROM Kurse, Dozenten WHERE Kurse.dcode = Dozenten.dcode
Die Join-Operation hat eine Vielzahl von Varianten, weil unterschiedliche Spaltenkombinationen projiziert werden knnen und vom Gleichheitsoperator abweichende Operatoren in der WHERE-Klausel mglich sind. Fr einige dieser Varianten haben sich feste Bezeichnungen eingebrgert. Diese Varianten sind in Form von beispielhaften SQL-Anweisungen im Folgenden zusammengestellt. Jede Variante ist auerdem mit einem Beispiel veranschaulicht, das die beiden am Anfang des Abschnittes gezeigten Tabellen Kurse und Dozenten als Grundlage hat.
A.4.2
Theta-Join
Zusammenfgen ber gleiche Spaltenwerte ist zwar die hufigste, aber nicht die einzige Art, Tabellen zu verknpfen. Spaltenwerte knnen auch ber beliebige andere Bedingungsoperatoren zueinander in Beziehung gesetzt werden. Darauf beruhende Operationen werden als Theta- oder -Join bezeichnet, wobei Theta bzw. beliebige Bedingungsoperatoren symbolisieren.
SELECT * FROM Personen, Dozenten WHERE Personen.nachname Dozenten.nachname
10
Die Ergebnistabelle verfgt ber alle Spalten der beteiligten Tabellen, verbindet aber nur diejenigen Zeilen, in denen die Werte der beiden Spalten Personen.nachname und Dozenten.nachname ungleich sind. (Bei numerischen Werten wrde der Ungleichheitsoperator != an die Stelle von NOT LIKE gesetzt werden.)
A.4.3
Equi Join
Equi Join ist ein -Join mit dem Gleichheitszeichen an der Stelle von bei Zahlen oder LIKE bei Strings, z.B.
SELECT * FROM Dozenten, Kurse WHERE Kurse.dcode = Dozenten.dcode
Das Resultat besteht aus allen Spalten der beteiligten Tabellen, also auch den beiden inhaltlich gleichen Spalten, die in der WHERE-Klausel verwendet sind. Das gleiche Ergebnis erhlt man auch bei Verwendung des INNER JOIN-Operators, den allerdings nicht jedes Datenbanksystem kennt (Access kennt ihn, Oracle dagegen nicht):
SELECT * FROM Dozenten INNER JOIN Kurse ON Dozenten.dcode = Kurse.dcode;
A.4.4
Natural Join
SELECT nachname, vorname, Kurse.* FROM Dozenten, Kurse WHERE Kurse.dcode = Dozenten.dcode
Ein Natural Join hnelt dem Equi Join, das Resultat beinhaltet aber nur eine der in der WHERE-Klausel angegebenen Spalten (Kurse.dcode und Dozenten.dcode haben identische Werte, d.h. eine der beiden Spalten ist berflssig und wird weggelassen). Dies wird sozusagen als die natrliche Weise angesehen, wie Tabellen zu verbinden sind. Das Ergebnis der Operation ist die folgende Tabelle:
A.4 Tabellen verbinden: Die Join-Operation Dozenten. nachname Leutner Gernhardt Gernhardt Duffing Ludwig Dozenten. vorname Brigitte Wolfgang Wolfgang Julienne Luigi Kurse. kcode 3 2 4 5 1 dcode 2 3 3 5 10 JDBC JavaScript HTML GUI-Programmierung mit Java Objektorientierte Programmierung m Kurse. bezeichnung
11
Kurse. datum 30.06.98 29.06.98 13.07.98 09.06.98 27.04.98
A.4.5
Outer Join
Outer Join ist wie alle Joins eine binre oder dyadische Operation, mittels derer alle Zeilen der einen Tabelle mit einer passenden Auswahl von Zeilen der anderen Tabelle verbunden werden. Dabei kann es geschehen, dass zu Tabellenzeilen keine Entsprechungen in der anderen Tabelle existieren, also Lcken entstehen. Solche Lcken werden in der Resultattabelle mit Nullwerten aufgefllt. Nullwerte zeigen an, dass ein Wert fehlt. Die Syntax ist
... linkeTabelle XXX [OUTER] JOIN rechteTabelle ON bedingung XXX kann den Wert LEFT oder RIGHT haben. Mit OUTER kann optional ein Outer Join deutlich symbolisiert werden, ohne irgendwelche sonstigen Wirkungen zu haben. LEFT und RIGHT geben an, welche der Tabellen als Ganzes verwendet wird, nmlich die von der linken Seite des Operators bei LEFT und die von der rechten Seite bei RIGHT. Im fol-
genden Beispiel
SELECT * FROM Dozenten LEFT [OUTER] JOIN Kurse ON Dozenten.dcode=Kurse.dcode
besteht das Ergebnis also aus allen Zeilen der links stehenden Tabelle Dozenten verbunden nur mit den Zeilen der rechts stehenden Tabelle Kurse, fr die die Bedingung in der ON-Klausel zutrifft. Genau das gleiche Ergebnis erhlt man, wenn LEFT durch RIGHT ersetzt und auerdem Kurse und Dozenten vertauscht werden:
SELECT * FROM Kurse RIGHT [OUTER] JOIN Dozenten ON Kurse.dcode=Dozenten.dcode
Die Resultattabelle enthlt alle Zeilen der rechts stehenden Tabelle Dozenten und nur die Zeilen der links stehenden Tabelle Kurse, fr die die Bedingung in der ON-Klausel zutrifft. Der folgende SQL-Ausdruck zeigt, dass ein Outer Join auch durch Vereinigung (UNION) zweier getrennt berechneter Tabellen darstellbar ist.
(SELECT * FROM Dozenten, Kurse WHERE Kurse.dcode = Dozenten.dcode) UNION SELECT Dozenten.*, null, null, null, null, null, null FROM Kurse, Dozenten WHERE Dozenten.dcode NOT IN (SELECT dcode FROM Kurse)
12
null steht als Symbol fr typgerechte Nullwerte. Outer Join ist also keine elementare Operation wie etwa Equi Join bzw. Natural Join, sondern dient lediglich einer vereinfachten Schreibweise fr eine hufig bentigte Operation. In den folgenden beiden Beispielen sind ein LEFT JOIN und ein RIGHT JOIN gezeigt. Als erstes Beispiel wird in Abb. 1-10 das Ergebnis des folgenden SQL-Ausdrucks fr LEFT JOIN angezeigt: SELECT * FROM Dozenten LEFT JOIN Kurse ON Dozenten.dcode=Kurse.dcode
Dozenten. dcode 2 3 3 4 5 9 10 27 Dozenten. nachname Leutner Gernhardt Gernhardt Weizenbaum Duffing Mergel Ludwig Meyer-Bricke Dozenten. vorname Brigitte Wolfgang Wolfgang Josephine Julienne Brries Luigi Julius Kurse. kcode 3 2 4 5 1 Kurse. dcode 2 3 3 5 10 Kurse. bezeichnung JDBC JavaScript HTML Kurse. datum 30.06.98 29.06.98 13.07.98
Im zweiten Beispiel ist LEFT JOIN durch RIGHT JOIN ersetzt, das Ergebnis dafr ist in Abb. 1-11 zu sehen:
SELECT * FROM Dozenten RIGHT JOIN Kurse ON Dozenten.dcode=Kurse.dcode
Dozenten. dcode 2 3 3 5 10 Dozenten. nachname Leutner Gernhardt Gernhardt Duffing Ludwig Dozenten. vorname Brigitte Wolfgang Wolfgang Julienne Luigi Kurse. kcode 3 2 4 5 1 Kurse. dcode 2 3 3 5 10 Kurse. bezeichnung JDBC JavaScript HTML GUI-Programmieru Objektorientierte Pr Kurse. datum 30.06.98 29.06.98 13.07.98 09.06.98 27.04.98
A.4.6
Inner Join
Inner Join entspricht vollstndig dem weiter oben ausgefhrten Equi Join:
SELECT * FROM Dozenten INNER JOIN Kurse ON Dozenten.dcode=Kurse.dcode INNER darf, anders als OUTER, nicht weggelassen werden!
13
A.5
Alle noch fehlenden Tabellenoperationen werden in diesem Abschnitt ihrer Bedeutung entsprechend nur sehr kurz aufgefhrt. Mit Ausnahme der Produktbildung (TIMES) sind diese Operationen allerdings nicht bei allen Datenbanken realisiert.
Produkt (TIMES)
Produktbildung ergibt eine Tabelle, die aus all den Zeilen besteht, die man erhlt, wenn man jede Zeile einer Tabelle mit jeder einer anderen Tabelle kombiniert (so genanntes kartesisches Produkt oder Kreuzprodukt).
A A B C A X Y X Y X Y
X Y
B B C C
So wie bei der Join-Operation ist auch die Produktbildung oft nicht durch einen eigenen Operatornamen gekennzeichnet, sondern wird meist automatisch dann ausgefhrt, wenn in der FROM-Klausel mehr als eine Tabelle angegeben wird. SQL: ... FROM tabellenListe (ohne WHERE-Klausel!) Ein Beispiel dazu: Das Ergebnis des SQL-Ausdrucks
SELECT bezeichnung, nachname FROM Kurse, Dozenten
ist die folgende Tabelle, in der jede Zeile der Tabelle Kurse mit jedem Wert der Tabelle Dozenten kombiniert ist und das Ergebnis auf die Spalten Kurse.bezeichnung sowie Dozenten.nachname projiziert werden:
Kurse.bezeichnung Objektorientierte Programmierung mit Java JavaScript JDBC HTML GUI-Programmierung mit Java Servlets WWW Objektorientierte Programmierung mit Java JDBC ... Dozenten.nachname Weizenbaum Weizenbaum Weizenbaum Weizenbaum Weizenbaum Weizenbaum Weizenbaum Ludwig Ludwig ...
14
Vereinigung (UNION)
Die Vereinigung zweier Tabellen ergibt eine Tabelle, die diejenigen Zeilen der beiden Tabellen enthlt, die zumindest in einer der beiden enthalten sind. Ein Beispiel fr die UNION-Operation ist im Zusammenhang mit Outer Joins in Abschnitt A.4.5 zu finden.
Durchschitt (INTERSECT)
Ergibt eine Tabelle, die aus allen Zeilen besteht, die sowohl in der einen als auch in der anderen Tabelle enthalten sind.
Differenz (EXCEPT)
Differenzbildung aus zwei Tabellen ergibt eine Tabelle mit allen Zeilen, die in der ersten, aber nicht in der zweiten Tabelle enthalten sind.
A.6 Schlssel
15
ihre Werte dem gleichen Wertevorrat, nmlich X, Y, Z in der einen und X, Z in der anderen Spalte. Dividend
A A A B C X Y Z X Y Dividiere durch X Y A
Divisor
Nach Ausfhrung der Division erscheint ein Wert aus der nicht-gemeinsamen Spalte der Dividendentabelle in der Ergebnistabelle nur dann, wenn jedem der Divisorwerte mindestens einmal dieser Wert zugeordnet ist.
A.6
Schlssel
Eine wichtige Eigenschaft einer Datenbanktabelle ist Eindutigkeit, d.h. dass keine Zeile mehrfach vorkommt, sich also nicht wiederholt. Ist die Tabelle frei von Wiederholungen, so werden die Zeilen durch die Werte von mindestens einer Spalte und von hchstens allen Spalten der Tabelle eindeutig. Spalten, die alleine fr die Eindeutigkeit der ganzen Zeile sorgen, die Zeile also identifizieren, nennt man Schlssel. Grundstzlich knnen in einer Tabelle unterschiedliche Spalten bzw. Spaltenkombinationen als Kandidaten zur Identifizierung der Zeilen herangezogen werden. Diejenige Spalte oder Spaltenkombination, die konkret zur Identifizierung herangezogen wird, heit Primrschlssel. Ein Primrschlssel ist demnach also eine Spalte (oder eine Spaltengruppe) in einer Tabelle. Er ist alleine hinreichend dafr, dass alle Zeilen eindeutig sind. Es gibt also keine zwei gleichen Schlsselwerte in einer Tabelle mit Primrschlsselspalte(n). Wird ein Schlssel von mehr als einer Spalte reprsentiert, so spricht man auch von einem Kombinations- oder Verbundschlssel. Jede Tabelle kann hchstens einen Primrschlssel haben. (Eine weitere bliche Bezeichnung fr Primrschlssel ist Identifikationsschlssel.) Beispiele fr Primrschlssel sind die Spalte dcode in der Tabelle Dozenten und kcode in Kurse. Sekundrschlssel sind Spalten, ber deren Werte Zeilengruppen eindeutig gekennzeichnet sind. Alle Zeilen einer Gruppe enthalten also gleiche Sekundrschlsselwerte. Eine Tabelle kann mehrere Sekundrschlsselspalten haben. Beispiel: die Spalte typ in der Tabelle Kurse. Fremdschlssel dienen dagegen nicht der Identifikation von Zeilen und Zeilengruppen, sondern sind Zeiger oder Verweise auf Schlssel in anderen Tabellen. In Abb. 1-12 ist dcode in Dozenten ein Primrschlssel, und dcode in Kurse verweist als Fremdschlssel auf die entsprechenden Zeilen in der Tabelle Dozenten.
16 Dozenten
dcode 2 3 4 5 9 10 27 nachname Leutner Gernhardt Weizenbaum Duffing Mergel Ludwig Meyer-Bricke vorname Brigitte Wolfgang Josephine Julienne Brries Luigi Julius
Kurse
kcode 1 2 3 4 5 dcode 10 3 2 3 5 datum 27.04.98 29.06.98 30.06.98 13.07.98 09.06.98 bezeichnung Objektorientiert JavaScript JDBC HTML GUI-Programmi
Primrschlssel
Join-Operationen erfolgen demgem meist ber die Verknpfung von Primr- und Fremdschlsseln, wie bereits in den vorangehenden Beispielen implizit gezeigt wurde.
A.7
SQL-bersicht
SQL ist ein internationaler Standard fr den Zugriff auf relationale Datenbanken. Als Begriff wird SQL oft gleichbedeutend mit Relational verwendet, z.B. SQL-Datenbank fr relationale Datenbank. SQL gibt die adquaten sprachlichen Mittel fr den Umgang mit relationalen Datenbanken an die Hand, weshalb - gewissermaen als Vorgriff - bereits im vorangehenden Kapitel 2 (relationale Datenbanken) SQL zur Beschreibung relationaler Operationen verwendet wurde. Es knnte der Eindruck erweckt werden, dass eine SQL-Anweisung immer dasselbe bewirkt, also beispielsweise die Anwendung von SQL-Anweisungen auf ein und dieselbe Datenbank auf direktem Wege zu den gleichen Ergebnissen fhrt wie ber z.B. Perl und ODBC-Treiber. Das ist nicht immer der Fall, ganz im Gegenteil knnen unterschiedliche Ergebnisse nie ganz ausgeschlossen werden. Weiter ist mangelnde Kompatibilitt der Resultate von SQL-Anweisungen, ausgefhrt in unterschiedlichen Datenbanksystemen, eher Regel als Ausnahme. Zwar ist SQL die syntaktische Grundlage, aber meist in Form irgendeines Dialektes. Auerdem kommen zum Teil erhebliche Abhngigkeiten von der jeweiligen Rechnerplattform hinzu. Allerdings ist SQL Grundlage von fast jedem relationalen DBMS, und die Anpassung an den jeweiligen SQL-Dialekt erfordert in der Regel nur geringen zeitlichen Aufwand. SQL ist eine Sprache, die aus einer Menge von Einrichtungen zur Definition, zum Zugriff und zur anderweitigen Verwaltung von SQL-Daten besteht ([Date 98]). Sie ist eine Entwicklung der Standardisierungsorganisationen ANSI und ISO und wurde 1992 als SQL/2 oder SQL/92 zum International Standard ISO/IEC 9075:1992, Database Language SQL unverndert bernommen als DIN 66315. Der Name der Sprache ist SQL. SQL war die Abkrzung fr Structured Query Language, die ihrerseits aus der Structured
A.7 SQL-bersicht
17
A.7.1
SQL untersttzt die blichen arithmetischen Operatoren +, -, *, / und mod. Beispielsweise lassen sich so aus numerischen Spaltenwerten Zeile fr Zeile Summen, Produkte etc. als errechnete Werte einer neuen, virtuellen Spalte (siehe auch Abschnitt A.7.4) bilden. Welche skalaren Funktionen in einer Datenbank verfgbar sind, wird fr zwei Datenbanksysteme als Beispiele im Folgenden gezeigt, zunchst fr Access Version 8 (ACCESS 3.5 Jet): Numerische Funktionen
ABS,ATAN,CEILING,COS,EXP,FLOOR,LOG,MOD,POWER,RAND, SIGN,SIN,SQRT,TAN
Zeichenkettenfunktionen
ASCII,CHAR,CONCAT,LCASE,LEFT,LENGTH,LOCATE,LOCATE_2, LTRIM,RIGHT,RTRIM,SPACE,SUBSTRING,UCASE
Zeit-/Datumsfunktionen
CURDATE,CURTIME,DAYOFMONTH,DAYOFWEEK,DAYOFYEAR,HOUR, MINUTE,MONTH,NOW,SECOND,WEEK,YEAR
Etwas umfangreicher sind Die Funkionen bei Oracle8 Personal Edition: Numerische Funktionen
ABS, CEIL, COS, COSH, EXP, FLOOR, LN, LOG, MOD, POWER, ROUND, SIGN, SIN, SINH, SQRT, TAN, TANH, TRUNC, AVG, COUNT, GLB, LUB, MAX, MIN, STDDEV, SUM, VARIANCE
Zeichenkettenfunktionen
CHR, INITCAP, LOWER, LPAD, LTRIM, NLS,_INITCAP, NLS,_LOWER, NLS,_UPPER, REPLACE, RPAD, RTRIM, SOUNDEX, SUBSTR, SUBSTRB, TRANSLATE, UPPER, ASCII, INSTR, INSTRB, LENGTH, LENGTHB, NLSSORT, CHARTOROWID, CONVERT, HEXTORAW, RAWTOHEX, ROWIDTOCHAR, TO_CHAR, TO_DATE, TO_LABEL, TO_MULTI_BYTE, TO_NUMBER, TO_SINGLE_BYTE
English Query Language oder SEQUEL der Firma IBM entwickelt wurde (SQL wird deshalb immer noch oft wie SEQUEL ausgesprochen). SQL ist aber mittlerweile ber eine reine Abfragesprache weit hinaus gediehen. Ziel des Kapitels ist, den Einblick in die einfachsten Grundlagen von SQL weiter zu vertiefen. Der Schwerpunkt liegt auf der Handhabung oder Manipulation von SQL-Daten, die insbesondere durch die Anweisungen SELECT, INSERT, UPDATE und DELETE vertreten ist (Abschnitt A.8). Eine weitere wichtige Gruppe von Anweisungen betrifft die Definition der Daten, also das Erzeugen und Manipulieren der Tabellen und Tabellenstrukturen selbst, die kurz in Abschnitt A.9 behandelt werden. Nicht zum SQL-Standard gehrig, aber in kommerziellen DBMS schon lange blich sind gespeicherte Prozeduren (stored procedures), siehe Abschnitt A.7.6.
18 Systemfunktionen
DUMP, GREATEST, GREATEST_LB, LEAST, LEAST_UB, NVL, UID, USER, USERENV, VSIZE
Zeit-/Datumsfunktionen
ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, NEW_TIME, NEXT_DAY, ROUND, SYSDATE, TRUNC
Sonst sei betreffs skalarer Funktionen auf die Literatur ber konkrete Datenbanken und auf Handbcher dazu verwiesen.
A.7.2
Aggregatfunktionen
Aggregate Functions oder Aggregatfunktionen sind Sammelfunktionen wie Summation, Durchschnittsbildung, Maximum- und Minimumbestimmung etc. Man bezeichnet sie gelegentlich auch als Gruppenfunktionen oder statistische Funktionen. Diese Funktionen reduzieren eine Aggregation bzw. Sammlung von Werten auf einen einzigen Wert. SQL stellt eingebaute Aggregatfunktionen wie COUNT() und COUNT(*) zum Abzhlen von Spalten, SUM(), AVG() zum Summieren bzw. Mitteln ber Spalten und MIN(), MAX() zur Bestimmung von Minimum und Maximum in Spalten bereit. Zusammen mit der GROUP BY-Klausel knnen Tabellen damit in Gruppen aufgeteilt werden und innerhalb solcher Gruppierungen Summation, Maximumbestimmung u.a. vorgenommen werden. Beispielsweise liefert
SELECT COUNT(*) FROM Kurse
A.7.3
Cursor
Ein Cursor definiert einen Mechanismus, der erlaubt, eine Tabelle z.B. das Resultat einer Abfrage, Zeile fr Zeile zu durchlaufen; er ist also etwas wie ein beweglicher Zeiger auf die Zeilen einer Tabelle. Cursorprimitive sind Vorwrtsbewegen des Cursors (FETCH in SQL) sowie Anlegen und Schlieen eines Cursors. Cursor spielen auch bei der Datenbankprogrammierung mit PHP oder VBScript/ASP eine wichtige Rolle.
A.7.4
Virtuelle Tabellen
Aus Tabellen eines RDBMS knnen neue Tabellen zusammengestellt werden. Diese virtuellen Tabellen interpretieren gewissermaen die zugrundeliegenden Tabellen aus einem bestimmten Blickwinkel und heien daher auch View, Viewed Table oder Sicht. So erlaubt beispielsweise die virtuelle Tabelle
SELECT nachname, vorname, bezeichnung FROM Dozenten, Kurse WHERE Kurse.dcode=Dozenten.dcode
A.7 SQL-bersicht
19
Virtuelle Tabellen knnen hnlich wie reale Tabellen weiterverarbeitet werden, also z.B. zu Zielen von SQL-Anweisungen werden. Sie knnen virtuelle Spalten beinhalten, das sind Spalten, in denen beispielsweise ber Stckzahl, Einzelpreis und Umsatzsteuer Gesamtpreise zeilenweise bestimmt werden. So sind Abfragen in MS Access solche virtuelle Tabellen, die ber ODBC wie reale Tabellen behandelt werden knnen. Einige Einschrnkungen mssen allerdings beachtet werden. Beispielsweise ist das ndern oder Lschen von Werten in virtuellen Spalten sinnlos und daher unterbunden.
A.7.5
Transaktionen
RDBMS und SQL
Eine SQL-Transaktion ist eine Folge von Operationen. Eine SQL-Transaktion ist unteilbar oder atomar. Die durch eine Transaktion vorgesehenen nderungen werden insgesamt entweder durch COMMIT zur Ausfhrung freigegeben oder insgesamt durch ROLLBACK verworfen. Tritt ein Fehler whrend der Abarbeitung der SQL-Anweisungen einer Tranaktion auf, mssen alle bereits erfolgten nderungen vollstndig rckgngig gemacht werden. nderungen werden erst nach COMMIT wirksam und damit fr andere Transaktionen bzw. Datenbankoperationen sichtbar. Ein Beispiel fr eine Transaktion ist die Buchung von einem auf ein anderes Konto. Die beiden Operationen, Buchen von einem Konto, Buchen des gleichen Betrages auf ein anderes Konto, mssen entweder beide ausgefhrt werden, oder es muss fr beide die Ausfhrung unterbleiben. Sie sind also unteilbar oder atomar in einer Transaktion zusammengefasst.
A.7.6
Ein Mangel des SQL/92-Standards ist, dass benutzerdefinierte Funktionen und Prozeduren nicht enthalten sind. Demgegenber bieten professionelle Datenbankprodukte bereits seit langer Zeit solche Mglichkeiten in Form von gespeicherten Prozeduren (stored procedures) oder Funktionen (stored functions) an. Verallgemeinernd spricht man auch von Persistant Stored Modules oder, abgekrzt, PSM. Persistant beschreibt den Sachverhalt, dass die Module dauerhaft in der Datenbank gespeichert sind. Der Rahmen dafr ist in der Regel ein firmenspezifischer prozeduraler Sprachanteil in SQL, z.B. PL/SQL bei Oracle8 (PL steht fr Procedural Language). Zwei Grnde sind es im wesentlichen, die zu diesen Konstrukten fhrten. Zum einen wird damit die konventionelle strukturierte Programmiermethodik erschlossen, und zum zweiten kann die Effizienz von Datenbankoperationen erheblich verbessert werden. Letzteres wird sofort einsichtig, wenn man bedenkt, dass z.B. die Datenbankfunktionen in ASP/ ADO auf call level arbeiten. Jede SQL-Anweisung wird einzeln an die Datenbank versandt, dort ausgefhrt und das Ergebnis zurckgeschickt, gegebenenfalls ber das Internet. Mit PSM ist es mglich, Anweisungen und Ergebnisse zu blocken, mit entsprechend positiven Auswirkungen auf die Effizienz.
20
Auch hierzu ein Beispiel zur Illustration, und zwar fr eine Oracle8-Datenbank: Im unten stehenden Programm ist zunchst die gespeicherte Prozedur Zaehle in PL/SQL (Oracle Datenbank) angegeben. Als erstes sind dort der Prozedurname und ein formaler Parameter deklariert. Der Prozedurkrper besteht aus einer einzigen SELECT-Anweisung, mit der in der Tabelle Kurse mittels der Aggregatfunktion COUNT(*) alle Datenstze abgezhlt werden und das Ergebnis per INTO aus ber den OUT-Parameter aus an die aufrufende Instanz, etwa an ein VBScript- oder Perl-Programm, zurckgegeben wird.
-- Gespeicherte Oracle8-Prozedur PROCEDURE Zaehle (aus OUT INTEGER) IS BEGIN SELECT COUNT(*) INTO aus FROM Kurse; END;
A.8
SELECT INSERT UPDATE DELETE
Datenmanipulation
Aus einer oder mehreren Tabellen eine neue Tabelle zusammenstellen. Einfgen von neuen Zeilen in eine Tabelle. ndern von Zeilen in einer Tabelle. Lschen einer oder mehrerer Zeilen in einer Tabelle.
In der Regel knnen nur an echten Tabellen nderungen vorgenommen werden (also nicht ohne weiteres an virtuellen Tabellen oder Views!).
A.8.1
SELECT
Mit der SELECT-Anweisung knnen Tabellen reale und virtuelle! zu neuen Tabellen zusammengestellt werden. Dabei sind die verwendeten Tabellen das Rohmaterial, aus dem Zeilen und Spalten ausgewhlt, die unterschiedlichen Tabellenoperationen wie Join und Union angewandt und neue, virtuelle Spalten berechnet werden knnen. Die SELECT-Anweisung hat die folgende Syntax:
SELECT [ALL | DISTINCT] spaltenListe FROM TabellenListe [WHERE bedingungsAusdruck] [GROUP BY spaltenListe [HAVING bedingungsAusdruck] ] [ORDER BY spaltenListe]
21
kann weggelassen werden; Alternative, d.h. entweder der linksseitige oder der rechtsseitige Teil wird verwendet.
definiert die Spalten in den Tabellen, aus denen ausgewhlt werden soll.
SELECT * FROM Tabelle1
ergibt dagegen eine Tabelle mit nur zwei Spalten aus Tabelle1 (insofern hat das Schlsselwort SELECT zustzlich den Charakter einer so genannten Klausel, hier im Sinne einer Einschrnkung). Werden zwei (oder mehr) Tabellen in der FROM-Klausel angegeben, so wird aus diesen das kartesische oder Kreuzprodukt gebildet (TIMES-Operation), d.h. jede Zeile der einen Tabelle wird mit jeder Zeile der anderen kombiniert. (Bei mehr als zwei Tabellen wird analog die Zeilen aller Tabellen kombiniert.) Zu sinnvollen Ergebnissen kommt man allerdings erst durch Hinzunahme der WHERE-Klausel, also durch Untermengenbildung bzw. Selektion. Beispiele: SELECT * Ergibt die Tabelle Kurse selbst
FROM Kurse SELECT datum, bezeichnung Die Resultattabelle besteht nur aus den FROM Kurse Spalten datum und bezeichnung (Projektion).
Die neue Tabelle ist die zeilenweise Kombination aus den Tabellen Kurse und Dozenten. SELECT kann als Postfix ALL oder DISTINCT haben: DISTINCT heit, dass bei gleichlautenden Zeilen nur eine in die neue Tabelle aufgenommen wird, und ALL heit, dass alle Zeilen bercksichtigt werden, es also zu Wiederholungen kommen kann. ALL ist als Standardeinstellung wirksam fr den Fall, dass es als Postfix weggelassen wird.
SELECT * FROM Kurse, Dozenten X Y Y Y 1 2 3 2 SELECT DISTINCT X Y Y 1 2 3
22
X Y Y Y 1 2 3 2 SELECT [ALL]
X Y Y Y
1 2 3 2
Bei der Einbeziehung eines Primrschlssels (siehe 2.7) in die Ergebnistabelle sind ALL und DISTINCT berflssig, weil wirkungslos.
Die WHERE-Klausel
Mit so genannten Klauseln knnen Regeln und Einschrnkungen fr SQL-Ausdrcke festgelegt werden. So werden mit der WHERE-Klausel Zeilen aus der Ergebnistabelle von SELECT...FROM... ausgesondert, d.h. WHERE reprsentiert die Selektions-Operation:
... WHERE bedingungsAusdruck
Bedingungsausdrcke sind von booleschem Typ und entsprechend entweder wahr (TRUE) oder falsch (FALSE). In den beiden folgenden Beispielen finden sich einfache Bedingungsausdrcke fr die Tabellen Teilnehmer und Personen ('L%' bezeichnet alles, was mit dem Buchstaben L beginnt):
SELECT * FROM Teilnehmer WHERE kcode = 10 SELECT * FROM Personen WHERE nachname LIKE 'L%'
Man beachte, dass der Gleichheitsoperator unterschiedlich ist fr Zahlen (=) und Zeichenketten (LIKE). In einem weiteren Beispiel wird aus den Tabellen Kurse und Dozenten eine Verbundtabelle gebildet, und in dieser Tabelle eine Selektion durch Gleichheit von Primrschlssel dcode in Dozenten und Fremdschlssel dcode in Kurse vorgenommen (zu Schlsseln siehe Abschnitt Kapitel A.6):
SELECT * FROM Kurse, Dozenten WHERE Kurse.dcode = Dozenten.dcode
Dem Beispiel ist auch zu entnehmen, dass Felder gleichen Namens aber aus unterschiedlichen Tabellen dadurch unterscheidbar werden, indem sie mit ihrem Tabellennamen qualifiziert werden. Danach ist Kurse.dcode die Spalte dcode in der Tabelle Kurse (Fremdschlssel) und Dozenten.dcode die Spalte dcode in der Tabelle Dozenten (Primrschlssel). Natrlich sind auch komplexere Ausdrcke durch Gebrauch logischer Operatoren mglich:
SELECT * FROM Kurse, Dozenten WHERE Kurse.dcode = Dozenten.dcode AND nachname LIKE '_e%' OR nachname LIKE '_u%'
Das Zeichen _ ist Stellvertreter fr ein beliebiges Einzelzeichen, d.h. '_e%' bezeichnet alle Strings mit e als Zeichen in der zweiten Zeichenposition. Oder mit Klammersetzung:
A.8 Datenmanipulation
SELECT * FROM Kurse, Dozenten WHERE Kurse.dcode = Dozenten.dcode AND (nachname LIKE '_e%' OR nachname LIKE '_u%')
23
Zu beachten ist, dass das Setzen oder Weglassen von Klammern wegen der unterschiedlichen Rangigkeit der Operatoren in der Regel unterschiedliche Ergebnisse zur Folge hat.
Bedingungsoperatoren
Bedingungsoperationen ergeben immer die Werte TRUE oder FALSE. Es gibt unre, binre und ternre Bedingungsoperatoren. Die unren werden als Prfix oder Postfix vor bzw. nach ihrem Operanden notiert, die binren als Infix zwischen zwei Operanden. Dazu jeweils ein Beispiel: Infix: Prfix: Postfix:
Nachname LIKE 'Meyer' (a > min) AND (a < max) NOT (a <> b) (x > y) IS TRUE
Ternr ist der BETWEEN-AND-Operator, der mit dem von C oder Java her bekannten Bedingungsoperator ?: formal verglichen werden kann:
x BETWEEN min AND max
Im Folgenden sind summarisch die wichtigsten unren und binren SQL-Bedingungsoperatoren aufgefhrt: Die binren Operatoren AND, OR und die unren Operatoren NOT, IS TRUE, IS FALSE, IS NOT TRUE und IS NOT FALSE, die auf Bedingungsausdrcke als Operanden wirken. Die elementaren binren Vergleichsoperatoren, die gleichfalls auf beliebige Ausdrcke wirken knnen:
= < > <= >= <>
Auf Typkompatibilitt der Operanden muss geachtet werden, d.h. eine Zeichenkette kann z.B. nicht mit einer Zahl verglichen werden. LIKE und NOT LIKE zum Vergleich von Zeichenketten. Wild Card- oder Jokerzeichen in Zeichenketten sind % fr eine beliebige Zeichenkette und _ fr ein beliebiges einzelnes Zeichen (also nicht die sonst blicheren Zeichen * und ?). IN und NOT IN zur Prfung, ob ein Spaltenwert in einer Tabelle enthalten ist oder nicht. UNIQUE zur Prfung, ob eine Zeile in einer Tabelle eindeutig ist. EXISTS, ob eine Tabelle existiert (eine Tabelle mit 0 Zeilen ist in SQL nicht existent).
Welche Operatoren vor welchen Vorrang haben, ist hnlich wie in Java oder anderen Programmiersprachen wie Perl und VBScript geregelt.
24
Aggregatfunktionen
Aggregatfunktionen in SQL sind: COUNT(spalte) Zhlt die Zeilen in der Spalte spalte ab, nachdem Dubletten optional entfernt wurden (zu optional siehe weiter unten). COUNT(*) Zhlt alle Zeilen ab; eventuelle Dubletten sind nicht entfernbar. SUM(spalte) Spaltensumme nach optionaler Entfernung von Dubletten. MIN(spalte) Bestimmt den kleinsten Wert in der Spalte spalte. MAX(spalte) Bestimmt den grten Wert in der Spalte spalte. AVG(spalte) Mittelt die Werte der Spalte spalte nach optionaler Entfernung von Dubletten. An die Stelle des Wertes spalte kann ein Ausdruck treten. Solche Ausdrcke mssen wie der Wert spalte von skalarem Datentyp sein, d.h. in SQL also entweder vom Typ einer Zeichen- bzw. Bitkette oder einer Zahl. Bei einigen Datenbanksystemen, z.B. Oracle8, knnen in den Parameterklammern der Funktionen ber das Prfix DISTINCT vor spalte eventuelle Dubletten vor der Funktionsausfhrung entfernt werden. Dagegen zhlt COUNT(*) immer alle Zeilen, DISTINCT darf nicht vor den Asteriskus gestellt werden. Bei MIN und MAX ist DISTINCT erlaubt, aber wirkungslos. Ein Beispiel fr die COUNT-Funktion, angewandt auf die Spalte typ in der Tabelle Kurse: SELECT COUNT(typ) FROM Kurse ergibt 6 und SELECT COUNT(DISTINCT typ) FROM Kurse ergibt 3 Aggregatfunktionen knnen nur in der SELECT- und in der HAVING-Klausel verwendet werden. Von besonderem Interesse ist ihr Zusammenspiel mit der GROUP BY-Klausel. Beispiele dazu finden sich in den folgenden Abstzen. Wenn eine SELECT-Anweisung keine GROUP BY-Klausel hat, so wirken die Aggregatfunktionen auf alle Zeilen einer Tabelle.
Abb. 1-15: Tabelle Kurse mit den Sekundrschlsseln typ, dcode und zeit
A.8 Datenmanipulation
25
Eine Tabelle, die nur noch die Gliederungsbegriffe selbst beinhaltet (bei typ die unterschiedlichen Buchstaben), erhlt man mit der folgenden SQL-Anweisung:
SELECT DISTINCT typ FROM Kurse
Statt der Verwendung von DISTINCT nach der SELECT-Klausel kann man auch die GROUP BY-Klausel verwenden, das Ergebnis ist das Gleiche:
SELECT typ FROM Kurse GROUP BY typ
Die zweite Form hat gegenber der ersten den Vorzug, dass beispielsweise die verschiedenen Gruppen abgezhlt werden knnen oder dass in den Gruppen einzeln summiert werden kann (in der ersten Form ist das nicht mglich). Das ist in der folgenden SQL-Anweisung getan:
SELECT typ, COUNT(typ) AS Anzahl, MIN(zeit) AS MinZeit, MAX(zeit) AS MaxZeit FROM Kurse GROUP BY typ
Das Ergebnis dieser Anweisung ist die Tabelle in der folgenden Abb. 1-16:
typ P S V Anzahl 2 3 1 MinZeit 7,5 5 7,5 MaxZeit 10 7,5 7,5
Das Beispiel zeigt auch, wie man zustzliche, errechnete Spalten hinzufgen und mittels des Sprachelements AS benennen kann. Wenn mehrere Spalten in der GROUP BY-Klausel angegeben werden, so wird hierarchisch gruppiert. Die erste Spalte ist dann die Hauptgruppe. Innerhalb der Hauptgruppe wird in den einzelnen Gruppierungen jeweils nach der 2. Spalte gruppiert etc. Im Beispiel ist das anhand einer Tabelle gezeigt, in der Ergebnisse (gewonnen, verloren, remis) fr jeden Einzelspieler (spieler) einer Mannschaft (team) Spiel fr Spiel festgehalten sind.
26 Spiele
team A A A B A B B B A spieler 1 1 1 1 2 1 2 2 2 1 1 gewonnen 1 1 1
verloren
remis
spielnr 1 62 3 4
1 1 1 1
5 6 7 8 9
Die Tabelle wird so ausgewertet, dass in einer Tabelle gruppenweise fr jeden Spieler die Anzahl der gewonnenen, verlorenen und unentschiedenen Spiele berechnet wird. Dies leistet die folgende SQL-Anweisung:
SELECT team, spieler, SUM(gewonnen) AS gewonneneSpiele, SUM(verloren) AS verloreneSpiele, SUM(remis) AS unentschiedeneSpiele FROM Spiele GROUP BY team, spieler;
Die HAVING-Klausel erlaubt eine Auswahl von ganzen Zeilengruppen, vergleichbar mit der WHERE-Klausel, die die Auswahl auf Zeilenbasis erlaubt. Verwendet werden knnen in der Klausel das Gruppierungsfeld selbst und die Aggregatfunktionen. In Beispielen:
... GROUP BY spalte HAVING spalte LIKE 'A%' ... GROUP BY spalte HAVING COUNT(*) > 4 ... GROUP BY spalte HAVING MIN(spalte) > 0
In einem letzten Schritt wird der SQL-Ausdruck nun noch mit einer HAVING-Klausel ergnzt, so dass nur diejenigen Spieler angezeigt werden, die noch nie ein Spiel gewonnen haben:
A.8 Datenmanipulation
SELECT team, spieler, SUM(gewonnen) AS gewonneneSpiele, SUM(verloren) AS verloreneSpiele, SUM(remis) AS unentschiedeneSpiele FROM Spiele GROUP BY team, spieler HAVING SUM(gewonnen) = 0;
team B spieler 2 gewonnene Spiele verlorene Spiele 2 unentschiedene Spiele
27
Im nchsten Beispiel wird ebenfalls nach nachname alphabetisch sortiert, aber nun absteigend (DESCending) :
SELECT * FROM Personen ORDER BY nachname DESC 24, Schmidt, Lothar 19, Mller, Maria 23, Mller, Hanne 101, Kunze, Sieglinde
Zuletzt wird aufsteigend nach nachname und, bei gleichen Werten von nachname, zustzlich nach vorname sortiert:
SELECT * FROM Personen ORDER BY nachname, vorname 101, Kunze, Sieglinde 23, Mller, Hanne 19, Mller, Maria 24, Schmidt, Lothar
A.8.2
INSERT
Neue Zeilen knnen in eine Tabelle mit der INSERT-Anweisung eingefgt werden. Dabei sind zwei Varianten anwendbar: INSERT INTO ... VALUES ... : In der Zieltabelle wird eine neue Zeile eingefgt und direkt mit den Werten einer Werteliste versehen.
28
Als Beispiel sollen der folgenden Tabelle zwei Zeilen hinzugefgt werden:
pcode 34 88 nachname Hintze Khan vorname Franz Dschingis
Im Beispiel werden alle Dozenten, deren Nachname mit dem Buchstaben M beginnt, in die Tabelle Personen eingefgt.
INSERT INTO Personen (vorname, nachname) SELECT vorname, nachname FROM Dozenten WHERE nachname LIKE 'M%'
A.8 Datenmanipulation
29
A.8.3
DELETE
Mit der DELETE-Anweisung knnen Zeilen aus Tabellen gelscht werden. DELETE ist eine Operation, die auf eine Zeilenmenge wirkt. Die Menge der zu lschenden Zeilen wird mittels der WHERE-Klausel in der DELETE-Anweisung festgelegt. DELETE FROM tabelle [WHERE bedingungen] Als Beispiel sollen in der folgenden Tabelle die vorletzte und letzte Zeile gelscht werden:
pcode 34 88 91 101 nachname Hintze Khan Kaiser Kunze vorname Franz Dschingis Leo Sieglinde
Oder alternativ
DELETE FROM Personen WHERE pcode>=91
pcode 34 88
Achtung! Die Anweisung DELETE FROM Personen hinterlsst eine geleerte Tabelle.
A.8.4
UPDATE
Die UPDATE-Anweisung erlaubt, Werte in den Spalten einer Tabelle zu verndern. Wie DELETE ist auch UPDATE eine Operation, die auf Zeilenmengen einwirkt, d.h. die einschrnkende Anwendung der WHERE-Klausel ist wie bei DELETE von existentieller Wichtigkeit. Nach Angabe der Zieltabelle folgt auf SET eine Wertezuweisungsliste der Form spaltenName1=wert1, spaltenName2=wert2, etc. Wird WHERE weggelassen, so werden alle aufgefhrten Spalten auf einen gleichbleibenden Wert gesetzt. Sonst werden nur diejenigen Zeilen in den Spalten gendert, fr die die Bedingung in der WHERE-Klausel den Wert true hat.
UPDATE Tabelle SET spaltenWerteListe [WHERE bedingungen]
30
pcode 34 88 91 101 Nachname Hintze Khan Kaiser Kunze vorname Franz Dschingis Leo Sieglinde
pcode 34 88 91 101
Die folgende SQL-Anweisung trgt in allen Zeilen als nachname den Wert 'Geiser' ein:
UPDATE Personen SET nachname='Geiser'
pcode 34 88 91 101
A.9
Datendefinition
Mit den SQL-Anweisungen fr die Datendefinition werden insbesondere Tabellen und Tabellenstrukturen erzeugt, gendert und ggf. wieder vernichtet. Die wichtigsten Anweisungen zu diesen Zwecken sind
CREATE TABLE ALTER TABLE DROP TABLE
Eine neue Tabelle anlegen. Die Struktur einer bestehenden Tabelle verndern. Eine Tabelle lschen.
Da das Anlegen von Tabellen bzw. Tabellenstrukturen und deren Pflege selten mit JDBC und meist mit anderen Mitteln erfolgt, sollen die entsprechenden SQL-Anweisungen nur kurz und ausschlielich anhand einfacher Beispiele erlutert werden.
A.10 Literatur
31
A.9.1
CREATE TABLE
Die Struktur einer Tabelle kann durch Hinzufgen neuer und durch nderung des Typs bestehender Spalten manipuliert werden:
A.9.3
DROP TABLE
A.10
Literatur
Date, Chris J.: An Introduction to Database Systems. Addison-Wesley 2000, 7. Auflage, ISBN 0-201-38590-2 Date, Chris J.; Darwen, Hugh: SQL - Der Standard. Addison-Wesley 1998, ISBN 3-8273-1345-7 Rob, Peter; Coronel, Carlos: Database Systems. Design, Implementation, and Management. Course Technology 1999, ISBN 0-7600-1090-0
A.9.2
ALTER TABLE
32
Steiner, Ren: Theorie und Praxis relationaler Datenbanken. Vieweg 1996, ISBN 3-528-25427-0 van der Lans, Rick F.: Introduction to SQL. Addison-Wesley 1994, 3. Auflage, ISBN 0-201-59618-0