Laura: SQL und relationale Algebra

Hallo Forum,

ich habe 2 Tabellen:

zutat (znr, name) gericht (gnr, znr, kalorien).

Und ich muss 2 Abfragen machen (sowohl SQL, als auch Ausdruck der relationalen Algebra):

  1. Welches Gericht hat die meisten Kalorien?

Meine Idee für SQL:

SELECT kalorien
FROM gericht
WHERE kalorien= ( SELECT MAX(kalorien) FROM gericht);

Aber bei relationaler Algebra gibt es (soweit ich weiß) keine Aggregatfunktionen. Deswegen weiß ich nicht, wie ich diese Query in einen Ausdruck übersetzen kann. Könnte mir jemand einen Tip geben?

  1. Welche Zutaten werden für alle Gerichte benötigt?

SQL Abfrage habe ich mit doppelten NOT EXISTS gemacht:

SELECT name
FROM zutat z1
WHERE NOT EXISTS (
SELECT *
FROM gericht g
WHERE NOT EXISTS (
SELECT *
FROM zutat z2
WHERE z1.znr=z2.znr AND z2.znr=g.znr)
);

Auch hier weiß ich nicht, wie man EXISTS bzw. NOT EXISTS in ein Ausdruck der relationalen Algebra übersetzt und brauche einen Hinweis. Kann mir jemand helfen?

Danke im Voraus

