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
NULLaparecem antes dos valores não nulos na ordemASCe depois deles na ordemDESC.
Pré-requisitos
Você precisa do pacote mysql-connector-python. Instale-o uma vez com pip:
pip install mysql-connector-pythonTodos 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étodo | Retorna | Use quando |
|---|---|---|
fetchall() | Lista com todas as tuplas correspondentes | O 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 linhas | Processar 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
- Python MySQL – Get Started — instale o conector e conecte-se ao MySQL
- Python MySQL – Select — leia dados com
SELECT - Python MySQL – Where — filtre linhas com
WHERE - Python MySQL – Limit — limite a contagem de resultados com
LIMIT - Python MySQL – Join — combine dados de múltiplas tabelas