| 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 $\pi_{A_1, A_2}(\sigma_{B_1}(\sigma_{B_2}(R_1 \times (R_2 \times R_3))))$
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>\[\frac{(m_1 + m_2 + \dots){\color{red}!}}{m_1{\color{red}!} \cdot m_2{\color{red}!} \cdot \dots}\]</latex> |
|---|---|---|
| serialisierbarer (allgemeiner) Schedule | Durcheinander kann in Blockform gebracht werden | |
| serieller Schedule | Blockform | <latex>\[n{\color{red}!}\]</latex> |
Graph Zeichen
| Übergang | Markierung |
|---|---|
| $w_i(x) \rightarrow r_j(x)$ | wr(x) |
| $r_i(x) \rightarrow w_j(x)$ | rw(x) |
| $w_i(x) \rightarrow w_j(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 | ${\color{ForestGreen}Y} \subseteq {\color{red}X}$ | $\Longrightarrow$ | ${\color{red}X} \rightarrow {\color{ForestGreen}Y}$ |
|---|---|---|---|
| Verstärkung | ${\color{red}X} \rightarrow {\color{ForestGreen}Y}$ | $\Longrightarrow$ | ${\color{red}X}{\color{RoyalBlue}Z} \rightarrow {\color{ForestGreen}Y}{\color{RoyalBlue}Z}$ |
| Transistivität | ${\color{red}X} \rightarrow {\color{ForestGreen}Y} \wedge {\color{ForestGreen}Y} \rightarrow {\color{RoyalBlue}Z}$ | $\Longrightarrow$ | ${\color{red}X} \rightarrow {\color{RoyalBlue}Z}$ |
| Vereinigung | ${\color{red}X} \rightarrow {\color{ForestGreen}Y} \wedge {\color{red}X} \rightarrow {\color{RoyalBlue}Z}$ | $\Longrightarrow$ | ${\color{red}X} \rightarrow {\color{ForestGreen}Y}{\color{RoyalBlue}Z}$ |
| Dekomposition | ${\color{red}X} \rightarrow {\color{ForestGreen}Y}{\color{RoyalBlue}Z}$ | $\Longrightarrow$ | ${\color{red}X} \rightarrow {\color{ForestGreen}Y} \wedge {\color{red}X} \rightarrow {\color{RoyalBlue}Z}$ |
| Pseudotransitivität | ${\color{red}X} \rightarrow {\color{ForestGreen}Y} \wedge {\color{RoyalBlue}Z}{\color{ForestGreen}Y} \rightarrow V$ | $\Longrightarrow$ | ${\color{red}X}{\color{RoyalBlue}Z} \rightarrow 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 \rightarrow Y$ ist mindestens eins:
Keine (nicht trivialen) FDs unter Nicht-Schlüssel-Attributen
Bedingung
Jede FD $X \rightarrow Y$ ist mindestens eins:
Keine (nicht trivialen) FDs unter Schlüssel-Attributen
Wirkung
Nicht mehrere Tabellen in einer.
Bedingung
Jede MVD $X \twoheadrightarrow 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} | $\{ x_3 \mid \exists x_1, x_2 : (\text{Städte}(x_1, x_2, x_3) \wedge x_1 = \text{Passau}) \}$ |
| $\{ x_3 \mid \exists x_2 : (\text{Städte}(\text{Passau}, x_2, x_3)) \}$ | |
| CDU-regierte Städte | |
| Schema(t) = Schema(Städte) {t | Städte(t) ∧ (∃ u ∈ Länder)(u.Lname = t.Land ∧ u.Partei = CDU) } | $\{x_1 \mid \exists x_2, x_3, y_2 : (\text{Städte}(x_1, x_2, x_3) \wedge \text{Länder}(x_3, y_2, \text{CDU}))\}$ |
| SPD alleinregierte Länder | |
| Schema(t) = SChema(Länder) {t | Länder(t) ∧ (∀ u ∈ Länder)(u.LName = t.LName ⇒ u.Partei = SPD} | $\{x_1 \mid \exists x_2 : (\text{Länder}(x_1, x_2, \text{SPD}) \wedge \neg \exists y_3 : \text{Länder}(x_1, x_2, y_3) \wedge y_3 \ne \text{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
$\text{Belegungsfaktor} = \frac{\text{Alle Schlüssel}}{\text{Kapazität in \textit{Primär}seite}} > 0.8 \Rightarrow \text{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 \bowtie B$ | Vergleich aller gleichbenannten |
JOIN t USING(id) | Equi Join | $A \underset{a = b}{\bowtie} B$ | |
JOIN t ON f | Theta Join | $A \underset{a \Theta b}{\bowtie} B$ | Θ = 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 |
INSERT 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)