Fachbereich Informatik 1 Grundelemente von SQL

Werbung
Oberschule am Elsengrund
- Gymnasium Elsenstraße 9 – 11
12623 Berlin
Tel. / Fax 030 / 56 77 91 7
Fachbereich Informatik
e- mail : informatik @og- elsengrund.cidsnet.de
http://www.og- elsengrund.cidsnet.de
Berlin, 04.08.04
1 Grundelemente von SQL
Die Datenbanks prach e SQL, (Structured Query Language), gesprochen 'es ku eil', wurde als Abfragesprache für Datenba nksy st em e geschaffen und steht in engem Zusam m en h an g mit der Entwicklung des
relationalen Datenm odells in den letzten beiden Dekaden. Die Sprache ist nach den ersten Implementierungen in den frühen achtziger Jahren heute in Standards (1986, 1989, 1992, 1999) definiert und (mit
herstellerabh ängigen Zusätzen) in vielen - auch nichtrelationalen - Datenba nksy ste m e n als Sprachsch nittstelle verfügbar. Der Standard von 1989 wird häufig SQL1, der von 1992 SQL2 genannt und der Standard
von 1999 SQL- 99 oder SQL3.
SQL enthält Eleme nte zur Datendefinition, zur Datenm anipulation und zur Datenzuga ngs k ontrolle.
Man unterscheidet :
- die Sprachanteile DDL (Data Definition Language) zur Definition der Struktur der
Daten und
- die DML (Data Manipulation Language), die die Operationen auf den Daten zur Verfügung
stellt.
Zur Beschreibung der Syntax von SQL wird eine EBNF- ähnliche Notation verwandt. Es werden nur
die wichtigsten Konstruktionen vorgestellt, dabei liegt der Schwerpunkt auf dem SQL- Kern.
1.1 Datendefinition in SQL
Die Sprachant eile zum Generieren und Löschen von Schema definitionen (Datenban ksc he m a, Relationsschemata, Sichten etc.) sind häufig dem Benutzer von Datenbank an w e nd un g e n gar nicht zugänglich und
dem Datenbank ad ministrator vorbehalten.
1.1.1 Schema-Generierung
Zur Erstellung eines Datenban ks che m a s wird in Standard- SQL die Anweisung
CREA T E SCHE M A AUTH O RI Z A TI O N Nutzer
benutzt (zentrale Verwaltung der Datenbanke n durch den DBA), bei Einbettung der Datenba nke n ins
Dateisystem des Nutzers lautet sie:
CREA T E DATA B A S E Datenba nkna m e
Auf der Interpretierer- Schnittstelle eines DB- Systems wird mit der interaktiven Eingabe dieser Anweisung ein Satz leerer Systemtab ellen für die Verwaltung der benannten Datenbank generiert. Auf diese
Schema gen erierung folgen dann (null oder mehr) Tabellengenerierung en, Sichtdefinitionen oder Grantoperationen.
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
Version : /home/ustredak/Datenbanksysteme/grundlagen_sql.sxw
Seite 1
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
1.1.2 Tabellen-Generierung
CREA T E TABL E Tabellenna m e
( Spaltenna m e Datentyp [ NOT NULL — ... ]
{ , Spaltenna m e Datentyp [ NOT NULL — ...]});
Beispiel: (Bücher)
CREA T E TABL E B
( BNr
CHAR(5) NOT NULL,
Autor CHAR(25) ,
Titel CHA R(40) ,
Preis DECI M AL (3) );
Mit dieser Anweisung wird die Struktur einer Basistabelle festgelegt, der im logischen Modell das
Relationssche m a entspricht. Es können zwei wesentlich verschiede ne Arten von Tabellen definiert werden:
–
Basistabellen, die auch physikalisch auf den Festspeicher abgebildet werden, und
–
Sichttabellen (Views), die dynamisch generiert werden. Nur die Metadaten (die Struktur) der Sichten
werden gespeichert. Zur Erzeugun g von Sichten gibt es eine eigene SQL- Anweisung (s.u.).
Innerhalb der Klam m ern der CRE AT E TABLE- Anweisung werden die Tabellenspalten mit Attributnam e
und -typ spezifiziert. Wird NOT NULL angegebe n, muß für jedes Tupel in dieser Spalte auch ein Wert
existieren, dies wird bei der Aufnahme der Tupel in die Tabelle überprüft.
Zur Deklaration der Relationenattribute kann man aus folgenden Datentype n wählen:
Standard:
CHAR [ ( länge ) ]
NUME RI C [ ( stellemahl [ , nachko m m a ] )]
DECI MA L [ ( stellenzahl, nachko m m a ) ]
FLOAT [ ( stellenzahl ) ]
INTE G E R
Beispiel
CHAR (25)
- CHA RA C T E R
NUM E RI C (7,2), NUM E RIC (6),
DECIM A L (6,2)
FLOAT (23)
SMALLINT
DOUB LE PRE CI SIO N
REAL
CHARA C T E R VARYIN G ( länge )
VARC H A R (20)
DAT E
TIME
TIMES T A M P
INTE R V A L
BIT
INTE R V A L YEA R TO MONT H, INTERV A L HOUR TO SECO N D
BIT ( Länge )
BIT (255)
BIT VARYI N G ( länge )
BIT VARYIN G (100)
Hierbei sind stellenzahl und nachkomma die Anzahl der gültigen Stellen und die Anzahl der Nachkommastellen, das Maximu m der Stellenzahl ist implementierungsab hä ngig. Am Ende der Kom m aliste
einer Tabellendefinition werden in Standard- SQL Primärschlüssel bzw. Fremdschlüssel spezifiziert.
Die Gegenstück e zu den Erzeugungso perationen sind die syntaktisch analogen DROP- Anweisun gen
(s.u.).
Seite 2
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
1.1.3 Änderung der Tabellenstruktur
ALTER TABLE Tabellenna m e
[ ADD l DRO P l ALTER | RENA M E ] ( Spaltenna m e Datentyp [ NOT NULL ]
{ ,Spaltenna m e Datentyp [ NOT NULL ] } );
Mit der ALTE R- Anweisung ist es möglich, die Struktur eines Relationssche m a s zu ändern.
1.1.4 Löschen von Strukturen
Eine gesa mte Datenbank als Menge von Relationssche m ata kann (mit Inhalt) mit
DRO P DATA B A S E Datenba nkna m e
gelöscht werden, ein einzelnes Relationssche m a mit
DRO P TABL E Tabellenna m e
Die meisten Implementierun gen enthalten im Sinne eines 'orthogonalen' Sprachdesigns die zu den Erzeugungsan weisun ge n symmetrischen Löschanweis ung en:
DRO P VIE W
DRO P SYNO N Y M
DRO P INDEX
DRO P ASSE R T I O N
DRO P DOM AIN
1.2 Manipulationsanweisungen für Relationen - Einfügen , Lösc hen und Ändern
von Tupelmengen
Nach dem Standard werden Tupel mit folgender Operation in eine Tabelle eingetrage n:
INSERT INTO Tabellennam e [ ( Komm aliste der Spalten ) ]
VALUE S ( Liste der Werte ) | SELE CT - Anweisung
Mit dem Schlüsselwort VALUE S können einzelne Zeilen eingefügt werden. Durch die SELECT - Anweisung
(s.u.) wird das Anfrageergeb nis in die Tabelle überno m m e n .
Beispiel:
INSERT INTO E VALUE S ("El","Schmidt","Steglitz")
INSERT INTO E VALUE S ("E2","Meier","Span da u")
INSERT INTO TEMP (BNR, Autor,Verlag)
SELECT B.BNR, B.Autor, B.Verlag
FRO M B
WHE R E B.Preis < 60
Die zu INSER T symmetrische Löschoperation ist
DELE T E
FRO M Tabellenna m e
[ WHE RE Suchbedingung ]
Läßt man die WHE R E- Klausel weg, so werden alle Zeilen gelöscht; sonst nur solche, die die Suchbedingung erfüllen.
Seite 3
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
Um einzelne Spaltenwerte zu verändern, eine Anforderung, die in Anwen dung en häufig ausgeführt
werden muß, verwendet man die UPDAT E- Operation:
UPDA T E Tabellenna m e
SET Spaltennam e = Ausdruck
{ , Spaltenna m e = Ausdruck}
[ WHE RE Suchbedingung ]
Beispiel: Zehnprozentige Preiserhöhung aller Bücher aus dem Verlag Addison- Wesley:
UPDA T E B
SET B.Preis = B.Preis*1.10
WHER E B.Verlag = "Addison- Wesley"
Nahezu alle DBMS bieten in ihren SQL- Implementationen eine Operation oder ein Dienstprogram m
an, um aus (ggf. unterschiedlich formatierten) Dateien Daten in bereits erzeugte Relationssche m at a zu
überneh m en . Diese Anweisung trägt meist den Namen COP Y, die Syntax ist z.T. unterschiedlich. Beispiel
PostgreS Q L:
COPY Tabellenna m e FRO M 'Dateina m e' [ DELI MIT E R ] Zeichen
Mit dieser Anweisung können die Tabellenwerte aus einer Datei importiert werden. Jede Zeile in der
Datei entspricht einer Zeile in der Tabelle (einem Tupel). Die Daten in der Datei müssen in Typ und
Format den Spaltenattributtypen bzw. -formaten entsprechen. Die einzelnen Spalten müssen durch ein
Begrenzu ngszeichen (Vorgabe: TAB) getrennt werden.
Beispiel: Ist der Inhalt der Datei a.dat z.B.
E1 | L1 | B1 l 10.10.2003
E1 l L1 | B4 l 02.10.2003
so liest die Anweisung
COPY A FRO M 'a.dat' DELI MI T E R '|'
die Zeilen aus der ASCII- Datei a.dat in die Tabelle A ein.
2 Die SELECT - Anweisung
Für alle Operationen der Relationenalgebra gibt es eine Entsprechun g in einer bestimmte n Form der
(äußerst komplexen) SELECT - Anweisung. SQL wird häufig geradezu identifiziert mit dieser Anweisung.
Wie kommt man von den relationalen Operationen zur zugehörigen SELECT - Anweisung ? Ein Satz erzeugender Grundoperationen der Relationenalge bra sind Vereinigung, Differenz, kartesisches Produkt,
Selektion und Projektion. Daraus sind z.B. die Operationen natürlicher Verbund, ? -Verbund und Division ableitbar.
Für die folgenden SELECT - Anweisung en gilt, daß die Implementierunge n Duplikate zulassen; diese
können durch SELE CT DISTINCT gezielt beseitigt werden.
Vereinigung :
Die Vereinigung zweier vereinigungsk o m p atibler Relationen r und s wird in SQL als UNION
zweier SELECT - Anfragen formuliert:
SELE CT * FROM r
UNION
SELE CT * FROM s ;
Seite 4
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
Differenz :
Die (Mengen- ) Differenz zweier Relationen r und s ist in SQL- 89 nur mit einer komplizierten
SELE CT- Konstruktion definierbar: r-s , die Menge aller Tupel von r, die nicht in s sind (wobei r und
s vereinigungsko m p atibel sind) läßt sich z.B. mit Hilfe des EXISTS-Prädikats und einer Unteranfrage
darstellen:
SELE CT *
FRO M r
WHER E NOT EXISTS
( SELE CT *
FRO M s
WHE R E r.r1=s.s1,...,r.rn=s.sn );
wobei r1 ... rn und s1l ... sn die jeweils kompatiblen Attribute von r bzw. s sind.
Ab SQL- 92 gibt es
Durchschnitt und
Differenz:
SELECT *
SELE CT *
FRO M r
FRO M r
INTER S E C T
EXCEP T
SELECT *
SELE CT *
FRO M s ;
FRO M s ;
Kartesisches Produkt :
Das kartesische Produkt r x s der beiden Relationen r und s enthält die Attribute von r und s (im Falle der
Übereinstim m u ng doppelt!). Als Tupel in r x s treten alle Kombinatione n von Tupeln aus r und s auf. Dem
entspricht in Kern- SQL die einfache Anweisung
SELE CT * FROM r,s ;
Ab SQL- 92 gibt es den CROSS JOIN (s.u.).
Selektion :
Die Selektion findet in der SELECT- Anweisung im WHE R E- Klauselteil ihre Entsprech ung.
Beispielsweise lautet die Übertragun g der Selektion
?
r.a <= 100 /\ r.name=fritz (r) in SQL:
_
SELE CT * FROM r
WHER E r.a <= 100 AND r.name = "fritz";
bei geeignet festgelegter Relation r.
Projektion :
Die Projektion
? a,b,c (r) der
Tabelle r auf die Attribute a, b, c (einzelne Tabellenspalten) ge-
lingt durch einfache Angabe der Spaltenbez eichner als Kom m aliste nach dem Schlüsselwort SELECT :
SELE CT r.a, r.b, r.c
FRO M r;
Seite 5
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
Verbund :
Beim Verbund r (a Verbund b) s wird die Menge aller Tupel des kartesische n Produkts von r und s gebildet, bei
denen r.a in der Relation mit s.b steht.
SELE CT *
FRO M r,s
WHER E r.a (Verbund) s.b ;
Der natürliche Verbund :
Der natürliche Verbund ist im 89er Standard durch die SELE CT - Anweisung nicht element ar ausdrückbar, kann aber erzeugt werden durch eine Aufeinanderfolge von Kartesische m Produkt, Selektion und Projektion. Zum Beispiel ist für die Relationen r und s mit den Attributen a,b,c,d und
c,d,e,f der Verbund r (nat.Verbund) s:
SELE CT r.a, r.b, r.c, r.d, s.e, s.f
FRO M r,s
WHER E r.c = s.c AND r.d = s.d
In SQL- 99 ist ein reichhaltiges Sortiment von JOIN- Operationen vorgesehe n: CROS S JOIN (Kartesisches Produkt), NATU R A L JOIN (natürlicher Verbund), JOIN ... ON (Theta- JOIN), LEFT OUTER JOIN,
RIGHT OUT ER JOIN (Äußere Verbundop erationen). Sie folgen im wesentlichen der Syntax
SELE CT * FROM r Jointyp s.
Beispiele:
SELE CT *
FRO M r NATU R A L JOIN s;
SELE CT *
FRO M r JOIN s
ON r.a1 = s.a3;
Beachte das Schlüsselwort ON im Gegensatz zu dem sonst an dieser Stelle auftauchend en WHE R E.
3 Syntax der SELECT - Anweisung
Die nachfolgende Syntaxdefinition stellt nur eine Annäherun g an die komplizierte (89er) Syntax des
SELE CT- Komm a nd os dar.
Selectko m m a n d o ::=
SELE CT [ ALL | DISTINCT ] { Selectiiste | * }
FRO M Tabelle [ Alias ] { , Tabelle [ Alias ] }
[ WHE R E Suchbedingu ng ]
[ GRO U P BY Spalte { , Spalte } ]
[ HAVI NG Sucbbedingun g ]
[ ORDE R BY Spaltenna m e [ ASC | DES C ] { Spaltenna m e { ASC | DES C } ]
AllgSelectko m m a n d o ::=
Selectko m m a n d o UNION [ ALL ] Selectkom m a nd o
Im Kern- SQL können statt UNION auch alle oben aufgeführten zweistelligen Operationen (JOIN,
INTE R S E C T , . . .) stehen. Die Erläuterung der Syntax von WHER E - und HAVING - Klausel erfolgt später,
ebenso wie Hinweise zur Benutzung der GRO U P BY- und ORDE R BY- Teile des SELEC T- Kom man d o s.
Seite 6
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
SELECT – Anweisung
Die Grundform der SELE CT- Anweisung ist
SELE CT [ ALL l DISTINC T ] <Kom m aliste von Spaltenbezeichnern>
FRO M
<Kom m aliste von Tabellenbez eichnern>
[WHE RE
<Bedingung> ] ;
ALL (default) läßt doppelte Zeilen in der Ergebnistabelle zu.
DISTINC T unterdrückt doppelte Zeilen im Ergebnis.
Im FRO M- Teil werden die verwendete n Relationen festgelegt.
Im WHER E - Teil werden aufgrund der Bedingung die Tupel der Ergebnisrelation selektiert .
Es ist üblich, die einzelnen Kompone nten der SELEC T - Anweisun g je in eine Zeile zu schreiben; die Syntax erzwingt dies aber nicht. Die Reihenfolge der Komp one nten ist dem natürlichsprachlichen Gebrauch
nache m pfu nde n.
Das Ergebnis einer SELECT - Anfrage ist im allgemeinen wieder eine Tabelle, die aus anderen Tabellen
zusam m e n ge s etzt worden ist, also eine Menge von Tupeln.
Die Ordnung der Zeilen der Tabelle ist unspezifiziert (impleme ntations ab hän gig), mit der optionalen Klausel (ORDE R BY, s.u.) kann aber eine bestim mte Reihenfolge erzwung en werden. Wird die ganze
WHE R E - Klausel weggelass en, so bezieht sich die Anfrage auf alle Zeilen der Tabellenreferenz en. Die Spalten der Tabellen müssen ggf. durch den Tabellenbezeichner qualifiziert werden, wenn keine Eindeutigkeit
gegeben ist.
Beispiel: Suche alle Bücher mit Seitenzahlen zwischen 300 und 600 heraus.
Lösung: Relationenalge braisc h:
(pi)BNr( (sigma) Seiten>=300 /\ Seiten<=600 (B))
SQL:
select bnr
frorn b
where b.Seiten >= 300 AND b.Seiten <= 600 ;
WHERE - Ausdrücke
In der WHER E- Klausel können zum Vergleich von Attributwerten die Operatoren BET W E E N AND, IN und
LIKE verwendet werden.
BET W E E N . . . AND . . .
sucht nach Werten innerhalb eines Bereiches
LIKE
vergleicht die Zeichenfolge einer Spalte mit einer
festgelegten Zeichenfolge
Mit Hilfe der ORDE R BY- Klausel werden eine oder mehrere Spalten in aufsteigend er (ASC) bzw. absteigender (DESC) Reihenfolge sortiert.
SELE CT [ ALL l DISTINC T ] <Kom m aliste von Spaltenbezeichnern>
FRO M
<Kom m aliste von Tabellenbez eichnern>
ORDE R BY
<Spaltenbez eichner> [ ASC l DESC ]
[ , <Spaltenbezeichner> [ ASC l DES C] .. ] ;
Seite 7
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
Beispiel:
SELE CT a.ENr, a.Datum
FRO M a
ORDE R BY a.Datu m ASC ;
Sichten
( read only )
Mit Hilfe des Sichten- Konzepts ist 'information hiding' möglich. Sichten gestatten aber auch (berechn ete)
Daten zur Verfügung zu stellen, die es in dieser Form im System gar nicht gibt. Die Daten werden mittels
einer SELE C T- Anweisung aus den vorhanden en Tabellen zusam m en g estellt.
CREA T E VIEW Sichtnam e [ ( Komm a ndoliste von Spaltenbez eichnern )]
AS SELE CT- Anweisung
[ WITH CHECK OPTIO N ]
Beispiel:
Mit der Anweisung
CREA T E VIEW NeuereBu ec her
AS SELE CT BNR, Autor, Jahr, Preis
FRO M B
WHER E Jahr > 1990
WITH CHE CK OPTIO N
[ ;]
bei PostgreS Q L ist hier Schluß
ist in PostgreS Q L nicht implementiert
wird dem Benutzer die Existenz einer neuen Tabelle NeuereBu ec her vorgespiegelt.
Mit der WITH CHEC K OPTIO N werden in die Sicht und damit in die Basistabelle neu einzufügend e
oder zu aktualisierend e Zeilen auf ihre semantische Übereinstim m u n g mit der Sichtdefinition überprüft.
Ist keine Übereinstim m un g gegeben, so wird das Einfügen oder Updaten abgelehnt. Dieser Mechanism us
dient der semantische n Konsistenzerhaltung der Datenbank(an w e n d un g). Zu beachten ist aber, daß ein
Updaten von Sichten nur unter ganz bestimmte n an die Definition der Sicht gestellten Voraussetzung en
möglich ist. Dies hat prinzipielle logische Ursachen. Die genauen Voraussetzungen für ein Update von
Sichten sind implementierungsab hä ngig (PostgreS Q L hat noch keine updatefähigen Sichten).
Aggregatfunktionen, GROUP BY
Spalten mit den Typen INTEG E R, SMALLINT , FLOAT, SMALLF L O A T , DECIM A L und MONE Y gestatten
Sum m en- und Mittelwertsbildung en ebenso wie die Ermittlung des Maximal- bzw. Minimalwertes.
Für Spalten anderen Datentyps kann man immerhin Zähloperationen durchführen, um etwa die Anzahl der
Attributwerte eines Attributs zu ermitteln, die einer bestimmten Bedingung genügen.
Die wichtigsten im Standard definierten Aggregatfunktionen sind:
COUNT
SUM
AVG
MAX
zählt die Einträge in einer Spalte
summiert die Einträge einer numerischen Spalte
mittelt die Einträge einer numerische n Spalte
Maximu m einer numerischen Spalte
MIN
Minimu m einer numerischen Spalte
Seite 8
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
COUNT (*)
liefert die Anzahl der Zeilen, wobei Zeilen mit Nullwerten mitgezählt werden
Die Aggregatfunktionen können anstelle eines Spaltenbezeichners in der SELECT - Klausel verwendet
werden.
Beispiel:
SELE CT MIN (Preis), AVG (Preis) , MAX (Preis)
FRO M B ;'
Mit dieser Anweisung wird eine neue Relation mit drei unbenannten Attributen erzeugt, die vom gleichen
Typ wie der Attributtyp von Preis sind.
Insbesondere bei numerischen Auswertunge n sind zwei optionale SELE C T- Konstruktionen nützlich:
die GRO UP BY- Klausel und mit ihr die HAVING - Klausel.
Beispiel: In der Bücher- Relation B gibt es verschieden e Bücher vom gleichen Autor. Angeno m m e n, man
möchte nur wissen, wann welcher Autor das letzte Buch geschrieben hat, so kann man B nach Autor
gruppieren und das Maximu m des Erscheinungsdat u m s ermitteln.
SELE CT Autor, MAX(Jahr)
FRO M b
GROU P BY Autor ;
Damit werden die Tupel für jeden Autor zu einer impliziten Tabelle zusam m e n g ef aßt, bei der dann
die Selektion das Paar Autor - LetztesJahr liefert.
Syntax:
SELE CT [ ALL | DISTI NCT ] <Kom m aliste von Spaltenbezeichnern>
FRO M
<Kom m aliste von Tabellenbez eichnern>
[ GRO U P BY <Kom m aliste von Spaltenbezeich nern> ]
Jeder der hinter GRO U P BY angegeben en Spaltenbez eichner muß vor der FROM- Anweisun g ebenfalls
aufgeführt sein. Genaugen o m m e n wird von einer gruppierten Anfrage gar keine Tabelle zurückgeliefert,
sondern eine Menge von Tabellen. Das Ergebnis ist übrigens nicht notwendig sortiert.
HAVING-Klausel
Im Zusam m e n ha ng mit der GRO U P- Klausel tritt häufig die HAVING- Klausel auf. Durch eine logische
Bedingung nach dem Schlüsselwort HAVI NG werden bestimmte Gruppen selektiert. Mit anderen Worten:
HAVING spielt die gleiche Rolle für GRO UP BY wie WHE R E für SELE CT.
Beispiel: (Natürlichsprachliche Formulierung?)
SELE CT a.LNr, COUNT(*), MAX (a.Datu m)
FRO M a
GROU P BY a.LNr
HAVING
MAX (a.Datum) > '15.11.2003' ;
Unteranfragen
Normalerweise enthält die SELE CT- Anweisung im WHER E - Klauselteil einfache logische Selektionsbedingunge n, entspricht also in diesem Teil der Selektionsoperation der Relationenalgebra. Da die WHER EBedingung zu einem logischen Wert führt und nicht nur Vergleiche, sondern auch Aussagen über Mengen zu
Seite 9
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
boole' schen Werten ausgewertet werden, liegt es nahe, das Enthaltensein, das Nichtenthaltensein und allund existenzquantifizierte Aussagen über Mengen zuzulassen. Deshalb existieren in SQL die
Mengenprädikate
IN, NOT IN, ALL und ANY.
Beispiel:
SELE CT L.LNa m e
FRO M L
WHER E L.Bezirk IN ( 'Charlottenburg- Wilmersdorf, 'Mitte' );
liefert
TU- Lehrbuchs ainmiung
TU- Informatik
HU- UB
Labi
Die Frage ist nur, wie im allgemeinen die zugehörigen Mengen gewonnen werden. Hierzu dienen die
Unteranfragen. Sie führen zur Schachtelung von SELE CT- Anfragen.
Sollen beispielsweise alle Büchereina m e n für Entleihvorgänge gefunden werden, die Entleiher E1 betreffen, so ist es sinnvoll, erst die Menge der Entleihvorgä nge von E1 zu ermitteln und dann die Büchereinamen zu diesen Num mern herauszusuchen.
SELE CT L.LNa m e
FRO M L
WHER E L.LNr IN
( SELE CT a.LNr
FRO M a
WHE R E a.ENr = 'E1');
Man erhält nur dann sinnvolle Antwortme ng en, wenn bei der Unteranfrage genau eine Spalte entsteht. Der
Datentyp des Attributs dieser Spalte muß kompatibel sein zum Datentyp des in der Menge zu suchenden
Elements.
Die Anfrage des Beispiels könnte auch mit dem Existenz- Operator formuliert werden:
SELE CT L.LNa m e
FRO M L
WHER E EXIST S
(SELECT *
FRO M a
WHE R E a.LNr = L.LNr
AND
a.ENr = 'E1' );
Der Ausdruck EXISTS Unteranfrage wird wahr, falls die Unteranfrage mindestens ein Tupel liefert. Beachte, daß die einschränkend e Spaltenbeding ung in der EXIST S- Variante wegfällt und deshalb im WHER E Selektionsteil der Unteranfrage auftauchen muß.
Seite 10
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
4 Beispiele
t1 : num
1
2
3
name t2 : num wert t3 : num name
a
1 xxx
1 a3
b
3 yyy
2 b3
c
5 zzz
3 c3
t4 : num wert
1 xxx
3 yyy
t5 : num wert t6 : num name
1 xxx
1 a6
2 yyy
2 b6
3 c6
4 d6
5 e6
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
CROS S JOIN
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
testjoin=# select * from t1 cross join t2;
testjoin=# select * from t1, t2;
num | name | num | wert
num | name | num | wert
-----+- -----+- ----+- ---------+- -----+- ----+- ----1 | a | 1 | xxx
1 | a | 1 | xxx
1 | a | 3 | yyy
1 | a | 3 | yyy
1 | a | 5 | zzz
1 | a | 5 | zzz
2 | b | 1 | xxx
2 | b | 1 | xxx
2 | b | 3 | yyy
2 | b | 3 | yyy
2 | b | 5 | zzz
2 | b | 5 | zzz
3 | c | 1 | xxx
3 | c | 1 | xxx
3 | c | 3 | yyy
3 | c | 3 | yyy
3 | c | 5 | zzz
3 | c | 5 | zzz
(9 rows)
(9 rows)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
INNER JOIN
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
testjoin=# select * from t1 inner join t2 on t1.num = t2.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
3 | c | 3 | yyy
(2 rows)
testjoin=# select * from t1 inner join t3 on t1.num = t3.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a3
2 | b | 2 | b3
3 | c | 3 | c3
(3 rows)
testjoin=# select * from t1 inner join t4 on t1.num = t4.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
3 | c | 3 | yyy
(2 rows)
Seite 11
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 inner join t5 on t1.num = t5.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 | b | 2 | yyy
(2 rows)
testjoin=# select * from t1 inner join t6 on t1.num = t6.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a6
2 | b | 2 | b6
3 | c | 3 | c6
(3 rows)
testjoin=# select * from t2 inner join t5 on t2.num = t5.num;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
(1 row)
testjoin=# select * from t2 inner join t5 on t2.wert = t5.wert;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
3 | yyy | 2 | yyy
(2 rows)
------------------------------------------------------------------testjoin=# select * from t1 inner join t2 using (num);
num | name | wert
-----+- -----+- ----1 | a | xxx
3 | c | yyy
(2 rows)
testjoin=# select * from t1 inner join t2 using (name);
ERRO R: JOIN/ USI N G column "name" not found in right table
testjoin=# select * from t1 inner join t2 using (wert);
ERRO R: JOIN/ USI N G column "wert" not found in left table
testjoin=# select * from t1 inner join t3 using (num);
num | name | name
-----+- -----+- ----1 | a | a3
2 | b | b3
3 | c | c3
(3 rows)
testjoin=# select * from t1 inner join t4 using (num);
num | name | wert
-----+- -----+- ----1 | a | xxx
3 | c | yyy
(2 rows)
Seite 12
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
(2 rows)
testjoin=# select * from
num | name | name
-----+- -----+- ----1 | a | a6
2 | b | b6
3 | c | c6
(3 rows)
testjoin=# select * from
name | num | num
------+- ----+- ---(0 rows)
testjoin=# select * from
num | wert | wert
-----+- -----+- ----1 | xxx | xxx
(1 row)
testjoin=# select * from
wert | num | num
------+- ----+- ---xxx | 1 | 1
yyy | 3 | 2
(2 rows)
t1 inner join t5 using (num);
t1 inner join t6 using (num);
t1 inner join t6 using (name);
t2 inner join t5 using (num);
t2 inner join t5 using (wert);
------------------------------------------------------------------testjoin=# select * from t1 natural inner join t2;
num | name | wert
-----+- -----+- ----1 | a | xxx
3 | c | yyy
(2 rows)
testjoin=# select * from t1 natural inner join t3;
num | name
-----+- ----(0 rows)
testjoin=# select * from t1 natural inner join t4;
num | name | wert
-----+- -----+- ----1 | a | xxx
3 | c | yyy
(2 rows)
testjoin=# select * from t1 natural inner join t5;
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
(2 rows)
Seite 13
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 natural inner join t6;
num | name
-----+- ----(0 rows)
testjoin=# select * from t5 natural inner join t6;
num | wert | name
-----+- -----+- ----1 | xxx | a6
2 | yyy | b6
(2 rows)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
LEFT (OUT ER)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
testjoin=# select * from t1 left outer join t2 on t1.num = t2.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 |b |
|
3 | c | 3 | yyy
(3 rows)
testjoin=# select * from t1 left outer join t3 on t1.num = t3.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a3
2 | b | 2 | b3
3 | c | 3 | c3
(3 rows)
testjoin=# select * from t1 left outer join t4 on t1.num = t4.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 |b |
|
3 | c | 3 | yyy
(3 rows)
testjoin=# select * from t1 left outer join t5 on t1.num = t5.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 | b | 2 | yyy
3 |c |
|
(3 rows)
testjoin=# select * from t1 left outer join t6 on t1.num = t6.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a6
2 | b | 2 | b6
3 | c | 3 | c6
(3 rows)
Seite 14
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t6 left
num | name | num | name
-----+- -----+- ----+- ----1 | a6 | 1 | a
2 | b6 | 2 | b
3 | c6 | 3 | c
4 | d6 |
|
5 | e6 |
|
(5 rows)
testjoin=# select * from t1 left
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
testjoin=# select * from t1 left
num | name | name
-----+- -----+- ----1 | a | a3
2 | b | b3
3 | c | c3
(3 rows)
testjoin=# select * from t1 left
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
testjoin=# select * from t1 left
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
3 |c |
(3 rows)
testjoin=# select * from t1 left
num | name | name
-----+- -----+- ----1 | a | a6
2 | b | b6
3 | c | c6
(3 rows)
testjoin=# select * from t6 left
num | name | name
-----+- -----+- ----1 | a6 | a
2 | b6 | b
3 | c6 | c
4 | d6 |
5 | e6 |
(5 rows)
outer join t1 on t1.num = t6.num;
outer join t2 using (num);
outer join t3 using (num);
outer join t4 using (num);
outer join t5 using (num);
outer join t6 using (num);
outer join t1 using (num);
Seite 15
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from
num | wert | wert
-----+- -----+- ----1 | xxx | xxx
3 | yyy |
5 | zzz |
(3 rows)
testjoin=# select * from
wert | num | num
------+- ----+- ---xxx | 1 | 1
yyy | 3 | 2
zzz | 5 |
(3 rows)
testjoin=# select * from
num | wert | wert
-----+- -----+- ----1 | xxx | xxx
2 | yyy |
(2 rows)
testjoin=# select * from
wert | num | num
------+- ----+- ---xxx | 1 | 1
yyy | 2 | 3
(2 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
testjoin=# select * from
num | wert | name
-----+- -----+- ----1 | xxx | a
3 | yyy | c
5 | zzz |
(3 rows)
testjoin=# select * from
num | name
-----+- ----1 |a
2 |b
3 |c
(3 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
t2 left outer join t5 using (num);
t2 left outer join t5 using (wert);
t5 left outer join t2 using (num);
t5 left outer join t2 using (wert);
t1 natural left outer join t2;
t2 natural left outer join t1;
t1 natural left outer join t3;
t1 natural left outer join t4;
Seite 16
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 natural left outer join t5;
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
3 |c |
(3 rows)
testjoin=# select * from t1 natural left outer join t6;
num | name
-----+- ----1 |a
2 |b
3 |c
(3 rows)
testjoin=# select * from t6 natural left outer join t1;
num | name
-----+- ----1 | a6
2 | b6
3 | c6
4 | d6
5 | e6
(5 rows)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
RIGHT (OUT E R) nur noch am Beispiel ON ( nicht using , nicht natural)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
testjoin=# select * from t1 right outer join t2 on t1.num = t2.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
3 | c | 3 | yyy
|
| 5 | zzz
(3 rows)
testjoin=# select * from t1 right outer join t3 on t1.num = t3.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a3
2 | b | 2 | b3
3 | c | 3 | c3
(3 rows)
testjoin=# select * from t1 right outer join t4 on t1.num = t4.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
3 | c | 3 | yyy
(2 rows)
testjoin=# select * from t1 right outer join t5 on t1.num = t5.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 | b | 2 | yyy
(2 rows)
Seite 17
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 right outer join t6 on t1.num = t6.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a6
2 | b | 2 | b6
3 | c | 3 | c6
|
| 4 | d6
|
| 5 | e6
(5 rows)
testjoin=# select * from t2 right outer join t5 on t2.num = t5.num;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
|
| 2 | yyy
(2 rows)
testjoin=# select * from t2 right outer join t5 on t2.wert = t5.wert;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
3 | yyy | 2 | yyy
(2 rows)
testjoin=# select * from t5 right outer join t2 on t2.num = t5.num;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
|
| 3 | yyy
|
| 5 | zzz
(3 rows)
testjoin=# select * from t5 right outer join t2 on t2.wert = t5.wert;
num | wert | num | wert
-----+- -----+- ----+- ----1 | xxx | 1 | xxx
2 | yyy | 3 | yyy
|
| 5 | zzz
(3 rows)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
FULL (OUT ER)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
testjoin=# select * from t1 full outer join t2 on t1.num = t2.num;
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 |b |
|
3 | c | 3 | yyy
|
| 5 | zzz
(4 rows)
testjoin=# select * from t1 full outer join t3 on t1.num = t3.num;
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a3
2 | b | 2 | b3
3 | c | 3 | c3
(3 rows)
Seite 18
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 full outer join t4 on t1.num
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 |b |
|
3 | c | 3 | yyy
(3 rows)
testjoin=# select * from t1 full outer join t5 on t1.num
num | name | num | wert
-----+- -----+- ----+- ----1 | a | 1 | xxx
2 | b | 2 | yyy
3 |c |
|
(3 rows)
testjoin=# select * from t1 full outer join t6 on t1.num
num | name | num | name
-----+- -----+- ----+- ----1 | a | 1 | a6
2 | b | 2 | b6
3 | c | 3 | c6
|
| 4 | d6
|
| 5 | e6
(5 rows)
testjoin=# select * from t6 full outer join t1 on t1.num
num | name | num | name
-----+- -----+- ----+- ----1 | a6 | 1 | a
2 | b6 | 2 | b
3 | c6 | 3 | c
4 | d6 |
|
5 | e6 |
|
(5 rows)
testjoin=# select * from t6 natural full outer join t1;
num | name
-----+- ----1 |a
1 | a6
2 |b
2 | b6
3 |c
3 | c6
4 | d6
5 | e6
(8 rows)
testjoin=# select * from t1 natural full outer join t6;
num | name
-----+- ----1 |a
1 | a6
2 |b
2 | b6
3 |c
3 | c6
4 | d6
= t4.num;
= t5.num;
= t6.num;
= t6.num;
Seite 19
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
5 | e6
(8 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
5 |
| zzz
(4 rows)
testjoin=# select * from
num | name
-----+- ----1 |a
1 | a3
2 |b
2 | b3
3 |c
3 | c3
(6 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
3 |c |
(3 rows)
testjoin=# select * from
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
5 |
| zzz
(4 rows)
testjoin=# select * from
num | name | name
-----+- -----+- ----1 | a | a3
2 | b | b3
3 | c | c3
(3 rows)
t1 natural full outer join t2;
t1 natural full outer join t3;
t1 natural full outer join t4;
t1 natural full outer join t5;
t1 full outer join t2 using(num);
t1 full outer join t3 using(num);
Seite 20
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
testjoin=# select * from t1 full outer join t4 using(num);
num | name | wert
-----+- -----+- ----1 | a | xxx
2 |b |
3 | c | yyy
(3 rows)
testjoin=# select * from t1 full outer join t5 using(num);
num | name | wert
-----+- -----+- ----1 | a | xxx
2 | b | yyy
3 |c |
(3 rows)
testjoin=# select * from t1 full outer join t6 using(num);
num | name | name
-----+- -----+- ----1 | a | a6
2 | b | b6
3 | c | c6
4 |
| d6
5 |
| e6
(5 rows)
testjoin=# select * from t6 full outer join t1 using(num);
num | name | name
-----+- -----+- ----1 | a6 | a
2 | b6 | b
3 | c6 | c
4 | d6 |
5 | e6 |
(5 rows)
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
======= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
GROU P BY
=> SELE CT * FROM test1; => SELE CT x FRO M test1 GRO U P BY x;
x |y
-----a |3
c |2
b |5
a |1
x
-a
b
c
Die zweite Anweisung hätte man nicht als SELECT * FRO M test1 GRO U P BY x; schreiben können, weil es
keinen einzigen Wert der Spalte y gibt, der der Gruppe hätte zugeordn et werden können.
Seite 21
Oberschule am Elsengrund – Gymnasium – Berlin Marzahn / Hellersdorf – Elsenstraße 9-11 – 12623 Berlin – Fachbereich Informatik
=> SELE CT x, sum(y) FRO M test1 GRO U P BY x;
x | sum
----------.
a |4
b |5
c |2
HAVING
Wenn die Tabelle mit GRO U P BY gruppiert wurde aber nur bestim mte Gruppen von Interesse sind, dann
kann die HAVIN G Klausel verwendet werden.
=> SELE CT x, sum(y) FRO M test1 GRO U P BY x HAVI NG sum(y) > 3;
x | sum
-----------.
a |4
b |5
=> SELE CT x, sum(y) AS betrag FRO M test1 GRO U P BY x HAVIN G sum(y) > 3;
x | betrag
-----------.
a |4
b |5
Seite 22
Herunterladen