SQL

Werbung
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
Herunterladen