Kapitel DB-4: SQL Inhalt - Universität Basel | Informatik

Werbung
Herbstsemester 2013
CS261 Web Data Management
Kapitel DB-4: SQL
H. Schuldt
Inhalt
Datenmanipulationssprache SQL:
•
SQL (Structured Query Language)
– ist die Standardsprache für die Datendefinition und Datenmanipulation in
relationalen Datenbanksystemen
– Der in SQL für die Datendefinition zuständige Teil wird Data Definition
Language (DDL) genannt
– Der Teil der Sprache für Einfügen, Ändern und Löschen heisst Data
Manipulation Language (DML).
•
SQL umfasst:
– Interaktives (“stand-alone”) SQL
– Anweisungen zur Integritätssicherung und Zugriffskontrolle
– Anweisungen zur physischen Datenorganisation (Indizes etc.)
– Eingebettetes (“embedded”) SQL (für die gängigen Programmiersprachen)
– Integration von SQL in “4th Generation Language”
HS 2013
Web Data Management (CS261) – SQL
DB-4-2
1
Historie von SQL
•
•
•
•
•
SEQUEL
(= Structured English Query Language)
– Forschungsprototyp in System R von IBM (1975)
SQL2 (= SQL 92)
SQL3 (= SQL 99)
– Ergänzung von SQL2 um objektorientierte Konstrukte (objektrelationale DB)
SQL:2003 Erweiterung der objektrelationalen Konstrukte
Im Folgenden werden wir uns auf den Basis-Sprachumfang von SQL3,
der auch bereits Bestandteil von SQL2 war, beschränken
HS 2013
Web Data Management (CS261) – SQL
DB-4-3
Wiederholung (Relationenmodell)
In relationalen Datenbanken werden Daten in Relationen verwaltet.
•
Relationen enthalten Mengen von gleich strukturierten Datensätzen (Tupel)
•
Jedes Tupel besitzt dieselbe Menge von Attributen
•
Jedes Attribut besitzt einen Wertebereich (Domäne)
•
In einer Relation wird ein einzelnes Attribut bzw. eine Gruppe von Attributen
als Schlüssel (Primärschlüssel) gekennzeichnet. Der Wert dieses Attributs
(bzw. der Gruppe von Attributen) muss innerhalb der Ausprägung der Relation
eindeutig sein
•
Beziehungen zwischen Tabellen sind möglich, indem man erzwingt, dass
beliebige Werte von Attributen A einer Relation mit den Primärschlüsseln
einer anderen Relation übereinstimmen müssen. Die Attribute A werden
dann auch als Fremdschlüssel bezeichnet.
HS 2013
Web Data Management (CS261) – SQL
DB-4-4
2
Wiederholung: Beispieldatenbank …
Kunden
Produkte
KNr
Name
Stadt
Saldo
Rabatt
1
Legrand
Genf
-1080,00
0.10
2
Marty
Basel
-800,00
0.20
3
Frei
Basel
0,00
0,10
4
Janvier
Genf
0,00
0,10
5
Rosi
Lugano
0,00
0,05
6
Meier
Zürich
-3800,00
0,05
PNr
Bez
Gewicht
Preis
Lagerort
Vorrat
1
Papier
2,000
20,00
Basel
10000
2
Platte
1,000
2500,00
Zürich
400
3
Drucker
5,000
2000,00
Genf
200
4
Bildschirm
5,000
3000,00
Genf
80
5
CDs
0,500
20,00
Basel
5000
6
Maus
0,250
100,00
Basel
200
7
Speicher
0,100
200,00
Bern
2000
HS 2013
Web Data Management (CS261) – SQL
DB-4-5
Wiederholung: … Beispieldatenbank
Bestellungen
HS 2013
BestNr
Monat
Tag
KNr
PNr
Menge
1
7
16
1
1
100
Summe
1800,00
Status
bezahlt
2
7
21
1
1
100
1800,00
bezahlt
3
9
30
1
2
4
9000,00
bezahlt
4
9
30
1
3
1
1800,00
bezahlt
5
9
30
1
4
10
27000,00
bezahlt
6
10
15
1
5
50
900,00
bezahlt
7
10
28
1
6
2
180,00
geliefert
8
11
2
1
7
5
900,00
neu
9
10
26
2
1
100
1600,00
10
11
2
2
5
50
800,00
bezahlt
neu
11
9
28
3
5
50
900,00
bezahlt
12
10
28
3
7
10
1800,00
bezahlt
13
4
15
4
1
50
900,00
bezahlt
14
5
31
6
1
200
3800,00
bezahlt
15
6
30
6
7
10
1900,00
geliefert
16
7
31
6
1
100
1900,00
geliefert
Web Data Management (CS261) – SQL
DB-4-6
3
Einfache Datendefinition
Syntax der Datendefinition in SQL:
[user “.”] table “(“ column_element {“,” column_element}
{“,” table_constraint} “)”
CREATE TABLE
mit:
column_element =
column data_type [DEFAULT expr] [column_constraint]
column_constraint =
[NOT NULL]
[PRIMARY KEY | UNIQUE]
[REFERENCES [user “.”] table [ “(“ column “)” ]]
[CHECK “(“ condition “)”" ]
table_constraint =
[ (PRIMARY KEY | UNIQUE) “(“ column {“,” column} “)” ]
[ FOREIGN KEY “(“ column {“,” column} “)”
REFERENCES [user “.”] table [ “(“ column {“,” column} “)” ]
[CHECK “(“ condition “)” ]
HS 2013
Web Data Management (CS261) – SQL
DB-4-7
Datendefinition: Beispiele
1)
Definition der Produkt-Tabelle
CREATE TABLE Produkte (
PNr
INTEGER
CHECK (PNr > 0) PRIMARY KEY,
Bez
VARCHAR(30) NOT NULL UNIQUE,
Gewicht FLOAT
CHECK (Gewicht > 0.0),
2)
...)
Definition der Bestellungs-Tabelle
CREATE TABLE Bestellungen (
BestNr
INTEGER
CHECK (BestNr > 0) PRIMARY KEY,
Monat
INTEGER
NOT NULL CHECK (Monat BETWEEN 1 AND 12),
...,
FOREIGN KEY (PNr)
REFERENCES Produkte (PNr),
FOREIGN KEY (KNr)
REFERENCES Kunden (KNr),
UNIQUE (Monat, Tag, PNr, KNr)
)
HS 2013
Web Data Management (CS261) – SQL
DB-4-8
4
Unterschiede zum „reinen“ Relationenmodell
•
Die Festlegung eines Primärschlüssels wird nicht erzwungen
•
Wenn aber ein Primärschlüssel spezifiziert ist, dann wird die Einhaltung der
Primärschlüsselbedingung garantiert.
•
Analoges gilt für die Fremdschlüsselbedingung.
•
Falls kein Primärschlüssel (und kein Schlüsselkandidat) spezifiziert ist, dürfen
Tabellen Duplikate enthalten, d.h. es handelt sich um Multimengen („bags“).
HS 2013
Web Data Management (CS261) – SQL
DB-4-9
Anfragen (Queries)
Syntax von SQL-Abfragen:
Query = SelectBlock { [UNION | INTERSECTION | EXCEPT] SelectBlock }
[ORDER BY result_column [ASC | DESC] {“,” result_column [ASC | DESC]}
SelectBlock =
SELECT [ALL | DISTINCT] (column | expression) {“,” (column | expression)}
FROM table [correlation_var] {“,” table [correlation_var]}
[WHERE SearchCondition]
[GROUP BY column {“,” column} [HAVING SearchCondition]]
• Alle Joinbedingungen müssen in SQL explizit in der WHERE-Klausel
angegeben werden
• Standardmässig erfolgt keine Duplikateliminierung; diese kann mit DISTINCT
explizit spezifiziert werden
HS 2013
Web Data Management (CS261) – SQL
DB-4-10
5
SQL vs. Relationenalgebra bzw. SQL vs. Tupel-Relationenkalkül
•
Gegeben sei der SQL-Ausdruck
SELECT
A, B, ...
FROM
R, S, ..., T, ...
WHERE F
(so dass A, B, ... zu R, S, ... gehören, nicht aber zu T, ...,
und F über R, S, ..., T, ... definiert ist). Dann entspricht dieser Ausdruck …
•
… in der Relationenalgebra:
p[A, B, ...] (s[F] ( R μ S μ ... μ T μ ... ))
•
… und im Tupel-Relationenkalkül
{x.A, y.B, ... | x œ R  y œ S  ...  $ z œ T ... : F(x, y, ..., z, ...)}
HS 2013
Web Data Management (CS261) – SQL
DB-4-11
Beispiele: Select ...
1)
Gesucht sind (die Namen) alle(r) Kunden mit negativem Saldo.
SELECT KNr, Name, Stadt, Saldo, Rabatt
FROM Kunden
WHERE Saldo < 0.0
alle Attribute (Kurzschreibweise)
oder:
SELECT * FROM Kunden WHERE Saldo < 0.0
bzw.:
SELECT Name FROM Kunden WHERE Saldo < 0.0
Nur explizit aufgeführte Attribute
2)
Gesucht sind die Namen aller Kunden, die eine unbezahlte Bestellung haben,
die vor Anfang Oktober erfolgte
SELECT
FROM
WHERE
AND
HS 2013
Name
Kunden, Bestellungen
Monat < 10 AND Status <> 'bezahlt'
Kunden.KNr = Bestellung.KNr
Web Data Management (CS261) – SQL
DB-4-12
6
… Beispiele: Select
3)
Gesucht sind die Namen der Basler Kunden, die seit Anfang September ein
Produkt aus Basel geliefert bekommen haben, jeweils mit der Bezeichnung
des entsprechenden Produkts.
4)
Finden Sie die Rechnungssumme der Bestellung mit BestNr 111
(ohne auf das Attribut Summe der Relation Bestellungen zuzugreifen).
SELECT Menge*Preis*(1.0-Rabatt)
FROM
Bestellungen, Produkte, Kunden
WHERE BestNr = 111
AND Bestellungen.PNr = Produkte.PNr
AND Bestellungen.KNr = Kunden.KNr
HS 2013
Web Data Management (CS261) – SQL
DB-4-13
Komplexe Suchprädikate
5)
Finden Sie alle Paare von Kunden, die in derselben Stadt wohnen.
SELECT K1.Name, K2.Name FROM Kunden K1, Kunden K2
WHERE
K1.Stadt = K2.Stadt AND K1.KNr < K2.KNr
Korrelationsvariable (Tupelvariable): eindeutige Benennung mehrerer
„Inkarnationen“ derselben Relation
6)
Finden Sie die Kunden, deren Rabatt zwischen 10 und 20 Prozent liegt.
SELECT * FROM Kunden
WHERE Rabatt BETWEEN 0.10 AND 0.20
BETWEEN ... AND ... zur einfachen Formulierung von Bereichsanfragen
(„range queries”)
7)
Finden Sie Kunden mit Doppelnamen, die mit Meier oder Maier oder Meyer, ...
beginnen
SELECT * FROM Kunden WHERE Name LIKE 'M_ _er-%'
Pattern-Matching in Zeichenketten: Schüsselwort LIKE, sowie % als Platzhalter
(„wild card“) für eine beliebige Zeichenkette der Länge >= 0 und _ als
Platzhalter für ein beliebiges Zeichen.
HS 2013
Web Data Management (CS261) – SQL
DB-4-14
7
Test auf Nullwert / Mitgliedschaft in Menge
8)
Finden Sie alle Produkte, die grundsätzlich in keinem Lager geführt werden.
SELECT * FROM Produkte WHERE Lagerort IS NULL
Test auf Nullwert: IS NULL ist das einzige Vergleichsprädikat, das von einem
Nullwert erfüllt wird.
Konsequenz: Die Anfrage
SELECT * FROM Produkte WHERE Vorrat >= 0 OR Vorrat < 0
liefert (nur) alle Tupel der Relation Produkte, deren Wert bzgl. des Attributs
Vorrat kein Nullwert ist.
9)
Finden Sie alle Kunden aus Zürich, Genf und Basel.
SELECT * FROM Kunden WHERE Stadt IN ( 'Zürich', 'Genf',
'Basel')
Der Test auf Mitgliedschaft eines Werts in einer Menge erfolgt über das
IN-Prädikat.
HS 2013
Web Data Management (CS261) – SQL
DB-4-15
IN -Prädikat mit geschachtelten Select-Blöcken
Syntax: (column | expression) [NOT] IN "(" select_block ")"
10) Finden Sie die Namen aller Kunden, die eine unbezahlte Bestellung haben, die
vor Anfang Oktober erfolgte.
SELECT Name FROM Kunden
WHERE KNr IN ( SELECT KNr FROM Bestellungen
WHERE Status <> 'bezahlt' AND Monat < 10)
11) Finden Sie alle Kunden aus Städten, in denen es mindestens zwei Kunden gibt.
HS 2013
Web Data Management (CS261) – SQL
DB-4-16
8
Quantifizierte Vergleiche
Die Bedingung “ Wert Q ANY Menge” mit Q œ {=, π, <, >, £, ≥} ist erfüllt, wenn
es in der Menge ein Element gibt, für welches das Prädikat “Wert Q Element “ gilt
(= ANY ist äquivalent zu IN).
Die Bedingung “ Wert Q ALL Menge” mit Q œ {=, π, <, >, £, ≥} ist erfüllt, wenn
für alle Elemente der Menge gilt: “Wert Q Element”
(π ALL ist äquivalent zu NOT IN).
12) Finden Sie die Kunden mit dem geringsten Rabatt.
SELECT * FROM Kunden
WHERE
Rabatt £ ALL ( SELECT Rabatt FROM Kunden )
Achtung: Das Prädikat Wert =ALL Menge ist nur bei einer einelementigen
Menge erfüllbar.
SELECT KNr FROM Bestellungen
WHERE PNr = ALL ( SELECT PNr FROM Produkte )
Die Anfrage kann also nur dann ein nichtleeres Resultat liefern, wenn es nur
ein einziges Produkt gibt!
HS 2013
Web Data Management (CS261) – SQL
DB-4-17
Test, ob eine Menge leer oder nichtleer ist
13) Finden Sie die Namen aller Kunden, die eine unbezahlte Bestellung haben, die
vor Anfang Oktober erfolgte.
SELECT Name FROM Kunden
WHERE EXISTS ( SELECT * FROM Bestellungen
WHERE Status <> 'bezahlt'
AND Monat < 10
AND Bestellungen.KNr = Kunden.KNr )
14) Finden Sie die Kunden, für die keine Bestellung registriert ist.
SELECT * FROM Kunden
WHERE NOT EXISTS ( SELECT * FROM Bestellungen
WHERE Bestellungen.KNr = Kunden.KNr )
HS 2013
Web Data Management (CS261) – SQL
DB-4-18
9
Anfragen „ … für alle …“
Der Zusammenhang zum Allquantor des Relationenkalküls bzw. zur Division der
Relationenalgebra ist in SQL über Suchbedingungen der Form „... für alle ...“
gegeben. Diese „… für alle …“ Anfragen können in SQL mit NOT EXISTS
realisiert werden.
15) Finden Sie die Kunden, die alle überhaupt lieferbaren Produkte irgendwann
bestellt haben.
HS 2013
Web Data Management (CS261) – SQL
DB-4-19
Aggregationsfunktionen
Aggregationsfunktionen haben zum Ziel, eine (Multi-) Menge von Werten auf einen
Wert abzubilden. Syntax der Aggregation in SQL:
(MAX | MIN | AVG | SUM | COUNT) "(" (ALL | DISTINCT)
(column | expression | "*") ")"
16) Finden Sie den höchsten Rabatt aller Kunden.
SELECT MAX (Rabatt) FROM Kunden
17) An wie vielen Lagerorten werden Produkte gelagert?
SELECT COUNT (DISTINCT Lagerort) FROM Produkte
18) Welche Kunden haben einen überdurchschnittlichen Rabatt?
SELECT * FROM Kunden WHERE Rabatt >
(SELECT AVG (Rabatt) FROM Kunden)
19) Wie hoch ist der Gesamtumsatz?
SELECT SUM (b.Menge*p.Preis*(1.0-k.Rabatt))
FROM
Bestellungen b, Produkte p, Kunden k
WHERE b.PNr = p.PNr
AND
b.KNr = k.KNr
HS 2013
Web Data Management (CS261) – SQL
DB-4-20
10
Aggregation mit Gruppenbildung
Idee der Gruppenbildung: Eine Tupelmenge wird aufgrund der Werte eines Attributs
oder eines Ausdrucks in Gruppen (Teilmengen) partitioniert und über ein Prädikat
ausgewählt
20) Bestimmen Sie für alle Produkte deren Gesamtverkaufszahl (ab Anfang
September).
SELECT PNr, SUM(Menge) FROM Bestellungen
WHERE Monat >= 9
GROUP BY PNr
Alle Tupel mit übereinstimmender PNr werden gruppiert und SUM(Menge)
wird jeweils nur für die Gruppenmitglieder berechnet
HS 2013
Web Data Management (CS261) – SQL
DB-4-21
Aggregation mit Gruppenbildung und Filterung
21) Bestimmen Sie die Gesamtverkaufszahl für alle Produkte, die ab Anfang
September mehr als 1000-mal verkauft worden sind.
SELECT PNr, SUM(Menge)
FROM Bestellungen
WHERE Monat >= 9
Auswahl bestimmter Gruppen
GROUP BY PNr
HAVING SUM(Menge) > 1000
22) Bestimmen Sie für jede Stadt mit mehr als 10 Kunden den durchschnittlichen
Rabatt dieser Kunden. Die Ausgabe soll nach Rabatten absteigend sortiert sein.
SELECT Stadt, AVG(Rabatt) FROM Kunden
GROUP BY Stadt
HAVING COUNT(*) > 10
ORDER BY 2 DESC
Sortierung nach Attribut an zweiter Stelle
in SELECT-Klausel – also hier: AVG(Rabatt)
HS 2013
Web Data Management (CS261) – SQL
DB-4-22
11
Mächtigkeit und Grenzen von SQL …
•
•
•
SQL ist relational vollständig, d.h. man kann in SQL alle Anfragen stellen,
die man auch mit der Relationenalgebra formulieren kann
SQL ist sogar mächtiger als die Relationenalgebra
– da arithmetische Ausdrücke erlaubt und Aggregatsfunktionen vorhanden sind;
zusätzlich existieren GROUP BY und HAVING für Subtupelmengen
Aber: SQL ist nicht Turing-vollständig, d.h., es gibt berechenbare Funktionen, die
nicht in SQL ausdrückbar sind.
Beispiele für Anfragen, die nicht in SQL ausdrückbar sind:
•
Bestimmen Sie die Varianz der Rabatte, die den Kunden gewährt werden.
•
Erstellen Sie eine Liste der folgenden Kundenkategorien: alle Kunden mit einem
Umsatz zwischen 0.00 und 10‘000.00 Franken, alle Kunden mit einem Umsatz
zwischen 10‘000.01 und 20‘000.00 Franken, ..., sowie alle Kunden mit einem
Umsatz über 100‘000.00 Franken. Für jede Kategorie sind die Kundenanzahl und
der Gesamtumsatz auszudrucken.
HS 2013
Web Data Management (CS261) – SQL
DB-4-23
… Mächtigkeit und Grenzen von SQL
Beispiele für Anfragen, die nicht in SQL ausdrückbar sind (Fortsetzung):
•
Gegeben sei eine Relation mit direkten Flugverbindungen. Bestimmen Sie die
Orte, die man mit dem Flugzeug von Basel aus erreichen kann.
Flüge FlugNr
Ansatz:
Abflugort
Zielort
…
LX4711
Basel
Frankfurt
…
LH0815
Frankfurt
New York
…
AF123
New York
Paris
…
BA999
New York
London
…
OS111
Frankfurt
Wien
…
SELECT Fn.Zielort
FROM Flüge F1, Flüge F2, Flüge F3, ..., Flüge Fn
WHERE F1.Abflugort = 'Basel' AND
F1.Zielort = F2.Abflugort AND
F2.Zielort = F3.Abflugort AND ... AND
Fn-1.Zielort = Fn.Abflugort
Hier sind jedoch Anfragen mit variablem n gesucht. Rekursion ist in SQL aber nicht
möglich. Abhilfe ist die Entwicklung von geeigneten Anwendungsprogrammen
(T Kapitel DB-7)
HS 2013
Web Data Management (CS261) – SQL
DB-4-24
12
Datenmodifikation: Einfügen von Tupeln
SQL-Syntax der DML (Data Manipulation Language):
INSERT INTO table [ "(" column {"," column} ")" ]
( VALUES "(" expression {"," expression} ")" | unordered_query)
23) Einfügen eines neuen Kunden
INSERT INTO Kunden VALUES (7, 'Imboden', 'Luzern', 0.0, 0.0)
24) Einfügen von KNr, Name, Stadt eines neuen Kunden
INSERT INTO Kunden (KNr, Name, Stadt)
VALUES (7, 'Imboden', 'Luzern')
25) Annahme: es existiert eine Tabelle Mahnungen (BestNr ...) mit demselben
Schema wie Bestellungen
INSERT INTO Mahnungen
SELECT * FROM Bestellungen
WHERE Status = 'geliefert' AND Monat<10
Attributwerte, die beim Einfügen nicht spezifiziert sind, werden auf den DefaultWert oder den Nullwert gesetzt.
HS 2013
Web Data Management (CS261) – SQL
DB-4-25
Datenmodifikation: Ändern von Tupeln
SQL-Syntax der DML (Änderungen):
UPDATE table [correlation_var]
SET column "=" expression {"," column "=" expression} WHERE search_condition
26) Kunde mit KNr=1 zieht nach Lausanne um
UPDATE Kunden SET Stadt = 'Lausanne' WHERE KNr = 1
27) Erhöhe den Rabatt von Kunden, die Waren im Wert von über 100000.00
bestellt haben, um 5 Prozent
UPDATE Kunden SET Rabatt = Rabatt + 0.05
WHERE Saldo > -100000.0
AND KNr IN (
SELECT KNr FROM Bestellungen
GROUP BY KNr
HAVING SUM(Summe) > 100000.0 )
HS 2013
Web Data Management (CS261) – SQL
DB-4-26
13
Datenmodifikation: Löschen von Tupeln
SQL-Syntax der DML (Löschen):
DELETE FROM table [correlation_var] [WHERE search_condition]
28) Lösche alle Bestellungen, die vor Juli erfolgt sind
DELETE FROM Bestellungen WHERE Monat < 7
HS 2013
Web Data Management (CS261) – SQL
DB-4-27
Schema-Änderungen
SQL-Syntax der DDL (Schema-Änderungen):
ALTER TABLE table ADD column datatype [column_constraint]
{"," column data_type [column_constraint]}
29) Füge zusätzliche Integritätsbedingung zu Bestellungen hinzu
ALTER TABLE Bestellungen
ADD Frist INTEGER CHECK (Frist > 0)
Existierende Tupel werden bezüglich neuer Attribute implizit auf den
Nullwert gesetzt.
HS 2013
Web Data Management (CS261) – SQL
DB-4-28
14
Herunterladen