DBS1 06 SQL v3
DBS1 06 SQL v3
SQL
Felix Naumann
15.5.2019
SQL – Historie
2
SQL – Standardisierung
■ Meist-verbreitete Datenbankanfragesprache
■ Ad-hoc und einfach
■ Deklarativ
□ Nicht prozedural / imperativ
□ Optimierbar
■ Very-High-Level Language
■ Anfragen an relationale Algebra angelehnt
□ Hinzu kommt DDL: Data definition language
□ Hinzu kommt DML: Data manipulation language
■ Achtung: Syntax kann sich von System zu System leicht unterscheiden. Felix Naumann
Datenbanksysteme I
■ Achtung: Funktionalität kann sich von System zu System leicht Sommer 2019
unterscheiden.
5
SQL Referenzen
■ DBMS-spezifische Webseiten
■ DB2
□ [Link]
□ SQL Reference Volume 1:
[Link]
[Link]
□ SQL Reference Volume 2:
[Link]
[Link]
■ Oracle
□ [Link] Felix Naumann
Datenbanksysteme I
■ MS SQL Server Sommer 2019
□ [Link]
6
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
7
Beispielschema
8
SELECT … FROM … WHERE …
■ SELECT *
FROM Film
WHERE StudioName = ‘Disney‘ AND Jahr= 1990;
Felix Naumann
■ Ausführung Datenbanksysteme I
Sommer 2019
□ Für jedes Tupel aus „Film“ prüfe die Bedingungen und gebe gültige Tupel aus.
9
Groß- und Kleinschreibung
□ Schlüsselworte großschreiben
□ Schemaelemente kleinschreiben
10
Projektion in SQL (SELECT, π)
■ Erweiterte Projektion
□ Umbenennung:
– SELECT Titel AS Name, Jahr AS Zeit FROM Film
□ Arithmetischer Ausdruck:
– SELECT Titel, Länge * 0.016667 AS Stunden FROM Film Felix Naumann
Datenbanksysteme I
□ Konstanten: Sommer 2019
– SELECT Titel, Länge * 0.016667 AS Stunden,
‘std.‘ AS inStunden FROM Film
11
Selektion in SQL (WHERE, σ)
■ Beispiele
□ SELECT Titel
FROM Film
WHERE Jahr > 1970 AND NOT inFarbe; Felix Naumann
Datenbanksysteme I
□ SELECT Titel Sommer 2019
FROM Film
WHERE (Jahr > 1970 OR Länge < 90) AND StudioName = ‘MGM‘;
13
Stringvergleiche
■ Datentypen
□ Array fester Länge, Buchstabenliste variabler Länge, Konstanten
□ SQL erlaubt viele Vergleiche über Datentypen hinweg
■ foo _ _ _ _ _ = foo = ‘foo‘
14
String-Mustervergleiche mit LIKE
15
Datum und Uhrzeit
16
Nullwerte
17
Wahrheitswerte
■ Überraschendes Verhalten
□ SELECT *
FROM Film
WHERE Länge <= 90 OR Länge > 90;
UNKNOWN UNKNOWN
UNKNOWN
Felix Naumann
□ Tupel erscheint nicht im Ergebnis. Datenbanksysteme I
Sommer 2019
□ SELECT *
FROM Film
WHERE StudioName = ‘Disney‘ AND Jahr = 1990
Felix Naumann
ORDER BY Länge ASC, Titel DESC; Datenbanksysteme I
Sommer 2019
20
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
21
Motivation
Felix Naumann
Datenbanksysteme I
Sommer 2019
22
Kreuzprodukt und Join
24
Tupelvariablen
Felix Naumann
Datenbanksysteme I
Sommer 2019
27
Interpretation von Anfragen
28
Joins
Felix Naumann
Datenbanksysteme I
Sommer 2019
30
TPC Query 2 - Minimum Cost Supplier
TYPE is randomly selected within the list Syllable 3 defined for Types
REGION is randomly selected within the list of values defined for R_NAME
31
The TPC-H Universal Table
32
Outer Joins
Manager
Schauspieler
34
Kreuzprodukt
■ Selten verwendet
■ Grundbaustein für Joins
Felix Naumann
Datenbanksysteme I
Sommer 2019
35
Mengenoperationen in SQL
■ Vereinigung: UNION
■ Schnittmenge: INTERSECT
■ Differenz: EXCEPT / MINUS
■ Mengenoperationen nur zwischen geklammerten Anfrageergebnissen
■ Mengenoperationen haben implizit eine Mengensemantik
□ Wandeln Input-Relationen in Mengen um
□ Wandeln Output in Menge um
■ Input-Relationen müssen gleiche Schemata haben
□ Gleiche Attributnamen
□ Gleiche Datentypen Felix Naumann
Datenbanksysteme I
Sommer 2019
37
Vereinigung: UNION
38
Differenz: EXCEPT
■ Auch MINUS
Felix Naumann
Datenbanksysteme I
Sommer 2019
39
Klammerung
SELECT *
FROM
(
(SELECT A FROM R)
INTERSECT
(SELECT * FROM
(SELECT A FROM S)
UNION
(SELECT A FROM T)
)
)
Felix Naumann
Datenbanksysteme I
Sommer 2019
40
Zusammenfassung der Semantik
4
4
[Link]
5
c/[Link]/doc/[Link] 41
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
42
Motivation
■ Drei Varianten
1. Subanfrage erzeugt einen einzigen Wert, der in der WHERE-Klausel mit
einem anderen Wert verglichen werden kann.
2. Subanfrage erzeugt eine Relation, die auf verschiedene Weise in WHERE-
Klausel verwendet werden kann.
3. Subanfrage erzeugt eine Relation, die in der FROM Klausel verwendet
werden kann.
– Wie jede normale Relation Felix Naumann
Datenbanksysteme I
Sommer 2019
43
Skalare Subanfragen
44
Skalare Subanfragen
46
Skalare Subanfragen – Beispiel
47
Bedingungen mit Relationen
– x = ANY R: Entspricht x IN R
– Alternativer Befehl: SOME
□ Negation mit NOT(…) ist immer möglich. 48
EXISTS Beispiele
□ SELECT ISBN
FROM BuchExemplar
WHERE EXISTS
(SELECT *
FROM Ausleihe
WHERE [Link] = [Link])
Felix Naumann
Datenbanksysteme I
Sommer 2019
49
EXISTS Beispiele
50
IN Beispiele
■ Matrikel der Studenten, die zumindest einen Prüfer gemeinsam mit dem
Studenten der Matrikel ‚123456‘ haben
□ SELECT DISTINCT Matrikel
FROM Prüft
WHERE Prüfer IN ( SELECT Prüfer
FROM Prüft
WHERE Matrikel = ‘123456‘) Felix Naumann
Datenbanksysteme I
■ Nachnamen aller Professoren, die schon einmal eine 1,0 vergeben haben.
□ SELECT Nachname
FROM Prof
WHERE 1.0 IN ( SELECT Note
FROM Prüft
WHERE Prüfer = [Link] )
Felix Naumann
Datenbanksysteme I
Sommer 2019
52
ALL und ANY Beispiele
53
Bedingungen mit Tupeln
54
Bedingungen mit Tupeln
□ SELECT [Link]
FROM Manager M, (SELECT ProduzentID AS ID
FROM Film, spielt_in
WHERE Titel = FilmTitel
AND Jahr = FilmJahr
AND Schauspieler = ‘Harrison Ford‘) Produzent
WHERE [Link] = [Link];
Felix Naumann
Datenbanksysteme I
Sommer 2019
56
Korrelierte Subanfragen
57
Korrelierte Subanfragen – Beispiel
■ Unkorreliert: ■ Korreliert:
Name und Gehalt aller Mitarbeiter in Name und Gehalt aller Mitarbeiter,
Potsdam deren Gehalt höher als 10% des
Abteilungsbudgets ist.
58
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
59
Duplikateliminierung
61
Wdh.: Duplikateliminierung bei Mengenoperationen
62
Aggregation
■ Standardaggregationsoperatoren
□ SUM, AVG, MIN, MAX, COUNT
□ Angewendet auf einzelne Attribute in der SELECT-Klausel
■ Typische weitere Aggregationsoperatoren
□ VAR, STDDEV
■ COUNT(*) zählt Anzahl der Tupel
□ in der Relation, die durch die FROM und WHERE Klauseln definiert wird.
63
Aggregation – Beispiele
■ SELECT AVG(Gehalt)
FROM Manager;
■ SELECT COUNT(*)
FROM spielt_in;
■ SELECT COUNT(Schauspieler)
FROM spielt_in;
64
Gruppierung, Aggregation und NULL
65
Gruppierung
67
Gruppierung
69
Felix Naumann
Datenbanksysteme I
Sommer 2019
70
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
71
Überblick
■ Einfügen
□ INSERT INTO … VALUES…
■ Löschen
□ DELETE FROM … WHERE …
■ Ändern
□ UPDATE … SET … WHERE … Felix Naumann
Datenbanksysteme I
Sommer 2019
72
Einfügen
■ Grundbaustein
□ INSERT INTO R(A1, …, An) VALUES (v1,…,vn);
73
Einfügen per Anfrage
Felix Naumann
Datenbanksysteme I
□ Erzeugt im Allgemeinen Redundanz und sollte vermieden werden. Sommer 2019
74
Ausführungsreihenfolge beim Einfügen
75
Bulk insert
■ INSERT
□ Zeilenbasiertes Einfügen aus SQL statements
■ IMPORT
□ Zeilen-basiertes Einfügen aus Datei
□ Trigger und Nebenbedingungen bleiben aktiv
□ Indizes werden laufend aktualisiert
■ LOAD
□ Seiten-basiertes Einfügen aus Datei
□ Trigger und Nebenbedingungen werden deaktiviert
□ Deutlich effizienter Felix Naumann
Datenbanksysteme I
□ Indizes werden am Ende neu generiert Sommer 2019
■ Grundbaustein
□ DELETE FROM R WHERE …
□ Lösche alle Tupel in R, für die die Bedingung wahr ist.
□ DELETE FROM spielt_in
WHERE FilmTitel = ‘The Maltese Falcon‘
AND FilmJahr = 1942
AND Schauspieler = ‘Sydney Greenstreet‘;
■ Grundbaustein
□ UPDATE R SET … WHERE …
□ SET Klausel
– Wertzuweisungen
– Komma-separiert
□ UPDATE Manager
SET Name = ‘Präs. ‘ || Name
WHERE ManagerID IN
(SELECT PräsidentID FROM Studios); Felix Naumann
Datenbanksysteme I
Sommer 2019
78
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
79
Überblick
■ Datentypen
■ Tabellen
■ Default-Werte
■ Indizes
Felix Naumann
Datenbanksysteme I
Sommer 2019
80
Datentypen
Felix Naumann
Datenbanksysteme I
Sommer 2019
82
[Link]
Tabellen
Felix Naumann
Datenbanksysteme I
Sommer 2019
84
Constraints und Trigger
85
Indizes
■ Ein Index auf einem Attribut ist eine Datenstruktur, die es dem DBMS erleichtert,
Tupel mit einem bekannten Wert des Attributs zu finden.
□ Nicht SQL-Standard, aber in (fast) jedem DBMS verfügbar.
■ Motivation
□ SELECT *
FROM Film
WHERE StudioName = ‘Disney‘ AND Jahr = ‘1990‘;
□ Variante 1: Alle 100.000 Tupel durchsuchen und WHERE Bedingung prüfen
□ Variante 2: Direkt alle 2000 Filme aus 1990 betrachten und auf ‚Disney‘ prüfen.
– CREATE INDEX JahrIndex ON Film(Jahr); Felix Naumann
Datenbanksysteme I
□ Variante 3: Direkt alle 100 Filme aus 1990 von ‘Disney‘ holen. Sommer 2019
■ Löschen
□ DROP INDEX JahrIndex;
Felix Naumann
Datenbanksysteme I
Sommer 2019
87
Indexwahl
■ Abwägung
□ Index beschleunigt Punkt- (und Bereichs-) Anfragen und Join-Anfragen
erheblich.
□ Index verlangsamt das Einfügen, Löschen und Verändern von Tupeln der
Relation.
– Index muss jeweils zusätzlich aktualisiert werden.
□ Indizes benötigen Speicherplatz.
■ Wahl der besten Indizes ist eine der schwierigsten Aufgaben des
Datenbankdesigns.
□ Vorhersage der query workload und update-Frequenz Felix Naumann
Datenbanksysteme I
□ Wahl der Attribute Sommer 2019
Felix Naumann
Datenbanksysteme I
Sommer 2019
89
Indexwahl – Beispiel
Schauspieler = s 10 4 10 4
FilmTitel = t 10 10 4 4
AND FilmJahr = j
INSERT INTO spielt_in 2 4 4 6
91
Verteilung in IMDB
(Real-World Daten)
Felix Naumann
Datenbanksysteme I
Sommer 2019
92
Verteilung in IMDB
(Real-world Daten, Stand ca. 2010)
■ WITH
m AS
(SELECT count(*) AS ZahlMovies FROM [Link]),
actress AS
(SELECT count(*) AS ZahlActress FROM [Link]),
actor AS
(SELECT count(*) AS ZahlActor FROM [Link]),
actors AS
(SELECT (ZahlActress + ZahlActor) AS GesamtActors
FROM actress, actor)
SELECT DOUBLE([Link]) / DOUBLE([Link])
FROM m, actors
■ Schauspieler pro Spielfilm: 8,7
■ WITH
actors AS (SELECT * FROM [Link] UNION
SELECT * FROM [Link]),
counts AS (SELECT name, count(movie_id) AS m Felix Naumann
FROM actors GROUP BY name) Datenbanksysteme I
Sommer 2019
SELECT AVG(DOUBLE(m)) FROM counts
■ Spielfilme pro Schauspieler: 4,2
93
Überblick
1. Einfache Anfragen
2. Anfragen über mehrere Relationen
3. Geschachtelte Anfragen
4. Operationen auf einer Relation
5. Datenbearbeitung (DML)
6. Schemata (DDL)
7. Sichten
Felix Naumann
Datenbanksysteme I
Sommer 2019
94
Virtuelle Relationen
Felix Naumann
Datenbanksysteme I
Sommer 2019
95
Michael Stonebraker: Implementation of Integrity Constraints and
Views by Query Modification. SIGMOD Conference 1975: 65-78
Felix Naumann
Datenbanksysteme I
Sommer 2019
96
Sichten in SQL
■ Daten der Sicht ändern sich mit der Änderung der zugrundeliegenden Relationen.
■ Entfernen der Sicht: DROP VIEW ParamountFilme Felix Naumann
Datenbanksysteme I
□ Basisdaten bleiben unverändert. Sommer 2019
97
Anfragen an Sichten
99
Attributumbenennung mittels Sichten
100
Diskussion
■ Vorteile
□ Vereinfachung von Anfragen
□ Strukturierung der Datenbank
□ Logische Datenunabhängigkeit
– Sichten stabil bei Änderungen der Datenbankstruktur
– Sichtdefinitionen müssen gegebenenfalls angepasst werden
– Stabilität nicht bei jeder Änderung
□ Beschränkung von Zugriffen (Datenschutz)
□ Optimierung durch materialisierte Sichten
Felix Naumann
■ Probleme Datenbanksysteme I
Sommer 2019
□ Automatische Anfragetransformation schwierig
□ Änderungen auf Sichten
□ Updatepropagierung für materialisierte Sichten
101
Updates auf Sichten
■ In einigen Fällen ist es möglich, Einfüge-, Lösch- oder Updateoperationen auf Sichten
durchzuführen.
□ Wo speichern?
□ Welche Relation?
□ Zuordnung der Änderung zur Sicht?
102
Einfügen auf Sichten – Beispiel
103
Löschen und Updates auf Sichten
■ Löschen
□ DELETE FROM ParamountFilme
WHERE Titel LIKE ‚%Trek%‘;
■ Wird umgeschrieben zu
□ DELETE FROM Filme
WHERE Titel LIKE ‚%Trek%‘ AND StudioName = ‚Paramount‘;
■ Update
□ UPDATE ParamountFilme
SET Jahr = 1979
WHERE Titel = ‚Star Trek the Movie‘;
■ Wird zu
□ UPDATE Filme Felix Naumann
Datenbanksysteme I
SET Jahr = 1979 Sommer 2019
104
Tupelmigration
106
Anfrageplanung mit Sichten
Q Q Felix Naumann
Datenbanksysteme I
Sommer 2019
V W
Def. V Def. W
Z
107
Anfrageplanung mit Sichten
■ Sicht
□ CREATE VIEW ParamountFilme AS
SELECT Titel, Jahr
FROM Filme
WHERE StudioName = ‚Paramount‘; πTitel
■ Anfrage
□ SELECT Titel σJahr = 1979
FROM ParamountFilme
WHERE Jahr = 1979;
πTitel,Jahr πTitel πTitel,Jahr
Felix Naumann
Datenbanksysteme I
Sommer 2019
σStudioName = ‚Paramount‘ σJahr = 1979 σStudioName = ‚Paramount‘
Felix Naumann
Datenbanksysteme I
Sommer 2019
109
Drei Folien nach Prof. Ulf Leser, HU Berlin
MV – Themen und Probleme
■ Gegeben
□ Eine Anfrage Q
□ Eine Menge V (materialisierten) von Sichten
■ Fragen
□ Kann man Q überhaupt unter Verwendung von V beantworten?
□ Kann man Q nur mit V beantworten?
□ Kann man Q mit V vollständig beantworten?
□ Ist es günstig, Sichten aus V zur Beantwortung von Q zu verwenden?
Welche?
Felix Naumann
Datenbanksysteme I
Sommer 2019
111
Local-as-View – Beispiel
Globales Schema
Lehrt(prof,kurs_id, sem, eval, univ)
Kurs(kurs_id, titel, univ)
Quelle 1: Alle Datenbankveranstalt. Quelle 2: Alle HPI-Vorlesungen
CREATE VIEW DB-kurs AS CREATE VIEW HPI-VL AS
SELECT [Link], [Link], K.kurs_id, [Link] SELECT [Link], [Link], K.kurs_id, [Link]
FROM Lehrt L, Kurs K FROM Lehrt L, Kurs K
WHERE L.kurs_id = K.kurs_id WHERE L.kurs_id = K.kurs_id
AND [Link] = [Link] AND [Link] = „HPI“
AND [Link] LIKE „%_Datenbanken“ AND [Link] = „HPI“
AND [Link] LIKE „%VL_%“
Globale Anfrage
SELECT prof
Umgeschriebene Anfrage
FROM Lehrt L, Kurs K Felix Naumann
Umgeschriebene Anfrage
Globale Anfrage SELECT titel, kurs_id
SELECT titel, kurs_id FROM DB-kurs D
Felix Naumann
Datenbanksysteme I
FROM Kurs WHERE [Link] = „HPI“ Sommer 2019
WHERE univ = „HPI“ UNION
SELECT titel, kurs_id Frage:
FROM HPI-VL Warum hier doch
113
Quelle 2 einbeziehen?
Zusammenfassung
□ Materialisierte Sichten
114