Skip to forum
Benachrichtigungen
Alles löschen

Datenbanken - Relationale Algebra und SQL

13 Beiträge
6 Benutzer
0 Reactions
1,263 Ansichten
Doomslayer
Joined: 24.11.2007

Moin,
ich mache zur Zeit die 5. Übung im Fach Datenbanken. Da die Übungen Vorleistungen sind und die Bewertung extrem Übel ist, wäre es nett, wenn jemand meine Lösungen mal anschauen und mich auf eventuelle Fehler hinweisen könnte. Bereits minimalste Fehler führen zu extremem Punktabzug. Um die Klausur mitzuschreiben, brauche ich bei den nächsten Übungen mind. 80% der Punkte.

Zur Aufgabe:

Das benötigte Schema aus Übung 4:

Meine Lösungen:

1a)
Pi[Prüfer] (Sigma[((Prüfung.Matrikel_Nr = Student.Matrikel_Nr) ^ (Student.Fachbereich_Nr = Fachbereich.Fachbereich_Nr) ^ (F_Name = 'Umwelt und Nachhaltigkeit')] (Prüfung x Student x Fachbereich))

1b)
edit: In SQL hätte ich ne Lösung, aber keine Ahnung wie man das in relationale Algebra übersetzt:

SELECT Hausmeister, COUNT (Hausmeister) AS NumOccurences
FROM Gebäude
GROUP BY Hausmeister
HAVING (COUNT (Hausmeister) > 1);

2a)
SELECT Prodekan, F_Name
FROM Fachbereich, Prüfung, Student
WHERE ((Prodekan = Prüfer) AND (Prüfung.Matrikel_Nr = Student.Matrikel_Nr) AND (Student.Fachbereich_Nr <> Fachbereich.Fachbereich_Nr));

Sollte soweit stimmen, zumindest spuckt sie das gewünschte Ergebnis aus, wenn ich es in Access teste.

2b)
SELECT Prüfer
FROM Prüfung
EXCEPT
SELECT Prüfer
FROM Prüfung
WHERE (Note = 1);

Die funktioniert in Access leider nicht, angeblich ist irgendwas in der FROM Anweisung falsch, kann leider nicht nachvollziehen wieso.


Antwort
Zitat
12 replies
Kreatief
Joined: 28.01.2006

2b) Verstehe ich es falsch oder ist es so einfach?

SELECT Prüfer FROM Prüfung WHERE Note <> 1;


Antwort
Zitat
Doomslayer
Joined: 24.11.2007

Das hatte ich zuerst. Es funktioniert zwar prinzipiell, nur krieg ich dann die Namen der Prüfer mehrfach ausgegeben. Beispiel: Prüfer Schmidt bewertet einmal mit 2, einmal mit 5, dann ist der Name 2 mal in der Ergebnistabelle.


Antwort
Zitat
neppi88
Joined: 20.02.2007

Original von Doomslayer
Das hatte ich zuerst. Es funktioniert zwar prinzipiell, nur krieg ich dann die Namen der Prüfer mehrfach ausgegeben. Beispiel: Prüfer Schmidt bewertet einmal mit 2, einmal mit 5, dann ist der Name 2 mal in der Ergebnistabelle.

Versuchs dann mal mit

SELECT DISTINCT ...

Wär noch cool wenn du die Definitionen eures Profs für Pi, Sigma etc posten könntest


Antwort
Zitat
Doomslayer
Joined: 24.11.2007

Danke, so funktioniert die 2b:

SELECT DISTINCT Prüfer
FROM Prüfung
WHERE (Note <> 1);

Pi ist im Prinzip so wie SELECT, damit wählt man aus was man haben will.
Sigma ist sowas wie WHERE, also die Bedingung.
http://de.wikipedia.org/wiki/Relationenalgebra#Operationen


Antwort
Zitat
neppi88
Joined: 20.02.2007

Ich kenn deren Bedeutung bloß die Definitionen variieren manchmal von prof zu prof daher frag ich =)


Antwort
Zitat
pure
Joined: 28.02.2006

Original von Doomslayer
Danke, so funktioniert die 2b:

SELECT DISTINCT Prüfer
FROM Prüfung
WHERE (Note <> 1);

das sagt dir nur, wer schon mal eine prüfung mit <>1 bewertet hat. gewünscht ist imo folgendes:

SELECT
Prüfer
FROM Prüfung
GROUP BY Prüfer
HAVING MIN(Note)>1;


Antwort
Zitat
Speedy84
Joined: 12.02.2007

Und noch ne Alternative:

SELECT DISTINCT prüfer
FROM prüfung
where prüfer not in
(SELECT Prüfer
FROM PRÜFUNG
Where note = '1')


Antwort
Zitat
Doomslayer
Joined: 24.11.2007

Besten Dank!

Jetzt fehlt noch die 1b, leider haben wir bisher keine annähernd ähnlichen Beispiele in Relationenalgebra gehabt, weshalb ich grad keine Ahnung habe wie man das schreiben könnte. Meine SQL Lösung funzt in Access, man müsste es halt nur noch "übersetzen".