Laura

  1. Hallo Laura,

    von Codd's Theorie verstehe ich wenig - aber die Wikipedia sagt:

    Um andere Abfragesprachen, speziell SQL, vollständig in die relationale Algebra abbilden zu können, ist die relationale Algebra nicht mächtig genug.

    und listet dann GROUP BY und Aggregate als erforderliche Erweiterungen auf. Mit dem Gamma-Operator, der den GROUP BY implementiert, und einem nachgelagerten Sigma um HAVING darzustellen, könnte dir einiges gelingen. Die Aggregatfunktionen sind Teil des Gamma-Operators.

    Deine erste Abfrage scheint mir falsch. Kalorien ist in einer Tabelle mit gnr und znr, diese beiden Spalten würde ich als Schlüsselattribute ansehen. Und kalorien als Datenattribut. Du müsstest also das Gericht finden, wo die Summe der Kalorien aller Zutaten maximal ist, und nicht eine einzelne Zutat. Es sei denn, die Gericht-Tabelle ist denormalisiert und enthält für alle Zeilen die Kalorienzahl des Gerichts (täte mich wundern).

    Deine zweite Abfrage scheint mir auch falsch.

    Du suchst Zutaten, die für eine bestimmte Menge von Gerichten nicht verwendet werden, und denkst, damit die Zutaten zu bekommen, die in allen Gerichten verwendet werden? Ich habe nicht versucht, das komplett zu begreifen, aber es klingt irgendwie nicht logisch.

    Für die zweite Abfrage hätte ich mit COUNT und HAVING gearbeitet. Die Anzahl der Gerichte, in denen eine Zutat vorkommt, mit der Anzahl der Gerichte insgesamt vergleichen.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hi,

      Für die zweite Abfrage hätte ich mit COUNT und HAVING gearbeitet. Die Anzahl der Gerichte, in denen eine Zutat vorkommt, mit der Anzahl der Gerichte insgesamt vergleichen.

      Das setzt voraus, daß jede Zutat max. einmal pro Rezept verwendet wird.

      Bei z.B. Torte ist das aber (oft) so, daß Zucker für den Teig benötigt wird und für die Creme.

      Ich weiß, es ist gemein, wenn die Realität die Theorie kaputtmacht …

      Man müßte zum Zählen der Zutaten erst nach der Gerichtsnummer gruppieren und dann die Zahl der Gruppen ermitteln. In etwa so:

      select count(*) from (
          select count(*), znr, gnr from zutaten group by gnr, znr
      );
      

      cu,
      Andreas a/k/a MudGuard

      1. Hallo MudGuard,

        nein, du musst count(distinct gnr) verwenden. Das zu erkennen wollte ich aber Laura überlassen, ist ja schließlich Hausaufgabe - wer außer einen Info-Prof oder Lehrer würde sonst nach SQL UND Algebra fragen? 😂

        Rolf

        --
        sumpsi - posui - clusi
    2. Hallo Rolf,

      danke für Deine Antwort!

      Es sei denn, die Gericht-Tabelle ist denormalisiert und enthält für alle Zeilen die Kalorienzahl des Gerichts (täte mich wundern).

      Ist aber so gemeint (ist ja nur eine Übungsaufgabe). Wie kann man den überhaupt MAX-Funktion in Relationaler Algebra darstellen?

      Deine zweite Abfrage scheint mir auch falsch.

      Du suchst Zutaten, die für eine bestimmte Menge von Gerichten nicht verwendet werden, und denkst, damit die Zutaten zu bekommen, die in allen Gerichten verwendet werden? Ich habe nicht versucht, das komplett zu begreifen, aber es klingt irgendwie nicht logisch.

      Ich habe so gedacht: Zeige alle Zutaten, für die es keine Gerichte gibt, in denen die nicht benötigt werden. Mache ich einen Denkfehler?

      Zur relationalen Algebra: Könnte man an der Stelle Division benutzen?

      
      π znr,name (zutat) ÷ π znr (gericht)
      

      Danke für die Hilfe!

      Laura

      1. Zur Erklärung:

        Ich studiere Informatik im 1. Semester und habe das Posting vom Rechner meines Freundes (der hier auch ab und zu was postet und mir empfohlen hat, das Forum zu nutzen) abgeschickt. Dabei habe ich versehentlich vergessen seinen Namen als Verfasser zu ändern.

        Mein Freund ist jetzt sauer, dass es jetzt so aussieht, als würde er als Mann unter Frauennamen auf mehr Antworten hoffen. Daher bitte ich um Entschuldigung für diesen Fehler.

        Laura

        1. Mein Freund ist jetzt sauer, dass es jetzt so aussieht, als würde er als Mann unter Frauennamen auf mehr Antworten hoffen.

          Made my day 😀

          Wieso sollte man aber heutzutage noch allein vom Vornamen auf das Geschlecht schließen dürfen?

          Gruß Maetzzen

          1. Hallo,

            Wieso sollte man aber heutzutage noch allein vom Vornamen auf das Geschlecht schließen dürfen?

            Weil die Frauen durchgesetzt haben, dass Tiefs auch männliche Vornamen bekommen müssen?

            Gruß
            Kalk

            1. Hallo,

              gibt es dann bald auch neben "weiblichen" Vornamen (Hochs) und "männlichen" Vornamen (Tiefs) diverse andere "positive" Vornamen?

              Über was man sich nicht alles Gedanken machen kann.

              Gruß Maetzzen

        2. Hallo Laura,

          als würde er als Mann unter Frauennamen auf mehr Antworten hoffen.

          Die Quote an Baggerfahrern ist hier doch recht gering.

          Ich habe so gedacht: Zeige alle Zutaten, für die es keine Gerichte gibt, in denen die nicht benötigt werden. Mache ich einen Denkfehler?

          Ich glaube, du denkst richtig. Das beantworte ich aber lieber erst dann verbindlich, nachdem ich mir einen Korkenzieher besorgt und ein paar Extrawindungen hineingebogen habe.

          Die Division, so wie ich sie im Wikipedia-Artikel verstehe, scheint genau das zu sein, was Du brauchst. $$\text{gericht} \div \pi_{\text{znr}}(\text{zutat})$$ sollte demnach die Gerichte liefern, die alle Zutaten enthalten. Einen passenden SQL Befehl dazu kenne ich nicht, habe aber nach nach "relationale division sql" gegoogelt. Gregor Ulm macht es genau so, wie ich mir das gedacht hätte.

          Das Thema EXISTS / NOT EXISTS ist durch aufwändigere Algebrakonstrukte darstellbar. Das kannst Du googeln (Suchbegriff not exists relational algebra). Es ist aber sinnlos, wenn ich versuche, die Erklärungen anderer zu verstehen und Dir hier wiederzugeben. Dabei geht vermutlich der relevante Inhalt verloren. Und eigentlich solltest Du ein Lehrbuch oder ein Vorlesungsscript haben, in dem das thematisiert wird, oder?

          Rolf

          --
          sumpsi - posui - clusi