prev up next

SQL

SQL wird ausführlich behandelt in Kapitel 7. Hier sei nur vorab auf die offensichtliche Verwandtschaft mit der Relationenalgebra und dem Relationenkalkül hingewiesen:

Query: Die Namen der Studenten, die 4-stündige Vorlesungen hören:

select s.name
from studenten s, hoeren h, vorlesungen v
where s.matrnr = h.matrnr
and   h.vorlnr = v.vorlnr
and   v.sws    = 4

Query: Die Namen der Studenten, die jeweils alle 4-stündigen Vorlesungen hören:

Wir erinnern uns an die entsprechende Formulierung im relationalen Tupelkalkül:


\begin{displaymath}\{s.name \mid s \in Studenten \wedge \forall v \in Vorlesungen\end{displaymath}


\begin{displaymath}(v.SWS=4 \Rightarrow \exists h \in h\uml {o}ren(h.VorlNr = v.VorlNr \wedge h.MatrNr = s. MatrNr))\}\end{displaymath}

SQL kennt keinen All-Quantor (wohl aber einen Existenz-Quantor) und auch keinen Implikationsoperator. Wir nutzen daher folgende Äquivalenzen:

$\forall t \in R(P(t))$ ist äquivalent zu $\neg (\exists t \in
R(\neg(t)))$
$A \Rightarrow B$ ist äquivalent zu $\neg A \vee B$
$\neg (A \vee B)$ ist äquivalent zu $\neg A \wedge \neg B$

Daher lässt sich der obige Ausdruck umformen in


\begin{displaymath}\{s.name \mid s \in Studenten \wedge \neg (\exists v \in Vorlesungen\end{displaymath}


\begin{displaymath}( v.SWS=4 \wedge \neg \exists h \in h\uml {o}ren(h.VorlNr = v.VorlNr \wedge
h.MatrNr = s. MatrNr)))\}\end{displaymath}

Daraus entsteht unmittelbar die SQL-Query

select s.name from Studenten s
where not exists
   (select * from vorlesungen v
    where sws=4 and not exists
       (select * from hoeren h
        where h.vorlnr = v.vorlnr
          and h.matrnr = s.matrnr))


prev up next