Antwort
Zitat
philwen
Joined: 13.05.2007

Eigentlich müsste doch auch folgendes funktionieren:

Select Hausmeister from Gebäude
Group by Hausmeister

in rel. Algebra sind Aggregats und Group funktionen relativ doof, würd dann glaub ich so ausschauen:

(Hausmeister)_G(Gebäudetabelle)

das hausmeister steht "unterhalb" von G, siehe:

http://en.wikipedia.org/wiki/Relational_algebra#Aggregation

hab grad kein sql da um mein statement zu prüfen und bin da auch nicht wirklich experte ;)

edit:
habs mitm sql-testing tool von der TUM ( http://www-db.in.tum.de/~muehe/sql/ ) ausprobiert und funktioniert:
Hab ne Tabelle mit Create erstellt:

Select * from Gebaude

und amit abgefragt:

Select Hausmeister from Gebaude 
group by Hausmeister

EDIT:
hab das "mehr als 1 gebäude" überlesen


Antwort
Zitat
philwen
Joined: 13.05.2007

Nochmal einen neuen Post zwecks Übersichtlichkeit:

Meine SQL Variante:

SELECT Hausmeister FROM
    ( SELECT Hausmeister, Count(GebaudeNR)As Anzahlgebaude 
      FROM Gebaude 
      GROUP BY Hausmeister) as HausmeisterListe 
WHERE HausmeisterListe.Anzahlgebaude > 1

Rel. Algebra:

Pi_Hausmeister ( Sigma_(Anzahlgebäude > 1) (Hausmeister_G_(Count(Gebäude) As Anzahlgebäude) (Gebäude )))

bzw zwecks lesbarkeit:

Projektion ( Selektion ( Group_G_Count (Gebäude)))

und:
Projektion = "Hausmeister"
Selektion = "AnzahlGebäude > 1"
Group = "Hausmeister"
Count = "Count(Gebäude) As AnzahlGebäude"


Antwort
Zitat
Doomslayer
Joined: 24.11.2007

Moin,
super, vielen Dank philwen!

Mir ist auch noch eine Lösung für die 1b eingefallen:

SELECT DISTINCT G1.Hausmeister
FROM Gebäude AS G1, Gebäude AS G2
WHERE ((G1.Gebäude <> G2.Gebäude)AND(G1.Hausmeister = G2.Hausmeister));

Wäre in Relationenalgebra dann:

pi[G1.Hausmeister] (sigma[(G1.Gebäude <> G2.Gebäude) ^ (G1.Hausmeister = G2.Hausmeister)] (p[G1](Gebäude) x p[G2](Gebäude)))

pi = Projektion
sigma = Selektion
p = Umbenennung

Auf die Lösung bin ich erst gekommen, als ich rausgefunden hab, dass man durch die Umbenennung ja auch eine Relation mehrfach in einer Abfrage verwenden kann.

Nochmal vielen Dank an alle für die Hilfe!


Antwort
Zitat
Doomslayer
Joined: 24.11.2007

Moin,
nächste Übung:

Meine Lösungen:

1a)
SELECT DISTINCT F_Name
FROM Prüfung, Student, Fachbereich
WHERE ((Fach = 'Algorithmen und Datenstrukturen') AND (Prüfung.Matrikel_Nr = Student.Matrikel_Nr) AND (Student.Fachbereich_Nr = Fachbereich.Fachbereich_Nr));

Relationenalgebra:
pi[F_name] (sigma[(Fach = 'Algorithmen und Datenstrukturen') ^ (Prüfung.Matrikel_Nr = Student.Matrikel_Nr) ^ (Student.Fachbereich_Nr = Fachbereich.Fachbereich_Nr)] (Prüfung x Student x Fachbereich))

1b)
SELECT DISTINCT Hausmeister
FROM Gebäude, Professor
WHERE ((Gebäude.Gebäude = Professor.Gebäude) AND (Fachbereich_Nr <> '3'));

Relationenalgebra:
pi[Hausmeister] (sigma[(Gebäude.Gebäude = Professor.Gebäude) ^ (Fachbereich_Nr != 3)] (Gebäude x Professor))

2a)
SELECT Fachbereich_Nr, S_Name, Semester
FROM Student
WHERE Semester = (SELECT MAX(Semester) FROM Student)

2b)
SELECT Matrikel_Nr, AVG(Note)
FROM Prüfung
GROUP BY Matrikel_Nr;

2c)
keine Lösung gefunden

2d)
(SELECT Prüfer AS Beteiligte
FROM Prüfung
WHERE Fach = 'Algorithmen und Datenstrukturen')
UNION
(SELECT S_Name
FROM Prüfung, Student
WHERE Fach = 'Algorithmen und Datenstrukturen' AND Prüfung.Matrikel_Nr = Student.Matrikel_Nr);

Wäre toll wenn ihr mir nochmal helfen könntet. Bei der 2c ist mir bisher leider keine funktionierende Lösung eingefallen.


Antwort
Zitat