Anwendungen (mehrere) | |
Externe Ebene | Views (mehrere) |
---|---|
↓↓ Logische Datenunabhängigkeit ↓↓ | |
Konzeptionelle Ebene | |
↓↓ Physische Datenunabhängigkeit ↓↓ | |
Interne Ebene | Speicherformat |
| Anfrage (deklarativ) ↓ |
Scanner/Parser/View-Erzeuger |
---|
| algebraischer Ausdruck ↓ |
Anfrageoptimierung |
| Auswertungsplan (prozedural) ↓ |
Ausführung |
Query in Funktionsbaum übersetzten
WHERE
Bedingung einzeln
Beispiel
SELECT A1, A2 FROM R1, R2, R3 WHERE B1, B2
Ergibt πA1,A2(σB1(σB2(R1×(R2×R3))))
Optimierung: Filter so früh wie möglich
Technische Fehler
Wann | Was | Undo | Redo |
---|---|---|---|
Transaktionsfehler | Rücksetzen | Lokales Undo nicht abgeschlossene Transaktion rückgängig | |
Systemfehler | Warmstart | Globales Undo nicht abgeschlossene Transaktionen rückgängig | Globales Redo Alle abgeschlossenen Transaktionen nachholen |
Medienfehler | Kaltstart | Backup einspielen | Globales Redo Alle abgeschlossenen Transaktionen nachholen |
t1 | r(x) | w(x) | |
---|---|---|---|
t2 | w(x) |
t1 | w(x) | w(x) | |
---|---|---|---|
t2 | r(x) |
t1 | r(x) | r(x) | |
---|---|---|---|
t2 | w(x) |
Non-repeatable read mit Aggregiertem read
allgemeiner Schedule | Durcheinander | <latex>(m1+m2+…)!m1!⋅m2!⋅…</latex> |
---|---|---|
serialisierbarer (allgemeiner) Schedule | Durcheinander kann in Blockform gebracht werden | |
serieller Schedule | Blockform | <latex>n!</latex> |
Graph Zeichen
Übergang | Markierung |
---|---|
wi(x)→rj(x) | wr(x) |
ri(x)→wj(x) | rw(x) |
wi(x)→wj(x) | ww(x) |
Kein rr(x)
Zyklenfrei? ⇒ Serialisierbar durch topologisches sorieren
Thin client | Fat client | Stored procedure | Web Application | Application Server | |
---|---|---|---|---|---|
Client | GUI | GUI Logik | GUI Hauptprogramm | Browser | GUI |
Application Server | Logik | ||||
DB-Server | Logik DB-Schnittstelle DB | DB-Schnittstelle DB | Prozeduren DB-Schnittstelle DB | Webserver Logik DB-Schnittstelle DB | DB-Schnittstelle DB |
Vorübersetzes SQL mit Platzhaltern
Reflexivität | Y⊆X | ⟹ | X→Y |
---|---|---|---|
Verstärkung | X→Y | ⟹ | XZ→YZ |
Transistivität | X→Y∧Y→Z | ⟹ | X→Z |
Vereinigung | X→Y∧X→Z | ⟹ | X→YZ |
Dekomposition | X→YZ | ⟹ | X→Y∧X→Z |
Pseudotransitivität | X→Y∧ZY→V | ⟹ | XZ→V |
AttrHülle(F,X) mit
F = FDs
X = Start Attributmenge
Starte mit X und wende so lange F ab, bis nichts mehr geht. (“Schau wie weit du kommst”)
Bedingung
Alle Attribute atomar
Attributwerte dürfen nicht …
Bedingung
Jedes Attribut entweder
voll funktional Abhängig von jedem Schlüsselkandidaten
– oder –
prim (teil eines Schlüsselkandidaten)
Trivial: nur ein einelementiger Schlüsselkandidat ⇒ 2. NF
Sonst: Vom Schlüssel nicht voll funktional Abhängige Attribute werden herausgelöst, in eigene Tabelle
Bedingung
Jede FD X→Y ist mindestens eins:
Keine (nicht trivialen) FDs unter Nicht-Schlüssel-Attributen
Bedingung
Jede FD X→Y ist mindestens eins:
Keine (nicht trivialen) FDs unter Schlüssel-Attributen
Wirkung
Nicht mehrere Tabellen in einer.
Bedingung
Jede MVD X↠Y ist mindestens eins:
MVD (Multi Valued Dependency): Mehre Attributwerte, eines Attributs, sind von der linken Seite abhängig.
(Minimal bedeutet nicht: Die wenigsten Attribute)
Schlüssel und FD sind semantische Eigenschaften (nicht anhand von aktueller Ausprägung erkennbar)
Primes Attribut: Teil eines Schlüsselkandidaten
Beispiel: Beweise das S = (A, B) Schlüsselkandidat ist.
Schema | R = (id:Integer, Name:String) |
---|---|
Ausprägung | r = {(1, Alice), (2, Bob), (42, Eve)} |
Schema | R = {id, Name} mit dom(id) = Integer, dom(Name) = String |
---|---|
Ausprägung | r = {t1, t2, t3} mit t1(id) = 1, t1(Name) = Alice, t2(id) = 2, t2(Name) = Bob, t3(id) = 42, t3(Name) = Eve |
Identisch
DISTINCT
bei umsetzung!!)
t ∈ Schema ⇔ Schema(t) t[A] ⇔ t.A
Ψ(r | t): Ersetze t in Ψ(r | t) mit dem konkreten Tupel r
Quantoren sind nur im Relationenkalkül möglich.
Variable ist …
Es ist möglich unendlich (nicht speicherbare) Relationen zu beschreiben.
Eine Relation ist sicher wenn alle Vaiablen x einer (gespeicherten) Relation angehören Schema(x).
Tupelkalkül | Bereichskalkül |
---|---|
Alle Großstädte in Bayern | |
Schema(t) = Schema(Städte) {t | Städte(t) ∧ f[Land] = Bayern ∧ t[SEinw] ≥ 500000} | |
In welchem Land liegt Passau | |
Schema(t) = (Land:String) {t | (∃ u ∈ Städte)(u.Sname = Passau ∧ u.Land = t.Land} | {x3∣∃x1,x2:(Städte(x1,x2,x3)∧x1=Passau)} |
{x3∣∃x2:(Städte(Passau,x2,x3))} | |
CDU-regierte Städte | |
Schema(t) = Schema(Städte) {t | Städte(t) ∧ (∃ u ∈ Länder)(u.Lname = t.Land ∧ u.Partei = CDU) } | {x1∣∃x2,x3,y2:(Städte(x1,x2,x3)∧Länder(x3,y2,CDU))} |
SPD alleinregierte Länder | |
Schema(t) = SChema(Länder) {t | Länder(t) ∧ (∀ u ∈ Länder)(u.LName = t.LName ⇒ u.Partei = SPD} | {x1∣∃x2:(Länder(x1,x2,SPD)∧¬∃y3:Länder(x1,x2,y3)∧y3≠SPD} |
Schema(t) = SChema(Länder) {t | Länder(t) ∧ (∀ u ∈ Länder)(u.LName = t.LName ⇒ u.Partei = SPD} |
Jeder zusätzlich Schlüssel wirkt sich negativ auf updates aus.
Seitenarten (für Daten- und Raumorganisierende Strukturen)
Schlüsselarten
Belegungsfaktor=Alle SchlüsselKapazität in \textit{Primär}seite>0.8⇒Expansion
LIKE “Horst%”
mehrere Attribute
Elemente:
Umsetzen:
integer | integer4 | int | |
smallint | integer2 | ||
float( p) | float | Bits der mantisse (nicht Exponent) | |
decimal( p, q) | numeric( p, q) | Exakte Komma Zahlen. p Stellen gesamt, davon q Nachkommastellen. | |
character( n) | char( n) | ||
character varying( n) | varchar( n) | ||
date | |||
time | |||
timestamp |
http://www.postgresql.org/docs/9.2/static/datatype-numeric.html
NOT NULL
PRIMARY KEY
UNIQUE
REFERENCES
t(
a)
DEFAULT
w
CHECK
f
PRIMARY KEY (
a1,
a2, …)
UNIQUE (
a1,
a2, …)
FOREIGN KEY (
a1,
a2, …) REFERENCES
t(
b1,
b2, …)
CHECK
f
UNIQUE
UNIQUE (
a1,
a2, …)
PRIMARY KEY
PRIMARY KEY (
a1,
a2, …)
REFERENCES
t(
a)
FOREIGN KEY (
a1,
a2, …) REFERENCES
t(
b1,
b2, …)
Folgende sachen können am Ende einer REFERENCES
Angabe stehen
ON DELETE SET NULL
NULL
gesetzt
ON DELETE CASCADE
ON UPDATE CASCADE
a + b | a - b | a * b | a / b |
a = b | a <> b | ||
a < b | a > b | a <= b | a >= b |
x BETWEEN a AND b | |||
a IS NULL | a IS NOT NULL | ||
a IN (…) | |||
a AND b | a OR b | a NOT b |
s1 || s2 | CHAR_LENGTH(s) | SUBSTRING(s FROM pos [FOR len]) | a LIKE '...' |
%
0…n beliebige Zeichen
_
1 beliebiges Zeichen
CREATE TABLE name ( name typ constraints, name typ constraints, integritätsbedingungen )
DROP TABLE name
ALTER TABLE name ADD ( name typ constraints, name typ constraints )
ALTER TABLE name DROP ( name, name )
ALTER TABLE name MODIFY ( name typ constraints, name typ constraints )
SELECT [DISTINCT] *, t.*, t.a, 42, 32 AS Foo -- Hier AS FROM t, Unisinn u, -- KEIN AS (SELECT ...) WHERE
INSERT INTO name [(a1, a2)] VALUES (v11, v21), (v12, v22)
INSERT INTO name (a1, a2) (SELECT ...)
UPDATE name SET a1=v1, a2=v2 [WHERE ...]
DELETE FROM name [WHERE ...]
GRANT ALL ALL PRIVILEGES SELECT INSERT DELETE UPDATE UPDATE(a, b) ON t TO TU PUBLIC, userName [WIDTH GRANT OPTION]
REVOKE ALL ALL PRIVILEGES SELECT INSERT DELETE UPDATE UPDATE(a, b) ON t FROM TU PUBLIC, userName [RESTRICT | CASCADE] -- RESTRICT: Nur den user löschen -- CASCADE: nehme die rechte auch denjenigen, die sie vom user bekommen haben
CREATE INDEX name ON t (a1, a2, ...); DROP INDEX name;
-- Laut script kein START TRANSACTION SET TRANSACTION READ-ONLY -- kein INSERT, UPDATE und DELETE. Dafür bessere Transaktionsplanung SET TRANSACTION READ-WRITE -- default SAVEPOINT name COMMIT ROLLBACK ROLLBACK TO name
NATURAL JOIN t | Natural Join | A⋈B | Vergleich aller gleichbenannten |
JOIN t USING(id) | Equi Join | A⋈a=bB | |
JOIN t ON f | Theta Join | A⋈aΘbB | Θ = Vergleichsoperator |
Join Art | Verlustfreie Seite | NULL | ||
---|---|---|---|---|
L | R | L | R | |
[INNER] JOIN | ||||
LEFT [OUTER] JOIN | ✓ | ✓ | ||
RIGHT [OUTER] JOIN | ✓ | ✓ | ||
FULL [OUTER] JOIN | ✓ | ✓ | ✓ | ✓ |
WHERE EXISTS (SELECT ...) -- Ergebnis Form egal WHERE NOT EXISTS (SELECT ...) -- Ergebnis Form egal WHERE ... a Θ ALL (SELECT ...) -- Ergebnis genau ein Attribut, aber mehre Tupel WHERE ... a Θ SOME/MANY (SELECT ...) -- Ergebnis genau ein Attribut, aber mehre Tupel WHERE ... a IN (SELECT ...) -- Ergebnis genau ein Attribut, aber mehre Tupel
GROUP BY x HAVING SUM(y) > 42
keine Aggregartfunktionen in WHERE
In SELECT
nur erlaubt
COUNT
SUM
AVG
MAX
MIN
In SELECT
nicht erlaubt
MAX(x)
Befehl | Zähle | |
---|---|---|
NULL | doppelte | |
COUNT(DISTINCT a) | ||
COUNT([ALL] a) | ✓ | |
COUNT(*) | ✓ | ✓ |
ORDER BY a [ASC/DESC], b [ASC/DESC], ...
ASC
: 0, 1, 2, … (default)
DESC
: 9, 8, 7, …
Typ jedes Attributs muss kompatibel sein
[Im Gegensatz zur relationalen Algebra, wo Typ und Name jedes Attributs übereinstimmen muss (Schemata identisch)]
SELECT ... UNION/UNION ALL/EXCEPT/MINUS/INTERSECT [CORRESPONDING] SELECT ...
CORRESPONDING
beschränkt Ergebniss auf gleiche Namen. Die Position ist dann egal.
SELECT
NULL
in SELECT
bei fehlenden Werten.
Nutzen
CREATE [OR REPLACE] VIEW v AS SELECT ... DROP VIEW v
Nicht erlaubt in Basisrelation:
ORDER BY
INSERT INTO mv (SELECT ...)
Kein merkbarer unterschied zwischen View und Relation
Teil im View | Angewendete Operation | Problembeschreibung |
---|---|---|
SELECT | INSERT | Default (NULL ) für wegprojezierte Attribute |
INSER T UPDATE DELETE | Nicht möglich, wenn DISTINCT oder arithmetische Ausdrücke |
|
WHERE | INSERT UPDATE | Tupel-Migration: Tupel verschwindet, da nicht von WHERE erfasst Abhilfe: WHERE … WITH CHECK OPTION |
JOIN GROUP BY | INSERT UPDATE DELETE | Nicht möglich |
Subquerry | INSERT UPDATE DELETE | Nicht möglich, wenn Selbstbezug |
Finde Paare mit gleicher Eigenschaft <code sql> SELECT DISTINCT t1.name, t2.name FROM Foo t1, Foo t2 WHERE
t1.attrib = t2.attrib AND t1.name < t2.name -- Macht aus (AA, AB, BA, BB) : (AB)