W3docs

MySQL Order By

Aprenda a ordenar resultados MySQL em Python com ORDER BY — crescente, decrescente, múltiplas colunas e combinado com WHERE e LIMIT.

Este capítulo mostra como ordenar resultados de consultas MySQL em Python usando a cláusula ORDER BY. Você aprenderá a ordenar de forma crescente e decrescente, ordenar por múltiplas colunas, combinar ORDER BY com WHERE e LIMIT, e aplicar boas práticas em Python, como consultas parametrizadas e tratamento adequado de erros.

O que o ORDER BY faz

A cláusula ORDER BY instrui o MySQL a retornar linhas em uma sequência especificada, em vez de na ordem de armazenamento (que é imprevisível). É possível ordenar por uma ou mais colunas, em ordem crescente (ASC) ou decrescente (DESC).

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

Regras fundamentais:

  • ASC (crescente, A → Z, 0 → 9) é o padrão — pode ser omitido.
  • DESC (decrescente, Z → A, 9 → 0) deve ser declarado explicitamente.
  • Múltiplas colunas são separadas por vírgulas; o MySQL ordena primeiro pela primeira coluna e usa a próxima para desempatar.
  • Valores NULL aparecem antes dos valores não nulos na ordem ASC e depois deles na ordem DESC.

Pré-requisitos

Você precisa do pacote mysql-connector-python. Instale-o uma vez com pip:

pip install mysql-connector-python

Todos os exemplos abaixo pressupõem uma tabela customers com pelo menos as colunas id, name e address. Consulte Python MySQL – Create Table se precisar criá-la primeiro.

Ordenar em Ordem Crescente (Padrão)

A ordem crescente é o padrão, portanto ASC é opcional. A consulta a seguir retorna todos os clientes em ordem alfabética pelo nome:

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

O bloco try / except / finally garante que a conexão seja sempre encerrada, mesmo quando ocorre um erro.

Ordenar em Ordem Decrescente

Adicione DESC após o nome da coluna para inverter a ordem. Isso retorna os 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últiplas Colunas

Quando a primeira coluna de ordenação apresenta empates, o MySQL usa a segunda coluna para desempatá-los. Isso é útil quando, por exemplo, você deseja ordenar os clientes por cidade primeiro e depois pelo nome dentro de cada cidade:

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 coluna em uma ordenação de múltiplas colunas pode ter sua própria direção:

-- 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 com WHERE

O ORDER BY é aplicado após o WHERE filtrar as linhas. Use consultas parametrizadas (o marcador %s) para passar valores com segurança — nunca formate a entrada do usuário diretamente na string 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()

O marcador %s é substituído pelo MySQL (não pela formatação de strings do Python), o que previne injeção de SQL independentemente do valor informado.

Combinar ORDER BY com LIMIT

Use LIMIT junto com ORDER BY para implementar padrões como "top N registros" ou paginação. A ordem de classificação deve vir antes de LIMIT na instrução 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 paginação (pulando páginas anteriores), adicione OFFSET:

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

Consulte Python MySQL – Limit para um guia completo de LIMIT e OFFSET.

Buscar Uma Linha vs Todas as Linhas

Após executar uma consulta com ORDER BY, é possível recuperar os resultados de diferentes formas:

MétodoRetornaUse quando
fetchall()Lista com todas as tuplas correspondentesO conjunto de resultados é pequeno o suficiente para caber na memória
fetchone()Primeira linha como tupla (ou None)Você precisa apenas do registro do topo
fetchmany(n)Lista com as próximas n linhasProcessar um conjunto de resultados grande em partes

Exemplo — buscar apenas o primeiro cliente em ordem alfabética:

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

Armadilhas Comuns

Ordenar strings como números. Se uma coluna armazena números como VARCHAR, o MySQL os ordena lexicograficamente ('10' vem antes de '9'). Converta a coluna quando precisar de ordem numérica:

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

Ordenar sem ORDER BY é não determinístico. O MySQL não garante a ordem das linhas a menos que você especifique ORDER BY. Depender da ordem de inserção causará comportamentos imprevisíveis à medida que a tabela cresce ou os índices mudam.

Aliases de colunas funcionam no ORDER BY. Se você definir um alias em SELECT, pode usá-lo no ORDER BY:

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

Posição no ORDER BY. Você pode referenciar uma coluna pela sua posição na lista SELECT (ex.: ORDER BY 1), mas isso é frágil — evite em código de produção porque quebra silenciosamente quando você reordena as colunas.

Capítulos Relacionados

Was this page helpful?