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
NULLsont triées avant les valeurs non-NULL en ordreASCet après elles en ordreDESC.
Prérequis
Vous avez besoin du package mysql-connector-python. Installez-le une seule fois avec pip :
pip install mysql-connector-pythonTous 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éthode | Retourne | À utiliser quand |
|---|---|---|
fetchall() | Liste de tous les tuples correspondants | L'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 lignes | Traitement 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
- Python MySQL – Démarrer — installer le connecteur et se connecter à MySQL
- Python MySQL – Select — lire des données avec
SELECT - Python MySQL – Where — filtrer les lignes avec
WHERE - Python MySQL – Limit — limiter le nombre de résultats avec
LIMIT - Python MySQL – Join — combiner les données de plusieurs tables