W3docs

MySQL Order By

Lerne, MySQL-Abfrageergebnisse in Python mit ORDER BY zu sortieren – aufsteigend, absteigend, mehrere Spalten und kombiniert mit WHERE und LIMIT.

Dieses Kapitel zeigt, wie man MySQL-Abfrageergebnisse in Python mithilfe der ORDER BY-Klausel sortiert. Du lernst, aufsteigend und absteigend zu sortieren, nach mehreren Spalten zu sortieren, ORDER BY mit WHERE und LIMIT zu kombinieren und Python-Best-Practices wie parametrisierte Abfragen und korrektes Fehlerhandling anzuwenden.

Was ORDER BY macht

Die ORDER BY-Klausel weist MySQL an, Zeilen in einer bestimmten Reihenfolge zurückzugeben, anstatt in der Speicherreihenfolge (die nicht vorhersehbar ist). Du kannst nach einer oder mehreren Spalten sortieren, aufsteigend (ASC) oder absteigend (DESC).

SELECT column1, column2
FROM table_name
ORDER BY column1 ASC, column2 DESC;

Wichtige Regeln:

  • ASC (aufsteigend, A → Z, 0 → 9) ist die Standardeinstellung — du kannst es weglassen.
  • DESC (absteigend, Z → A, 9 → 0) muss explizit angegeben werden.
  • Mehrere Spalten werden durch Kommas getrennt; MySQL sortiert zuerst nach der ersten Spalte und verwendet die nächste Spalte, um Gleichstände aufzulösen.
  • NULL-Werte werden bei ASC-Sortierung vor Nicht-NULL-Werten und bei DESC-Sortierung nach ihnen einsortiert.

Voraussetzungen

Du benötigst das Paket mysql-connector-python. Installiere es einmalig mit pip:

pip install mysql-connector-python

Alle folgenden Beispiele setzen eine customers-Tabelle mit mindestens den Spalten id, name und address voraus. Lies Python MySQL – Create Table, wenn du sie zuerst erstellen musst.

Aufsteigend sortieren (Standard)

Aufsteigende Reihenfolge ist die Standardeinstellung, daher ist ASC optional. Die folgende Abfrage gibt alle Kunden alphabetisch nach Name sortiert zurück:

import mysql.connector
from mysql.connector import Error

try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="yourusername",
        password="yourpassword",
        database="mydatabase"
    )
    mycursor = mydb.cursor()

    mycursor.execute("SELECT * FROM customers ORDER BY name")

    for row in mycursor.fetchall():
        print(row)

except Error as e:
    print(f"Database error: {e}")
finally:
    if mycursor:
        mycursor.close()
    if mydb.is_connected():
        mydb.close()

Der try / except / finally-Block stellt sicher, dass die Verbindung immer geschlossen wird, auch wenn ein Fehler auftritt.

Absteigend sortieren

Füge DESC nach dem Spaltennamen hinzu, um die Reihenfolge umzukehren. Dies gibt Kunden von Z → A sortiert zurück:

import mysql.connector
from mysql.connector import Error

try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="yourusername",
        password="yourpassword",
        database="mydatabase"
    )
    mycursor = mydb.cursor()

    mycursor.execute("SELECT * FROM customers ORDER BY name DESC")

    for row in mycursor.fetchall():
        print(row)

except Error as e:
    print(f"Database error: {e}")
finally:
    if mycursor:
        mycursor.close()
    if mydb.is_connected():
        mydb.close()

Nach mehreren Spalten sortieren

Wenn die erste Sortierspalte Gleichstände aufweist, verwendet MySQL die zweite Spalte zur Auflösung. Das ist nützlich, wenn du zum Beispiel Kunden zuerst nach Stadt und innerhalb jeder Stadt nach Name sortieren möchtest:

import mysql.connector
from mysql.connector import Error

try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="yourusername",
        password="yourpassword",
        database="mydatabase"
    )
    mycursor = mydb.cursor()

    # Sort by address (city) ascending, then by name ascending within each city
    mycursor.execute("SELECT * FROM customers ORDER BY address ASC, name ASC")

    for row in mycursor.fetchall():
        print(row)

except Error as e:
    print(f"Database error: {e}")
finally:
    if mycursor:
        mycursor.close()
    if mydb.is_connected():
        mydb.close()

Jede Spalte in einer Mehrspaltensortierung kann ihre eigene Richtung haben:

