Martin Holzer: Alternativquery gesucht

Hallo Forum,

ich bin gerade in Klausurvorbereitung und habe eine Frage.
Ich habe folgende Tabelle:

Athlet:  Name, Alter, Land

und Frage dazu: Welches Land stellt die meisten Athleten?

Meine Lösung:

SELECT Land
FROM Athlet
GROUP BY Land
ORDER BY COUNT(DISTINCT(Name)) DESC
LIMIT 1

Meine Frage ist, ob man die Abfrage ohne LIMIT zu benutzen formulieren kann, weil wir es in der Vorlesung nicht hatten und auch in der Klausur nicht verwenden dürfen.

Vielen Dank im Voraus!
Martin

  1. Moin!

    ich bin gerade in Klausurvorbereitung und habe eine Frage.

    Fragen zur Ausbildungsvorbereitung werden aus Lehrgründen ja nur mit Gegenfragen beantwortet, und nie mit fertigen Lösungen... Ich denke, das ist in deinem Sinne.

    Ich habe folgende Tabelle:

    Athlet:  Name, Alter, Land

    und Frage dazu: Welches Land stellt die meisten Athleten?

    Meine Lösung:

    SELECT Land
    FROM Athlet
    GROUP BY Land
    ORDER BY COUNT(DISTINCT(Name)) DESC
    LIMIT 1

    Jetzt frage ich mich aber mal - und damit dich: Was soll das ORDER BY machen? Es sieht hinreichend kompliziert aus, dass es sich nicht von selbst erklärt, und es sieht auch nicht so aus, als würde es irgendeinen Einfluss auf das Ergebnis haben, oder?

    - Sven Rautenberg

    1. Moin!

      ich bin gerade in Klausurvorbereitung und habe eine Frage.

      Fragen zur Ausbildungsvorbereitung werden aus Lehrgründen ja nur mit Gegenfragen beantwortet,

      Z.B. die Gegenfrage, ob bereits Aggregatfunktionen durchgenommen wurden....

      Ich habe folgende Tabelle:

      Athlet:  Name, Alter, Land

      und Frage dazu: Welches Land stellt die meisten Athleten?

      Meine Lösung:

      SELECT Land
      FROM Athlet
      GROUP BY Land
      ORDER BY COUNT(DISTINCT(Name)) DESC
      LIMIT 1

      Jetzt frage ich mich aber mal - und damit dich: Was soll das ORDER BY machen? Es sieht hinreichend kompliziert aus, dass es sich nicht von selbst erklärt, und es sieht auch nicht so aus, als würde es irgendeinen Einfluss auf das Ergebnis haben, oder?

      Na, offensichtlich soll die Ergebnismenge auf 1 beschränkt werden. Und da klingt es doch wie eine gute Idee, vorher nach dem gefragten Kriterium zu ordnen.

      Gruß
      Kalk

    2. Danke für die Antwort!

      Jetzt frage ich mich aber mal - und damit dich: Was soll das ORDER BY machen? Es sieht hinreichend kompliziert aus, dass es sich nicht von selbst erklärt, und es sieht auch nicht so aus, als würde es irgendeinen Einfluss auf das Ergebnis haben, oder?

      Mit ORDER BY ... DESC erreiche ich, dass in meiner Gruppierung nach Länder Eintrag mit dem Land mit meisten Athleten in Zeile 1 steht, sonst würde da zufälliges Land mit entsperchenden Athletenanzahl stehen, oder?

      Also, ORDER BY hat keinen Einfluss auf Ergebniss als solche, aber wenn ich danach alle Zeilen außer erster eliminiere - schon.

      Es geht mir aber weniger darum, diese Abfrage zu verifizieren, sondern zu verstehen, wie man die Aggregatfunktionen von Aggregatfunktionen nahmen kann (in meinem Fall MAX(COUNT(Name))).

      Martin

      1. Moin!

        Danke für die Antwort!

        Jetzt frage ich mich aber mal - und damit dich: Was soll das ORDER BY machen? Es sieht hinreichend kompliziert aus, dass es sich nicht von selbst erklärt, und es sieht auch nicht so aus, als würde es irgendeinen Einfluss auf das Ergebnis haben, oder?

        Mit ORDER BY ... DESC erreiche ich, dass in meiner Gruppierung nach Länder Eintrag mit dem Land mit meisten Athleten in Zeile 1 steht, sonst würde da zufälliges Land mit entsperchenden Athletenanzahl stehen, oder?

        Die Frage war: Aus welchem Land kommen die meisten Athleten.

        Dein Query:

        SELECT Land  
        FROM Athlet  
        GROUP BY Land  
        ORDER BY COUNT(DISTINCT(Name)) DESC  
        LIMIT 1
        

        Du gruppierst nach Land. Also alle Zeilen, bei denen Land gleich ist, in eine Zeile.

        Und dann nimmst du das Vorkommen des Athletennamens zum Bestimmen, welches Land vorne sein soll?

        Meine schlichte Lösung wäre ja gewesen, SELECT Land, count(Land) ... GROUP BY Land ORDER BY COUNT(Land)

        Also, ORDER BY hat keinen Einfluss auf Ergebniss als solche, aber wenn ich danach alle Zeilen außer erster eliminiere - schon.

        Richtig. Und weil du dir nicht ausgeben lässt, was in deiner Abfrage sonst noch alles aggregiert und ermittelt wird, kommt am Ende "irgendein" Land raus, und das ist es dann?

        Es geht mir aber weniger darum, diese Abfrage zu verifizieren, sondern zu verstehen, wie man die Aggregatfunktionen von Aggregatfunktionen nahmen kann (in meinem Fall MAX(COUNT(Name))).

        Dein Query enthält kein MAX(COUNT(Name)).

        - Sven Rautenberg

        1. Hallo,

          Dein Query:

          SELECT Land

          FROM Athlet
          GROUP BY Land
          ORDER BY COUNT(DISTINCT(Name)) DESC
          LIMIT 1

          
          >   
            
            
          
          > Meine schlichte Lösung wäre ja gewesen, `SELECT Land, count(Land) ... GROUP BY Land ORDER BY COUNT(Land)`{:.language-sql}  
          >   
            
          ... und worin sollen sich Eure Lösungen unterscheiden (mal von der Tatsache abgesehen, daß das DISTINCT von Martin in diesem Falle falsch ist, so man davon ausgeht, daß die Tabelle keine Duplikate enthält, aber z.b. Athleten gleichen Namens)?  
            
          Und mal vorausgesetzt, daß kein Name doppelt vorkäme, sind Eure Lösungen sogar identisch, bis auf die Tatsachen, daß Svens Lösung 2 Fragen nicht beantwortet:  
            
          1\. Die Ausgangsfrage "Welches Land stellt die meisten Athleten?" (Sven, Du sortierst zwar, aber gibst das Land nicht als Lösung aus, sondern eine Ergebnistabelle, die danach noch ausgewertet werden müsste. Das beantwortet aber die Ausgangsfrage nicht.  
            
            
          ... und ...  
            
          2\. Die eigentliche Frage des TO, nämlich, ob sich die Aufgabe auch \_ohne LIMIT\_ lösen läßt.  
            
          ~~~sql
            
          SELECT Land, count( Land ) ui  
          FROM athlet  
          GROUP BY Land  
          HAVING ui = (  
          SELECT max( a )  
          FROM (  
          SELECT count( * ) AS a  
          FROM athlet  
          GROUP BY Land ) t  
          )  
          
          

          ... sollte z.b. das Land mit den meisten Athleten ausgeben.

          Lukas

          1. હેલો

              
            
            > SELECT Land, count( Land ) ui  
            > FROM athlet  
            > GROUP BY Land  
            > HAVING ui = (  
            > SELECT max( a )  
            > FROM (  
            > SELECT count( * ) AS a  
            > FROM athlet  
            > GROUP BY Land ) t  
            > )  
            > 
            
            

            Was bewirkt hier „SELECT count( * ) AS a“? Was wird da gezählt? Ich sehe öfter mal die konstellation SELECT count( * ), aber warum das sternchen? Ist es nicht besser, gezielt ein Feld zu zählen?

            બાય

            --
             .
            ..:
            1. SELECT count( * ), aber warum das sternchen? Ist es nicht besser, gezielt ein Feld zu zählen?

              Bei COUNT() ist es egal ob man nun an Hand eines bestimmten oder irgendeinem Feld zählt.

              Der einzige Unterschied ist, dass man COUNT(*) auf jede Tabelle schmeißen kann, COUNT(Feldname) aber nur auf Tabellen die eine Spalte Feldname überhaupt haben.

              MfG
              bubble

              --
              If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
              1. હેલો

                SELECT count( * ), aber warum das sternchen? Ist es nicht besser, gezielt ein Feld zu zählen?

                Der einzige Unterschied ist, dass man COUNT(*) auf jede Tabelle schmeißen kann, COUNT(Feldname) aber nur auf Tabellen die eine Spalte Feldname überhaupt haben.

                Danke für den Hinweis.

                બાય

                --
                 .
                ..:
              2. Mahlzeit,

                Der einzige Unterschied ist, dass man COUNT(*) auf jede Tabelle schmeißen kann, COUNT(Feldname) aber nur auf Tabellen die eine Spalte Feldname überhaupt haben.

                Hat es keine Auswirkung auf Speicherverbrauch und Antwortzeit? Dadurch könnte man natürlich einiges viel flexibler gestalten.

                --
                42
                1. Hat es keine Auswirkung auf Speicherverbrauch und Antwortzeit? Dadurch könnte man natürlich einiges viel flexibler gestalten.

                  Siehe meine Korrektur.
                  COUNT(*) wäre wohl schneller als ein COUNT(FeldDasNichtNullSeinDarf), ansonsten liefert es unter Umständen andere Werte.

                  MfG
                  bubble

                  --
                  If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                  1. Mahlzeit,

                    Siehe meine Korrektur.
                    COUNT(*) wäre wohl schneller als ein COUNT(FeldDasNichtNullSeinDarf), ansonsten liefert es unter Umständen andere Werte.

                    Hab ich gelesen. Wieder was gelernt :)

                    --
                    42
                    1. હેલો

                      Wieder was gelernt :)

                      Ich liebe dieses Lied!  ;)

                      બાય

                      --
                       .
                      ..:
              3. SELECT count( * ), aber warum das sternchen? Ist es nicht besser, gezielt ein Feld zu zählen?
                Bei COUNT() ist es egal ob man nun an Hand eines bestimmten oder irgendeinem Feld zählt.

                Das ist FALSCH! COUNT(*) zählt alle Ergebnisse, COUNT(Feldname) zählt alle Nicht-Null-Werte.

                @M: Das dürfte deine Frage beantworten.

                MfG
                bubble

                --
                If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                1. Das ist FALSCH! COUNT(*) zählt alle Ergebnisse, COUNT(Feldname) zählt alle Nicht-Null-Werte.

                  Korrekt. COUNT (*) ignoriert keine NULL-Werte.

                  Lukas

                2. હેલો

                  Das ist FALSCH! COUNT(*) zählt alle Ergebnisse, COUNT(Feldname) zählt alle Nicht-Null-Werte.

                  @M: Das dürfte deine Frage beantworten.

                  Hat aber hier eine neue aufgeworfen ;)

                  id | name
                  -----------
                  1   as
                  2   der
                  3
                  4   zui
                  5   ert

                  COUNT(*) hätte hier 5 treffer, COUNT(name) 4?

                  બાય

                  --
                   .
                  ..:
                  1. id | name

                    1   as
                    2   der
                    3
                    4   zui
                    5   ert

                    COUNT(*) hätte hier 5 treffer, COUNT(name) 4?

                    Also, wenn name bei der id=3 '' ist (also ein Leerstring), dann ist COUNT(*) = 5 und COUNT(name) = 5;
                    wenn aber name bei der id=3 NULL ist (also nicht der String 'NULL' sondern NULL), dann ist COUNT(*) = 5 und COUNT(name) = 4.

                    MfG
                    bubble

                    --
                    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                    1. હેલો

                      Also, wenn name bei der id=3 '' ist (also ein Leerstring), dann ist COUNT(*) = 5 und COUNT(name) = 5;
                      wenn aber name bei der id=3 NULL ist (also nicht der String 'NULL' sondern NULL), dann ist COUNT(*) = 5 und COUNT(name) = 4.

                      Ok, jetzt hab ich's. Danke.

                      બાય

                      --
                       .
                      ..: