Nicky: Datenbank/SQL: SELECT * soll Ergebnis mit alphabetisch sortierten Spaltennamen ausgeben

SELECT * FROM eltern WHERE nachname LIKE "M%" gibt die Spalten id, vorname, nachname aus. Ich möchte, dass die Spalten alphabetisch sortiert so ausgegeben werden: id, nachname, vorname

Wie geht das in SQL?

  1. Hallo Nicky,

    die gewünschte Klausel zum SELECT Befehl heißt ORDER BY

    Was heißt denn alphabetisch sortiert? Nach Nachname, dann nach Vorname? In dem Fall sähe deine Query so aus:

    SELECT id, vorname, nachname
    FROM eltern
    WHERE nachname like 'M%'
    ORDER BY nachname, vorname
    

    Beachte, dass ich die Spalten explizit angeben habe und nicht SELECT * geschrieben habe. Wenn Du eine Online-Abfrage machst, ist SELECT * ok, wenn Du die Abfrage aus einem Programm heraus machst (z.B. ein PHP Skript), dann nicht. Du weißt, was Du machst - also weißt Du jetzt auch, was für deinen Fall richtig ist :)

    Rolf

    --
    Dosen sind silbern
  2. Meinst du jetzt die Spaltennamen sollten sortiert ausgegeben werden? Dann sag doch einfach welche Spalten du haben willst. Ist sowieso schneller und sicherer als select *.

    Oder sollten die Werte über mehrere Spalten hin sortiert werden? Dann mach doch einfach ... order by spalte1, spalte2, ...

    1. Die Tabelle hat leider ca. 20 Spalten, die ich nicht alle per ORDER BY anhängen möchte.

      1. Hallo

        Die Tabelle hat leider ca. 20 Spalten, die ich nicht alle per ORDER BY anhängen möchte.

        Du willst doch bestimmt nicht nach allen zirka 20 Spalten sortieren? Du gibst in der ORDER BY-Klausel natürlich nur jene Spalten an, nach denen sortiert werden soll. Typischerweise sind das gern eine bis drei Spalten, höchstwahrscheinlich aber nicht annähernd 20.

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
      2. Hallo Nicky,

        verstehe ich dich miss? Oder ist Dir die Arbeitsweise von ORDER BY nicht ganz klar?

        1. Ein SELECT Befehl erzeugt Zeilen. Aus welchen Spalten diese Zeilen aufgebaut sind, gibt man mit SELECT an.

        2. Diese Zeilen können sortiert werden. Sie werden als Ganzes sortiert, nicht nur die Spalten, die im ORDER BY aufgeführt sind. Die ORDER BY Angabe sagt nur, welche Spalten zum Herstellen der Sortierreihenfolge verwendet werden sollen.

        Zwanzig Spalten ins ORDER BY zu schreiben bringt normalerweise keine Nutzen. Zwanzig sortierrelevante Felder würde ja bedeuten, dass du so Sätze hast, die in 19 Feldern gleich sind und sich nur im zwanzigsten unterscheiden. So komplexe Datenbestände hat höchtens das Finanzamt oder die NSA.

        Rolf

        --
        Dosen sind silbern
      3. Willst Du jetzt die Inhalte der Spalten sortiert ausgeben oder tatsächlich und allen Ernstes die Spalten nach Namen sortieren?

        Letzteres wäre extrem ungewöhnlich und würde nach meiner Auffassung auf eine bedenkliche Programm- bzw. Datenstruktur hinweisen.

        1. Hallo Regina,

          ich hatte die Frage ja zuerst tatsächlich auch so gelesen. Aber dann gedacht: Nee - das ist nur mistverständlich ausgedrückt gewesen.

          Wenn's das war, lautet die erste Antwort: Welche fachliche Anforderung soll damit umgesetzt werden?

          Und die zweite: Geht, aber nicht mit SQL. SQL-Funktionen verarbeiten Zeilen, nicht Spalten. Sowas müsste man im weiterverarbeitenden Programm lösen, bzw. vom verarbeitenden Programm vorab die Spaltenliste sortiert aus dem Systemkatalog holen lassen und daraus das SQL Statement generieren.

          Rolf

          1. Dann geht das mit SQL also nicht (genauer: nicht wenn ich SELECT * nutzen möchte).

            Danke für Eure Hilfe!

            1. Hallo Nicky,

              Dann geht das mit SQL also nicht (genauer: nicht wenn ich SELECT * nutzen möchte).

              Es ist ja noch nicht klar, was du eigentlich möchtest.

              Bis demnächst
              Matthias

              --
              Rosen sind rot.
              1. Hallo Matthias,

                Um das zu präzisieren: Nicky hat ihr B-Problem genannt, aber - wie viele Hilfe suchende - den Grund verschwiegen, weshalb sich das Problem überhaupt stellt.

                Ich frage daher nochmal: was ist der Anlass, die Spalten eines SELECT automatisch sortieren zu müssen? Außer dem Mangel an Lust, das von Hand zu tun... Wirklich nötig wäre das, wenn man in vielen verschiedenen Queries immer wieder die Spalten sortieren müsste. Dann könnte man einen Generator für SELECT Statements schreiben, der da über den Systemkatalog tut.

                Rolf

                --
                Dosen sind silbern
            2. Im Prinzip kannst Du die Spaltennamen auf eine ganz triviale Weise holen und sortieren:

              (Es fehlt jegliche Fehlerbehandlung!)

              <?php
              
              $mysqli = new mysqli( $host, $user, $pass, $database );
              
              $sql    = "SHOW COLUMNS FROM `$database`.`$table`";
              $result = $mysqli -> query( $sql );
              
              $fields = array();
              
              while ( $row = $result -> fetch_array( MYSQLI_ASSOC ) ) {
                  $fields[] = $row['Field'];
              }
              
              sort( $fields );
              print_r( $fields );
              

              Baue dann mit den sortierten Feldern Deine eigentliche Abfrage. Hier hilft Dir

              $ar = array();
              foreach ( $fields as $s ) {
                  $ar[] = '`' . $s . '`';
              }
              $from = implode(', ', $ar);
              print $from;
              

              Und jetzt dazu, warum das Quatsch ist:

              Die Felder einer Tabelle sind normalerweise (jenseits von schweren Fehlern im Programmdesign, nicht mal wenn man PHPmyAdmin neu schreiben will ist dieses Vorgehen sinnvoll) nicht dynamisch, ändern sich also nicht. Du verschwendest also Serverzeit für die Abfrage, das Sortieren des Arrays und so weiter.

              1. Hallo Regina Schaukrug,

                Die Felder einer Tabelle sind normalerweise (jenseits von schweren Fehlern im Programmdesign, nicht mal wenn man PHPmyAdmin neu schreiben will ist dieses Vorgehen sinnvoll) nicht dynamisch, ändern sich also nicht.

                Genau. Man könnte mal testen, ob Erstellungsreihenfolge = Reihenfolge bei Select * gilt. Dann lautet die Lösung, erstelle die Spalten in der gewünschten Reihenfolge. 😂

                Bis demnächst
                Matthias

                --
                Rosen sind rot.
                1. Man könnte mal testen, ob Erstellungsreihenfolge = Reihenfolge bei Select * gilt.

                  Das funktioniert in der Praxis tatsächlich (hab ich mal getestet). Man kann sogar beim Ändern einer Tabelle eine Spalte an einer bestimmten Stelle einfügen. Das Handbuch zu mySQL sagt dazu:

                  ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition
                          [FIRST | AFTER col_name]
                  

                  Allerdings ist dieses Verhalten nicht wirklich garantiert und gilt daher (und weil der DB-Admin nichts von der Wichtigkeit einer Reihenfolge der Spalten weiß) trotz der Verifizierbarkeit in Tests als "zufällig".

                  Und SELECT * verbietet sich jenseits der Schnellabfrage in der MySQL-Shell aus Gründen, die sich schon herumgeprochen haben sollten. Die Spalten sind bei "normalen" Programmen durch den "Plan vom Großen und Ganzen" bestimmt und bekannt - also kennt man die auch ohne Abfrage und kann sie (wenn man will wie man will) sortieren.

                  Es sei denn, wie gesagt, man will etwas wie den phpMyAdmin neu schreiben. Aber das ist vorliegend wohl ein fern liegendes Ziel.

      4. die ich nicht alle per ORDER BY anhängen möchte.

        Wieso denn nicht? Du musst doch einfach nur sagen was du haben willst und dann macht die Datenbank das für dich.