MySQL Order By
Aprende a ordenar resultados de consultas MySQL en Python con ORDER BY: ascendente, descendente, múltiples columnas y combinado con WHERE y LIMIT.
Este capítulo muestra cómo ordenar los resultados de consultas MySQL en Python usando la cláusula ORDER BY. Aprenderás a ordenar de forma ascendente y descendente, ordenar por múltiples columnas, combinar ORDER BY con WHERE y LIMIT, y aplicar buenas prácticas de Python como consultas parametrizadas y manejo adecuado de errores.
Qué hace ORDER BY
La cláusula ORDER BY le indica a MySQL que devuelva las filas en una secuencia específica en lugar del orden de almacenamiento (que es impredecible). Puedes ordenar por una o más columnas, de forma ascendente (ASC) o descendente (DESC).
SELECT column1, column2
FROM table_name
ORDER BY column1 ASC, column2 DESC;Reglas clave:
ASC(ascendente, A → Z, 0 → 9) es el valor predeterminado — puedes omitirlo.DESC(descendente, Z → A, 9 → 0) debe indicarse explícitamente.- Las múltiples columnas se separan con comas; MySQL ordena primero por la primera columna y luego usa la siguiente para desempatar.
- Los valores
NULLse ordenan antes que los valores no NULL en ordenASCy después en ordenDESC.
Requisitos previos
Necesitas el paquete mysql-connector-python. Instálalo una vez con pip:
pip install mysql-connector-pythonTodos los ejemplos a continuación asumen una tabla customers con al menos las columnas id, name y address. Consulta Python MySQL – Create Table si necesitas crearla primero.
Ordenar de forma ascendente (predeterminado)
El orden ascendente es el predeterminado, por lo que ASC es opcional. La siguiente consulta devuelve todos los clientes ordenados alfabéticamente por nombre:
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()El bloque try / except / finally garantiza que la conexión siempre se cierre, incluso cuando ocurre un error.
Ordenar de forma descendente
Agrega DESC después del nombre de la columna para invertir el orden. Esto devuelve los clientes ordenados 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()Ordenar por múltiples columnas
Cuando la primera columna de ordenación tiene valores repetidos, MySQL usa la segunda columna para desempatar. Esto es útil cuando, por ejemplo, quieres los clientes ordenados primero por ciudad y luego por nombre dentro de cada ciudad:
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()Cada columna en un ordenamiento de múltiples columnas puede tener su propia dirección:
-- Most recent orders first; within the same date, highest total first
SELECT * FROM orders ORDER BY order_date DESC, total_amount DESC;Combinar ORDER BY con WHERE
ORDER BY se aplica después de que WHERE filtra las filas. Usa consultas parametrizadas (el marcador de posición %s) para pasar valores de forma segura — nunca formatees la entrada del usuario directamente en la cadena 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()El marcador de posición %s es reemplazado por MySQL (no por el formato de cadenas de Python), lo que previene la inyección SQL independientemente del valor que contenga.
Combinar ORDER BY con LIMIT
Usa LIMIT junto con ORDER BY para implementar patrones como "los N registros superiores" o paginación. El orden de clasificación debe aparecer antes que LIMIT en la sentencia 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()Para paginación (saltando páginas anteriores), agrega OFFSET:
-- Page 2: rows 6–10
SELECT * FROM customers ORDER BY name ASC LIMIT 5 OFFSET 5;Consulta Python MySQL – Limit para un recorrido completo de LIMIT y OFFSET.
Obtener una fila vs todas las filas
Después de ejecutar una consulta con ORDER BY, puedes recuperar los resultados de distintas maneras:
| Método | Devuelve | Úsalo cuando |
|---|---|---|
fetchall() | Lista de todas las tuplas coincidentes | El conjunto de resultados es lo suficientemente pequeño para caber en memoria |
fetchone() | Primera fila como tupla (o None) | Solo necesitas el registro superior |
fetchmany(n) | Lista de los siguientes n registros | Procesas un conjunto de resultados grande en bloques |
Ejemplo — obtener solo el primer cliente en orden alfabético:
mycursor.execute("SELECT * FROM customers ORDER BY name ASC")
top = mycursor.fetchone()
print(top) # e.g. (1, 'Alice', 'London')Errores comunes
Ordenar cadenas como números. Si una columna almacena números como VARCHAR, MySQL los ordena lexicográficamente ('10' aparece antes que '9'). Convierte la columna cuando necesites orden numérico:
SELECT * FROM products ORDER BY CAST(price AS DECIMAL(10,2)) ASC;Ordenar sin ORDER BY es no determinista. MySQL no garantiza el orden de las filas a menos que especifiques ORDER BY. Depender del orden de inserción fallará de forma impredecible a medida que la tabla crezca o los índices cambien.
Los alias de columna funcionan en ORDER BY. Si defines un alias en SELECT, puedes usarlo en ORDER BY:
SELECT name, address AS city FROM customers ORDER BY city ASC;Posición en ORDER BY. Puedes hacer referencia a una columna por su posición en la lista SELECT (p. ej., ORDER BY 1), pero esto es frágil — evítalo en código de producción porque falla silenciosamente cuando reordenas columnas.
Capítulos relacionados
- Python MySQL – Get Started — instala el conector y conéctate a MySQL
- Python MySQL – Select — lee datos con
SELECT - Python MySQL – Where — filtra filas con
WHERE - Python MySQL – Limit — limita el número de resultados con
LIMIT - Python MySQL – Join — combina datos de múltiples tablas