W3docs

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 NULL se ordenan antes que los valores no NULL en orden ASC y después en orden DESC.

Requisitos previos

Necesitas el paquete mysql-connector-python. Instálalo una vez con pip:

pip install mysql-connector-python

Todos 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étodoDevuelveÚsalo cuando
fetchall()Lista de todas las tuplas coincidentesEl 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 registrosProcesas 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

Was this page helpful?