W3docs

MySQL Order By

Apprenez à trier les résultats MySQL en Python avec ORDER BY — ascendant, descendant, multi-colonnes, combiné avec WHERE et LIMIT.

Ce chapitre montre comment trier les résultats de requête MySQL en Python à l'aide de la clause ORDER BY. Vous apprendrez à trier par ordre ascendant et descendant, à trier sur plusieurs colonnes, à combiner ORDER BY avec WHERE et LIMIT, et à appliquer les bonnes pratiques Python comme les requêtes paramétrées et la gestion correcte des erreurs.

Ce que fait ORDER BY

La clause ORDER BY demande à MySQL de retourner les lignes dans un ordre précis plutôt que dans l'ordre de stockage (qui est imprévisible). Vous pouvez trier par une ou plusieurs colonnes, par ordre ascendant (ASC) ou descendant (DESC).

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

Règles essentielles :

  • ASC (ascendant, A → Z, 0 → 9) est la valeur par défaut — vous pouvez l'omettre.
  • DESC (descendant, Z → A, 9 → 0) doit être indiqué explicitement.
  • Plusieurs colonnes sont séparées par des virgules ; MySQL trie d'abord par la première colonne, puis utilise la colonne suivante pour départager les égalités.
  • Les valeurs NULL sont triées avant les valeurs non-NULL en ordre ASC et après elles en ordre DESC.

Prérequis

Vous avez besoin du package mysql-connector-python. Installez-le une seule fois avec pip :

pip install mysql-connector-python

Tous les exemples ci-dessous supposent l'existence d'une table customers avec au moins les colonnes id, name et address. Consultez Python MySQL – Créer une table si vous devez d'abord la créer.

Tri ascendant (par défaut)

L'ordre ascendant étant le comportement par défaut, ASC est facultatif. La requête suivante retourne tous les clients triés alphabétiquement par nom :

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()

Le bloc try / except / finally garantit que la connexion est toujours fermée, même en cas d'erreur.

Tri descendant

Ajoutez DESC après le nom de la colonne pour inverser l'ordre. Cela retourne les clients triés de Z → A :

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()

Tri sur plusieurs colonnes

Lorsque la première colonne de tri présente des égalités, MySQL utilise la deuxième colonne pour les départager. C'est utile lorsque, par exemple, vous souhaitez trier les clients par ville en premier, puis par nom au sein de chaque ville :

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()

Chaque colonne dans un tri multi-colonnes peut avoir sa propre direction :

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

Combiner ORDER BY avec WHERE

ORDER BY est appliqué après que WHERE a filtré les lignes. Utilisez des requêtes paramétrées (le marqueur %s) pour passer les valeurs en toute sécurité — ne formatez jamais directement les entrées utilisateur dans la chaîne SQL.

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()

Le marqueur %s est remplacé par MySQL (et non par le formatage de chaînes Python), ce qui prévient les injections SQL quelle que soit la valeur contenue.

Combiner ORDER BY avec LIMIT

Utilisez LIMIT conjointement avec ORDER BY pour implémenter des schémas tels que « les N premiers enregistrements » ou la pagination. L'ordre de tri doit figurer avant LIMIT dans l'instruction SQL.

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()

Pour la pagination (en sautant les pages précédentes), ajoutez OFFSET :

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

Consultez Python MySQL – Limit pour un guide complet sur LIMIT et OFFSET.

Récupérer une ligne ou toutes les lignes

Après l'exécution d'une requête ORDER BY, vous pouvez récupérer les résultats de différentes manières :

MéthodeRetourneÀ utiliser quand
fetchall()Liste de tous les tuples correspondantsL'ensemble de résultats est assez petit pour tenir en mémoire
fetchone()Première ligne sous forme de tuple (ou None)Vous n'avez besoin que du premier enregistrement
fetchmany(n)Liste des n prochaines lignesTraitement d'un grand ensemble de résultats par blocs

Exemple — récupérer uniquement le client dont le nom vient en premier alphabétiquement :

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

Erreurs courantes

Trier des chaînes comme des nombres. Si une colonne stocke des nombres sous forme de VARCHAR, MySQL les trie lexicographiquement ('10' vient avant '9'). Convertissez la colonne lorsque vous avez besoin d'un tri numérique :

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

Trier sans ORDER BY est non déterministe. MySQL ne garantit pas l'ordre des lignes à moins que vous ne spécifiiez ORDER BY. Se fier à l'ordre d'insertion peut provoquer des comportements imprévisibles à mesure que la table grandit ou que les index changent.

Les alias de colonnes fonctionnent dans ORDER BY. Si vous définissez un alias dans SELECT, vous pouvez l'utiliser dans ORDER BY :

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

Position dans ORDER BY. Vous pouvez référencer une colonne par sa position dans la liste SELECT (par exemple, ORDER BY 1), mais cette pratique est fragile — évitez-la dans le code de production car elle se casse silencieusement lorsque vous réorganisez les colonnes.

Chapitres connexes

Was this page helpful?