-- Most recent orders first; within the same date, highest total first
SELECT * FROM orders ORDER BY order_date DESC, total_amount DESC;

ORDER BY mit WHERE kombinieren

ORDER BY wird angewendet, nachdem WHERE die Zeilen gefiltert hat. Verwende parametrisierte Abfragen (den %s-Platzhalter), um Werte sicher zu übergeben — formatiere Benutzereingaben niemals direkt in den SQL-String.

import mysql.connector
from mysql.connector import Error

try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="yourusername",
        password="yourpassword",
        database="mydatabase"
    )
    mycursor = mydb.cursor()

    # Find all customers in London, sorted by name
    sql = "SELECT * FROM customers WHERE address = %s ORDER BY name ASC"
    val = ("London",)
    mycursor.execute(sql, val)

    for row in mycursor.fetchall():
        print(row)

except Error as e:
    print(f"Database error: {e}")
finally:
    if mycursor:
        mycursor.close()
    if mydb.is_connected():
        mydb.close()

Der %s-Platzhalter wird von MySQL ersetzt (nicht durch Python-String-Formatierung), was SQL-Injection unabhängig vom Inhalt des Wertes verhindert.

ORDER BY mit LIMIT kombinieren

Verwende LIMIT zusammen mit ORDER BY, um Muster wie „Top-N-Datensätze" oder Paginierung zu implementieren. Die Sortierreihenfolge muss in der SQL-Anweisung vor LIMIT stehen.

import mysql.connector
from mysql.connector import Error

try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="yourusername",
        password="yourpassword",
        database="mydatabase"
    )
    mycursor = mydb.cursor()

    # The 5 customers whose names come first alphabetically
    mycursor.execute("SELECT * FROM customers ORDER BY name ASC LIMIT 5")

    for row in mycursor.fetchall():
        print(row)

except Error as e:
    print(f"Database error: {e}")
finally:
    if mycursor:
        mycursor.close()
    if mydb.is_connected():
        mydb.close()

Für die Paginierung (Überspringen früherer Seiten) füge OFFSET hinzu:

-- Page 2: rows 6–10
SELECT * FROM customers ORDER BY name ASC LIMIT 5 OFFSET 5;

Lies Python MySQL – Limit für eine vollständige Erläuterung von LIMIT und OFFSET.

Eine Zeile vs. alle Zeilen abrufen

Nach der Ausführung einer ORDER BY-Abfrage kannst du Ergebnisse auf verschiedene Arten abrufen:

MethodeGibt zurückVerwenden wenn
fetchall()Liste aller übereinstimmenden TupelDas Ergebnis ist klein genug, um es im Speicher zu halten
fetchone()Erste Zeile als Tupel (oder None)Du brauchst nur den obersten Datensatz
fetchmany(n)Liste der nächsten n ZeilenVerarbeitung eines großen Ergebnisses in Blöcken

Beispiel — nur den alphabetisch ersten Kunden abrufen:

mycursor.execute("SELECT * FROM customers ORDER BY name ASC")
top = mycursor.fetchone()
print(top)  # e.g. (1, 'Alice', 'London')

Häufige Fallstricke

Strings als Zahlen sortieren. Wenn eine Spalte Zahlen als VARCHAR speichert, sortiert MySQL sie lexikografisch ('10' kommt vor '9'). Konvertiere die Spalte, wenn du numerische Reihenfolge benötigst:

SELECT * FROM products ORDER BY CAST(price AS DECIMAL(10,2)) ASC;

Sortieren ohne ORDER BY ist nicht deterministisch. MySQL garantiert keine Zeilenreihenfolge, solange du kein ORDER BY angibst. Das Verlassen auf die Einfügereihenfolge wird unvorhersehbar fehlschlagen, wenn die Tabelle wächst oder Indizes sich ändern.

Spaltenaliase funktionieren in ORDER BY. Wenn du in SELECT einen Alias definierst, kannst du ihn in ORDER BY verwenden:

SELECT name, address AS city FROM customers ORDER BY city ASC;

ORDER BY nach Position. Du kannst eine Spalte anhand ihrer Position in der SELECT-Liste referenzieren (z. B. ORDER BY 1), aber das ist fehleranfällig — vermeide es im Produktionscode, da es lautlos bricht, wenn du Spalten umsortierst.

Verwandte Kapitel

Was this page helpful?