Sprachen / SQL / Tupelkalkül

Tupelkalkuel

Syntaktischer Aufbau

Die Syntax des Tupelkalküls (TK) ist vom prinzipiellen Aufbau wie der Bereichskalkül: Eine Anfrage besteht aus Termen (35, 'Wort'), atomaren Formeln und Formeln (φ), wobei atomare Formeln auch Formel sind und Formeln aus Formeln bestehen können, die durch einen logischen Operator (Θ) verbunden sind.

{r : (A1[: D1], ..., An[: Dn]) | φ}

Der entscheidende Unterschied zum Bereichskalkül ist, dass die Variablen nicht zu den einzelnen Datentypen, sondern ganzen Tupeln zugeordnet werden. Diese Tupelvariablen rangieren über dem Kreuzprodukt von den Datentypen zusammen mit den Komponentennamen. Am besten lässt sich dies an einen Beispiel demonstrieren.

Beispiel

Gegeben sind zwei Tabellen (Mitarbeiter, Projekt), die referentiell durch das Attribut ProjNr miteinander in Beziehung stehen.

MITARBEITER
Name ProjNr
Dennis 1
Dennis 3
Ken 1

PROJEKT
ProjNr Projektname Budget
1 UNIX 300 $
2 MULTICS 20.300.000 $
3 C 20 $

Anfrage: Gib mir alle Projektnamen, an denen Dennis arbeitet!

{r : (Projektname:string) | p:(ProjNr:int, Projektname:string, Budget:int), m:(Name:string, ProjNr:int) (PROJEKT(p) ∧ MITARBEITER(m) ∧ m.name = 'Dennis' ∧ m.ProjNr = p.ProjNr ∧ r.projektname = p.projektname)

Ziemlich aufwendig. Tupelkalkül in Reinkultur. Diese Formel lässt sich jedoch verkleinern, da die Datentypen nicht angegeben werden müssen (siehe ...[:D1]... in der oberen Formel):

{r : (Projektname) | ∃ p:PROJEKT, m:MITARBEITER (m.name = 'Dennis' ∧ m.ProjNr = p.ProjNr ∧ r.projektname = p.projektname)

In SQL würde die Anfrage so aussehen:

mysql> select p.projektname from MITARBEITER m, PROJEKT p where m.name = "Dennis" and m.ProjNr = p.ProjNr;

Aus dieser SQL-Anweisung lässt sich das Schema bzw. die Syntax des Tupelkalküls erkennen. An folgendes sei noch mal erinnert: Die Auswertungsreihenfolge von SQL: 1. from-Klausel (p:PROJEKT,m:MITARBEITER), 2. where-Klausel (m.name = "Dennis"), 3. die select-Klausel (r:(Projektname)). Zuerst wird also geschaut, welche Variablen deklariert werden, daraus wird das Kreuzprodukt gebildet und dann findet die Selektion und anschließend die Projektion statt.

In der letzten SQL-Anweisung wurden explizite Tupelvariablen verwendet (um die Parallelen zum Tupel Kalkül zu zeigen). Dies ist jedoch nicht immer notwendig. SQL bietet auch die Möglichkeit an implizite Tupelvariablen (Name der Relation) zu verwenden.

mysql> select projektname from MITARBEITER, PROJEKT where name = "Dennis" and MITARBEITER.ProjNr = PROJEKT.ProjNr;
Autor: behalx
Erstellt am: 18.05.2011
Zuletzt modifiziert: 18.05.2011
Lizenz:
Creative Commons License