📎

Allquantor erstellen

Allquantor

"Allquantifizierte Queries"

SQL hat keinen Allquantor, es gibt 4 Workarounds.

Beispiel

Wähle Studenten die alle 4h LVAs gehört haben.

Student ( MatrNr, Name, Semester )
hören ( MatrNr, VorlNr )
Vorlesung ( VorlNr, Titel, SWS, gelesenVon )

1. Logische Äquivalenz (Empfohlen)

durch 2 x not exists

Logische Umformung: ∀xF(x)⇔¬∃x(¬F(x))\forall x F(x) \Leftrightarrow \neg \exists x(\neg F(x))

Wir suchen Studenten der nicht eine 4h LVA nicht gehört hat.

select s.*
from Student s
where not exists
( select *
from Vorlesung v
where v.SWS = 4 and not exists
( select *
from hören h
where h.VorlNr = v.VorlNr
and s.MatrNr = h.MatrNr ));

2. Teilmengen

durch exist und except

Menge aller 4h LVAs ⊆\sube Menge aller von Student gehörten LVAs (Operator existiert nicht in SQL)

Menge aller 4h LVAs −- Menge aller von Student gehörten LVAs = ∅\small \emptywenn alle gehört

select s.*
from Student s
where not exists
((select VorlNr
from Vorlesung v
where v.SWS = 4)
except
(select VorlNr
from hören h
where h.MatrNr = s.MatrNr))

3. Abzählen (Nicht empfohlen)

durch count

# 4h LVAs jeder Student besucht hat = # 4h LVAs die es gibt

select s.MatrNr, s.Name
from Student s, hören h, Vorlesung v
where s.MatrNr = h.Matrnr and
h.VorlNr = v.VorlNr and
vSWS = 4
group by s.MatrNr, s.Name
having count (*) =
(select count (*) from Vorlesung where SWS = 4);

4. Division aus Relationaler Algebra

durch 2x except

  1. Finde Kreuzprodukt von Student und Vorlesung mit 4h

    = Tupel die alles was ein Student hören kann beschreiben

  1. Ziehe von Kreuzprodukt alles was studenten bisher gehört haben ab

    = Alle Studenten die bisher nicht alles gehört haben

  1. Ziehe von allen Studenten, die die nicht alles gehört haben ab

    = alle Studenten die alles gehört haben

	(select sja.MatrNr from Student sja) -- Alle studenten die es gibt
except
(select snein.MatrNr                 -- Alle Studenten die nicht alles gehört haben
from (
(select s.MatrNr, v.VorlNr
from Student s, Vorlesung v
where v.SWS = 4)
except
(select *
from hören)
)
snein);