Datenbanken
SQL Einführung und SQL-DDL
SQL Überblick
ANSI/ISO standardisierte
Datendefinitions (DDL)Datenmanipulations (DML)Anfrage (Query)-Sprache
SQL-92 weitgehend von den meisten DBHerstellern implementiert
Neuere Standards: SQL-99 und SQL3 (2003)
objektrelationale Erweiterung
XML
teilweise implementiert
2
Der SFW-Block
SELECT ...
FROM ...
WHERE ...
Standardform einer SQL-Anfrage
3
FROM Klausel
SELECT *
FROM Relationenliste
SELECT *
FROM Bücher
Liefert die gesamte Relation Bücher
4
Kartesisches Produkt
SELECT *
FROM R1, R2
R1
A
B
C
1
2
4
5
R12
R2
D
E
F
3
7
8
9
6
10
11
12
A
B
C
D
E
F
1
2
3
7
8
9
1
2
3
10
11
12
4
5
6
7
8
9
4
5
6
10
11
12
5
INNER JOIN
SELECT *
FROM R1, R2
WHERE R1.C=R2.D
R1
A
B
C
1
2
4
5
R12
SELECT *
FROM R1 INNER JOIN R2
ON R1.C=R2.D
R2
D
E
F
7
7
8
9
6
10
11
12
A
B
C
D
E
F
1
2
7
7
8
9
6
Natürlicher Verbund
SELECT * FROM R1 natural join R2
R1
A
B
C
1
2
4
5
R12
R2
B
E
F
7
5
8
9
6
10
11
12
A
B
C
B
E
F
4
5
6
5
8
9
Jene Zeilen werden verbunden, deren gleich benannte Attribute gleiche Werte haben.
7
Äußere Verbunde
Left Outer Join, Right Outer Join, Full Outer Join
8
OUTER JOINS
SELECT l.A, l.B, r.C
FROM links l LEFT OUTER JOIN rechts r ON l.B=r.B
SELECT l.A, r.B, r.C
FROM links l RIGHT OUTER JOIN rechts r ON l.B=r.B
SELECT l.A, l.B, r.C
FROM links l FULL OUTER JOIN rechts r ON l.B=r.B
9
SELECT
SELECT [DISTINCT] {attribute |
arithmetischer-ausdruck |
aggregat-funktion
FROM ...
Attribute werden festgelegt, die im Anfrageergebnis
erscheinen sollen
Entspricht Projektion in der relationalen Algebra
Beispiel: SELECT Preis FROM Artikel
10
SELECT II
Arithmetische Ausdrücke über Attributen und
Konstanten
Aggregatfunktionen über Attributen
SELECT Preis/1.4 FROM Artikel
SELECT SUM (Preis)
FROM Artikel
SELECT COUNT(*)
FROM Artikel
DISTINCT: Menge statt Multimenge
11
Projektionsergebnis
Menge oder Multimenge
12
Tupelvariablen und Relationennamen
Angabe der Attributnamen durch Präfix
ergänzen:
SELECT Bücher.ISBN FROM Bücher
Tupelvariable kann benutzt werden:
SELECT eins.ISBN, zwei.Titel
FROM Bücher eins, Bücher zwei
15
Tupelnamen und Relationennamen II
Welches Problem gibt es hier?
SELECT ISBN, Titel, Stichwort
FROM Bücher, Buch_Stichwort
WHERE Bücher.ISBN=Buch_Stichwort.ISBN
ISBN im SELECT-Teil ist nicht eindeutig
Richtig:
SELECT Bücher.ISBN, Titel, Stichwort
FROM Bücher, Buch_Stichwort
WHERE Bücher.ISBN=Buch_Stichwort.ISBN
16
WHERE Klausel
SELECT ...
FROM ...
WHERE Bedingung
Selektion von Tupeln der hinter FROM stehenden Relationen,
die der hinter WHERE stehenden Bedingung genügen
Entspricht Selektion in der relationalen Algebra
Bedingung:
Konstantenselektion
Attributselektion
Verbundbedingung
Bereichsselektion
Ungewissheitsselektion
NULL-Selektion
Quantifizierte Bedingungen
17
Verbundbedingung
Relation1.attribut=Relation2.attribut
Bsp. Natürlicher Verbund:
SELECT Bücher.Titel, Bücher_Stichwort.Stichwort
FROM Bücher, Buch_Stichwort
WHERE Bücher.ISBN = Buch_Stichwort.ISBN
18
Konstanten- und Attributselektion
Konstantenselektion
Vergleich eines Attributs mit einer Konstante
SELECT *
FROM Artikel
WHERE Preis < 100
Attribut-Selektion
Vergleich zweier Attribut mit kompatiblen
Wertebereichen
SELECT *
FROM Artikel
WHERE Einkaufspreis = Verkaufspreis
19
Bereichsselektion
Attribut BETWEEN konstante1 AND konstante2
Abkürzung für
Achtung: eigentlich von/bis [konstante1, konstante2]
Attribut ≥ konstante1 and attribut ≤ konstante2
Beispiel:
SELECT *
FROM Artikel
WHERE Preis BETWEEN 100 and 200
20
Ungewissheitsselektion
Attribut LIKE Spezialkonstante
Spezialkonstante kann beinhalten
% kein oder beliebig viele Zeichen
_ genau ein Zeichen
21
Ungewissheitsselektion II
Beispiel: Selektion von Büchern von
Benjamin/Cummings
SELECT * FROM Bücher WHERE Verlagsname LIKE
`Benj%Cummings%´
Ist Abkürzung für
SELECT * FROM Bücher
WHERE Verlagsname = `Benjamin Cummings´
OR Verlagsname = `Benjamin/Cummings´
OR Verlagsname = `Benjamin and Cummings´
OR Verlagsname = `BenjFJSLKDJFCummingsJFDLKJ´
usw.
22
Quantifizierte Bedingungen
Vergleich eines Attributs mit einer Menge
ALL, ANY, SOME
Bsp. ALL:
SELECT Note
FROM Prüft
WHERE Matrikelnr = 1234
AND Note ≥ ALL (SELECT Note FROM Prüft
WHERE Matrikelnr = 1234)
Gibt schlechteste Note des Studenten mit der
Matrikelnummer 1234 aus.
23
Quantifizierte Bedingungen II
Bsp. ANY
SELECT Name
FROM Student
WHERE Matrikelnr = ANY (SELECT Matrikelnr
FROM Prüft)
Selektiert Namen aller Studenten, die schon
geprüft wurden.
Unterschied ANY und SOME?
Keiner, sind identisch.
Grund: englische Grammatik.
24
Weitere Bedingungen
NULL-Selektion
Attribut IS NULL
Wählt Tupel aus, die bei einem bestimmten
Attribut Nullwerte enthalten
Verknüpfungen der Bedingungen
OR, AND, NOT
25
Relationales Modell: SQL-DDL
SQL-DDL umfasst alle Klauseln von
SQL, die mit Definition von
Typen
Wertebereichen
Relationenschemata
Integritätsbedingungen
zu tun haben.
SQL Datentypen
char(n)
varchar(n)
numeric(p,s), integer
blob oder raw für sehr große binäre Daten
clob für sehr große String-Attribute
date für Datumsangaben
xml für XML-Dokumente
...
Achtung: Datentypen sind teilweise Hersteller-spezifisch!!!
im DBMS-Manual nachlesen, wie der Datentyp definiert ist
SQL als Definitionssprache
Externe Ebene
create view
alter view
drop view
Konzeptuelle Ebene
create table
alter table
drop table
SQL als Definitionssprache II
Konzeptuelle Ebene
create domain
alter domain
drop domain
Interne Ebene
create index
alter index
drop index
CREATE TABLE Beispiele
CREATE TABLE Bücher
(ISBN char(10) NOT NULL,
Titel varchar(200),
Verlagsname varchar(30))
CREATE TABLE Bücher
(ISBN char(10),
Titel varchar(200),
Verlagsname varchar(30),
PRIMARY KEY (ISBN),
FOREIGN KEY (Verlagsname)
REFERENCES Verlage (Verlagsname))
Definition eines Wertebereichs
CREATE DOMAIN Gebiete varchar(20) DEFAULT `Informatik´
CREATE TABLE Vorlesungen (
Bezeichnung VARCHAR(80) NOT NULL,
SWS smallint,
Semester smallint,
Studiengang Gebiete)
CREATE TABLE Mitarbeiter (
PANR integer NOT NULL,
Fachbereich Gebiete,
Gehalt decimal(10,2),
Raum integer,
Einstellung date)
CHECK Klausel
CREATE TABLE Vorlesungen (
Bezeichnung varchar(80) PRIMARY KEY,
SWS smallint CHECK(SWS>=0),
Semester smallint CHECK (Semester BETWEEN 1 AND 9),
Studiengang Gebiete)
ALTER TABLE
ALTER TABLE relationenname
ADD spaltenname wertebereich
ALTER TABLE Lehrstühle
ADD Budget decimal(8,2)
Wirkung:
Änderung des Relationenschemas im Data-Dictionary.
Erweiterung der existierenden Tupel um ein Attribut, welches mit
NULL besetzt wird.
Angabe von default-Werten und check-Klausel möglich
ADD Budget decimal(8,2) DEFAULT 30000
CHECK (Budget > Anzahl_Planstellen * 3000)
ALTER und DROP für Attribute
ALTER spaltenname DATENTYP
ALTER spaltenname SET DEFAULT wert
Änderung des Datentyps
In Oracle: MODIFY spaltenname DATENTYP
Änderung der Defaultwerte
DROP spaltenname {RESTRICT | CASCADE}
Erlaubt Löschen von Attributen, falls
keine Sichten und Integritätsbedingungen mit Hilfe
dieses Attributs definiert wurden (im Fall RESTRICT)
Oder mit gleichzeitiger Löschung dieser Sichten und
Integritätsbedingungen (im Fall CASCADE)
DROP TABLE
DROP TABLE relationenname {RESTRICT |
CASCADE}
Löscht Tabelle (auch das Schema, nicht nur
den Inhalt)
RESTRICT und CASCADE analog zu DROP bei
Attributen
SQL Queries Teil 1
Schachtelung von Anfragen
WHERE Klausel kann geschachtelt werden
SFW Blöcke liefern im Allgemeinen mehrere
Werte
Vergleiche mit Wertemengen
Standardvergleiche in Verbindung mit Quantoren
ALL oder ANY
Spezielle Prädikate für den Zugriff auf Mengen IN
und EXISTS
37
Das IN-Prädikat und
geschachtelte Anfragen
Syntax
Attribut IN (SFW-Block)
Beispiel:
SELECT Titel FROM Bücher
WHERE ISBN IN
(SELECT ISBN FROM EMPFIEHLT)
Natürlicher Verbund mit nachfolgender
Projektion
38
Wie erfolgt die Abarbeitung
dieser SQL Abfrage?
Ergebnis der inneren SELECT Anweisung
hinter IN als Liste von Konstanten einsetzen
Dann Auswertung der modifizierten Anfrage:
Was liefert dies Abfrage also?
SELECT Titel
FROM Bücher
WHERE ISBN IN (1111, 2222, 3333, 4444)
Titel aller empfohlenen Bücher.
Liegt hier eine Verzahnung vor?
Nein, die innere Abfrage ist unabhängig von der
äußeren Abfrage!
39
Wie kann man die Abfrage
anders formulieren?
SELECT Titel
FROM Bücher, Empfiehlt
WHERE Bücher.ISBN=Empfiehlt.ISBN
Gibt es einen Unterschied zu vorher?
Duplikate kommen vor, falls ein Buch
mehrmals empfohlen wurde. Falls es keine
Bücher mit verschiedener ISBN aber gleichem
Titel gibt, liefert SELECT DISTINCT Titel ...
das gleiche Ergebnis.
40
Verzahnt geschachtelte Anfragen
In der inneren Anfrage Relationen oder TupelvariablenNamen aus dem FROM-Teil der äußeren Anfrage
verwenden:
SELECT Nachname
FROM Personen
WHERE 1.0 IN (SELECT Note
FROM Prüft
WHERE PANr=Personen.PANr)
Was liefert diese Anfrage?
Nachnamen aller Prüfer, die schon einmal die Note 1.0
gegeben haben.
41
Abarbeitung
1.
2.
3.
4.
In der äußeren Anfrage das erste Personen-Tupel
untersuchen und das Ergebnis in die innere Anfrage
einsetzen.
Innere Anfrage
SELECT Note
FROM Prüft
WHERE PANr=4711
auswerten. Liefert Werteliste (2.0, 3.0).
Ergebnis der inneren Anfrage in die äußere
einsetzen:
1.0 IN (2.0, 3.0) ergibt FALSE, d.h. ersten Prüfer
nicht berücksichtigen.
In der äußeren Anfrage das zweite Personen-Tupel
untersuchen usw.
42
Wie kann man diese Anfrage
anders formulieren?
SELECT Nachname
FROM Personen, Prüft
WHERE Personen.PANr=Prüft.PANr AND
Prüft.Note=1.0
Unterschied zu vorher?
Nachname wird mehrmals ausgegeben,
wenn ein Prof. mehrere 1er vergeben hat.
43
Noch eine andere Variante:
Umdrehen der Abfragen
SELECT Nachname
FROM Personen
WHERE PANr IN
(SELECT PANr
FROM Prüft
WHERE Note = 1.0)
Umdrehen ist generell möglich
Vorteil?
Nicht mehr verzahnt!
44
Was liefert diese SQL Abfrage?
SELECT Matrikelnummer
FROM Prüft
WHERE PANr IN (SELECT PANr
FROM Prüft
WHERE Matrikelnummer = 123)
Matrikelnummer aller Studenten, die zumindest einen
Prüfer mit dem Studenten 123 gemeinsam hatten.
Liegt hier eine Verzahnung vor?
Nein, der Gültigkeitsbereich der inneren FROM
Klausel bindet stärker.
45
Umformulierung mittels Verbund
SELECT A.Matrikelnummer
FROM Prüft A, Prüft B
WHERE B.Matrikelnummer = 123
AND A.PANr = B.PANr
46
Was ergibt folgende Anfrage?
SELECT X.PANr
FROM Prüft X
WHERE X.PANr IN (SELECT Y.PANr
FROM Prüft Y
WHERE Y.Matrikelnummer <>
X.Matrikelnummer)
Gibt PANr aller Prüfer aus, die mehr als einen
Studenten geprüft haben.
47
Umformulierung mittels Verbund
SELECT DISTINCT X.PANr
FROM Prüft X, Prüft Y
WHERE X.PANr = Y.PANr AND
X.Matrikelnummer <> Y.Matrikelnummer
48
Das EXISTS-Prädikat
Testet, ob das Ergebnis der inneren Anfrage nicht
leer ist.
SELECT ISBN
FROM BUCH_EXEMPLARE
WHERE EXISTS
(SELECT *
FROM Ausleihe
WHERE Inventarnr =
Buch_Exemplare.Inventarnr)
Was liefert diese Abfrage?
Die ISBN der ausgeliehenen Bücher.
49
Umformulierung mittels Verbund
SELECT ISBN
FROM Buch_Exemplare, Ausleihe
WHERE Ausleihe.Inventarnr =
Buch_Exemplare.Inventarnr
50
EXISTS: Simulation des
Allquantors
SELECT Lehrstuhlbezeichnung
FROM Professoren
WHERE NOT EXISTS
(SELECT *
FROM Liest
WHERE Liest.PANr = Professoren.PANr
AND NOT EXISTS
(SELECT *
FROM Prüft
WHERE Prüft.PANr = Professoren.PANr
AND Prüft.V_Bezeichnung=Liest.V_Bezeichnung))
Lehrstuhlbezeichnung von Professoren, die alle Vorlesungen
geprüft haben, die sie lesen
51
Simulation des Allquantors:
Mathematischer Hintergrund
Doppelte Negation
52
Professoren, die alle VO geprüft haben, die sie lesen
Professoren, die keine VO, die sie lesen, nicht geprüft haben
Professoren, sodass keine von diesem gelesene VO existiert,
für die von ihm keine Prüfung existiert.
SELECT Lehrstuhlbezeichnung
FROM Professoren
WHERE NOT EXISTS
(SELECT * FROM Liest
WHERE Liest.PANr = Professoren.PANr
AND NOT EXISTS
(SELECT *
FROM Prüft
WHERE Prüft.PANr = Professoren.PANr
AND Prüft.V_Bezeichnung=Liest.V_Bezeichnung))
53
Bsp. zur Vereinigung: Alle
Mitarbeiter und Studenten
SELECT svnr FROM Mitarbeiter
UNION
SELECT svnr FROM Studenten
Voraussetzungen
Gleiche Attribut-Anzahl
Attribute müssen positionsweise kompatibel sein
Duplikate werden eliminiert
UNION ALL verhindert dies
54
Bsp. zur Differenz: Alle Mitarbeiter,
die keine Studenten sind.
SELECT svnr FROM Mitarbeiter
EXCEPT
SELECT svnr FROM Studenten
Achtung: MINUS in Oracle
Wie kann man dies ohne EXCEPT simulieren?
SELECT svnr
FROM Mitarbeiter
WHERE svnr NOT IN (SELECT svnr FROM Studenten)
55
Bsp. zur Schnittmenge: Alle
Mitarbeiter, die auch Student sind
SELECT svnr FROM Mitarbeiter
INTERSECT
SELECT svnr FROM Studenten
Wie kann man dies ohne INTERSECT simulieren?
SELECT svnr
FROM Mitarbeiter
WHERE svnr IN (SELECT svnr FROM Studenten)
56
Quantoren und Mengenvergleiche
Syntax
Attribut {all | any | some}
(SELECT attribut FROM ... WHERE ...)
ALL ... Allquantor
ANY, SOME ... Existenzquantoren
Beispiel
SELECT Matrnr, Immatrikulationsdatum
IN
FROM Studenten
WHERE Matrnr = ANY (SELECT Matrnr FROM Prüft)
Ergebnis der Abfrage?
Studenten, die bereits geprüft wurden
57
Was macht folgende Abfrage?
SELECT Note FROM Prüft
WHERE Matrnr = 12
AND Note >= ALL (SELECT Note FROM Prüft
WHERE Matrnr=12)
Ermittelt schlechteste Note des Studenten 12
Bestimmt Maximalwert ohne Verwendung der
Aggregatfunktionen
Umformulierung:
SELECT MAX(Note)
FROM Prüft
WHERE Matrnr = 12
58
Geben Sie alle Bücher aus, an denen Vossen
und Witt gemeinsam als Autoren beteiligt
waren!
Buch = {ISBN, Titel, Autor}
Was gibt folgendes Statement:
SELECT ISBN FROM Buch WHERE
Autor=‘Vossen’ and Autor=‘Witt’
leere Ergebnismenge, da tupelweise
ausgewertet wird und nicht gleichzeitig
‘Vossen’ und ‘Witt’ in einem Tupel stehen
können.
59
Lösung mit Selbstverbund
SELECT b1.ISBN
FROM Buch b1, Buch b2
WHERE b1.ISBN=b2.ISBN AND b1.Autor=‘Vossen’
AND b2.Autor=‘Witt’
Umformulierung mittels IN Prädikat?
SELECT ISBN
FROM Buch b1
WHERE Autor= ‘Vossen’ AND ‘Witt’ IN (SELECT Autor
FROM Buch
WHERE ISBN=b1.ISBN)
60
Weitere Varianten
Weitere Umformulierung mittels IN Prädikat?
SELECT ISBN
FROM Buch
WHERE Autor= ‘Vossen’ AND ISBN IN (SELECT ISBN
FROM Buch
WHERE Autor=‘Witt’)
Weitere Umformulierung mittels Gruppierung?
SELECT ISBN
FROM Buch
WHERE Autor= ‘Vossen’ OR Autor=‘Witt’
GROUP BY ISBN
HAVING COUNT(*) = 2
61
SQL Queries Teil 2
Die Folien basieren auf:
Datenbanken: Konzepte und Sprachen, Andreas Heuer und Gunter Saake,
mitp-Verlag, 2. Auflage, 2000
Datenbanken: Konzepte und Sprachen, Gunter Saake, Kai-Uwe Sattler,
Andreas Heuer, mitp-Verlag, 3. Auflage, 2008
Datenbanksysteme – Eine Einführung, Alfons Kemper und Andre Eickler,
Oldenbourg Verlag, München, 6. Auflage, 2006.
SQL Performance Tuning, Peter Gulutzan and Trudy Pelzer, Addison-Wesley
2003.
63
Aggregatfunktionen
COUNT
SUM
Arithmetisches Mittel der Werte einer Spalte
MAX bzw. MIN
Summe der Werte einer Spalte
AVG
Anzahl der Werte einer Spalte oder im Falle von COUNT(*) die
Anzahl der Tupel einer Relation
Größter bzw. kleinster Werte einer Spalte
Vor Argument: DISTINCT oder ALL ( default)
Nullwerte werden vor der Anwendung (außer bei COUNT(*))
eliminiert
64
Aggregatfunktionen: Beispiele
SELECT SUM(Gehalt) FROM Mitarbeiter
SELECT COUNT(*) FROM Mitarbeiter
SELECT COUNT(DISTINCT Matrnr)
FROM PRÜFT
SELECT AVG(Note) FROM Prüft
WHERE Vorlesung = `Datenbanken´
65
GROUP BY und HAVING
Was macht folgendes Statement?
SELECT count(*) as Anzahl, PANr
FROM Ausleihe
GROUP BY PANr
HAVING count(*)>1
Gibt die Anzahl der ausgeliehenen Bücher pro Person aus,
vorausgesetzt diese Person hat mehr als 1 Buch ausgeborgt.
66
Gedankliche
Abarbeitungsreihenfolge
(5)
(1)
(2)
(3)
(4)
SELECT ...
FROM ...
[WHERE ...]
GROUP BY attributliste
HAVING bedingung (optional)
67
GROUP BY
Gruppierung von R nach G:
Für gleiche G werden die übrigen Attribute
R-G in einer geschachtelten Relation
gesammelt
G = Gruppierungsattribute
(d.h. jene, die mit der GROUP BY
Klausel ausgewählt werden)
R-G = Nicht-Gruppierungsattribute
68
HAVING
Selektionsbedingung auf gruppierter
Relation
darf Bezug nehmen auf
Gruppierungsattribute
beliebige Aggregatfunktionen (über NichtGruppierungsattributen*)
* auch über Gruppierungsattribute möglich,
macht aber i.a. keinen Sinn
69
Worauf darf man mit SELECT
Bezug nehmen?
Direkt auf die Gruppierungsattribute
Aggregatfunktionen (auf die Nicht-Gruppierungsattribute*)
*auch auf die Gruppierungsattribute möglich, macht aber i.a.
keinen Sinn
Warum?
siehe Beispiel auf der nächsten Folie
70
71
Zählen von Wertemengen
Was liefert folgende Abfrage:
SELECT DISTINCT X.PANR
FROM Prüft X
WHERE X.PANr IN (SELECT Y.PANr
FROM Prüft Y
WHERE X.Matrnr
<> Y.Matrnr)
Alle Prüfer, die mehr als einen Studenten
geprüft haben.
72
Alternative
SELECT DISTINCT X.PANr
FROM Prüft X, Prüft Y
WHERE X.PANr = Y.PANr
AND X.Matrnr <> Y.Matrnr
73
Weitere Alternativen
Mit <>ANY
SELECT DISTINCT X.PANR
FROM Prüft X
WHERE X.Matrikelnummer <> ANY (SELECT Y.Matrikelnummer
FROM Prüft Y
WHERE X.PANr = Y.PANr)
Mit Gruppierung
SELECT PANr
FROM Prüft
GROUP BY PANr
HAVING COUNT (DISTINCT Matrikelnummer) > 1
74
ORDER BY
Menge von Tupeln Liste von Tupeln
Syntax
Beispiel
ORDER BY attributliste
SELECT Matrnr, Note
FROM Prüft
WHERE Vorlesung = `DB 1´
ORDER BY Note DESC
Aufsteigend (ASC) oder absteigend (DESC)
sortieren
75
Behandlung von Nullwerten
Arithmetische Operationen: Ergebnis NULL, sobald Nullwert in die
Berechnung eingeht.
4 * NULL = NULL
Aggregatfunktionen: Nullwerte werden vor der Anwendung der
Funktion entfernt, mit Ausnahme von COUNT(*).
Fast alle Vergleiche mit NULL ergeben Wahrheitswert UNKNOWN (statt
TRUE oder FALSE).
10 + NULL = NULL
10 = NULL ergibt UNKNOWN
Ausnahmen: NULL IS NULL TRUE, NULL IS NOT NULL FALSE
WHERE Bedingung: es werden nur Tupel weitergereicht, für die
die Bedingung TRUE ist. Wenn die Bedingung zu UNKNOWN
auswertet, wird sie nicht ins Ergebnis aufgenommen.
Boolesche Ausdrücke: dreiwertige Logik
76
Behandlung von Nullwerten II
77
Was ergibt folgende Abfrage?
Studenten
SVNR
Vorname
Nachname
Semester
1
Max
Muster
NULL
2
Ilse
Muster
4
3
Sebastian
Muster
17
SELECT COUNT(*)
FROM Studenten
WHERE Semester < 13 OR Semester >=13
Ergibt 2, nicht 3
78
Änderungsoperationen
INSERT/UPDATE/DELETE
Eintupel-Operationen:
Einfügen/Ändern/Löschen von Tupeln in
Relationen oder Sichten
Z.B. Erfassung einer Buchausleihe
Mehrtupel-Operationen
Z.B. Erhöhe das Gehalt aller Mitarbeiter um
3%
79
INSERT
INSERT INTO Relation [(attr1, ..., attrN)]
VALUES (konstante_1, ..., konstante_N)
INSERT INTO Buch (Invnr, Titel)
VALUES (1234, `DB 1´)
INSERT INTO Buch
VALUES (1234, `DB1´, 2000, mitp)
INSERT INTO Relation [(attr1, ..., attrN)]
SQL-Anfrage
INSERT INTO Kunde (VN, NN, Bestellungen)
(SELECT VN, NN, 0 FROM Lieferant)
80
UPDATE
Syntax
UPDATE relation
SET attr1=ausdr1, ..., attrN=ausdrN
[WHERE Bedingung]
Beispiel
UPDATE Angestellte
SET Gehalt = Gehalt + 1000
WHERE Gehalt < 5000
81
DELETE
DELETE FROM Relation
WHERE Bedingung
DELETE FROM Ausleihe
WHERE Inventarnr = 1234
Löschen aller Tupel einer Relation:
DELETE FROM Ausleihe
82
SQL Query Performance Tuning
Es gibt eine Vielzahl von Möglichkeiten, Query
Performance zu verbessern.
Allerdings kann es sein, dass verschieden Varianten
auf verschiedenen DBMS unterschiedliche Wirkung
zeigen!
Testen Sie Ihre Optimierungen immer!
Das Test-Environment soll dabei möglichst ähnlich
dem Production-Environment sein, d.h. gleiche
Datenmenge, Last, etc.
83
Einige Beispiele für Tuning-Tipps
JOINS:
Verwenden Sie möglichst restriktive Ausdrücke, d.h. eliminieren Sie
unnötige Tupel.
Attribute, über die ein Join erfolgt, sollen möglichst den gleichen
Datentyp haben.
Ein Index auf einer der Tabellen ist oft sehr hilfreich. Indizes auf
beide Tabellen bringen oft keine weitere Verbesserung mehr.
...
Buch-Empfehlung:
SQL Performance Tuning, Peter Gulutzan and Trudy Pelzer,
Addison-Wesley 2003.
84
Künstliche Schlüssel
Häufig benötigt, wäre schwierig in Anwendungen oder von
Anwendungen in DB zu realisieren.
Sequenzgenerator in SQL:
CREATE SEQUENCE SeqName AS Datentyp
START WITH Startwert
INCREMENT BY Inkrementwert
MINVALUE Minimalwert MAXVALUE Maximalwert
CYCLE
Cycle: Beim Erreichen von MAXVALUE wird wieder mit
MINVALUE begonnen
85
Identitätspalte
Benutzt Sequenzgenerator, ohne diesen explizit anzulegen
CREATE TABLE Weine (
WeinID INT GENERATED ALWAYS AS IDENTITY (
START WITH 1 INCREMENT BY 1
MINVALUE 1 MAXVALUE 100000 CYCLE),
Name VARCHAR(20) NOT NULL,
Farbe VARCHAR(10),
Jahrgang INT,
Weingut VARCHAR(20))
INSERT INTO Weine VALUES (null, ‘Pinot Noir’, ‘Rot’, 1999,
‘Helena’)
null wird durch den neuen Wert der Sequenz ersetzt
Achtung: etwas andere Notation in ORACLE!
86