Imagina que você tá trabalhando com um banco de dados gigante de estudantes. Ordenar só pelo sobrenome já ajuda, mas pensa que na sua tabela tem vários estudantes com o mesmo sobrenome. Nesse caso, pra deixar o resultado mais legível, dá pra adicionar a ordenação pelo nome. Outro exemplo: você quer organizar uma lista de pedidos primeiro pela data, depois pelo valor total do pedido. E aí entra a ordenação por várias colunas.
Ordenar por várias colunas permite: 1. Organizar os dados numa ordem bem definida; 2. Controlar as prioridades da ordenação (primeiro por uma coluna, depois por outra); 3. Mostrar os dados de um jeito mais estruturado e fácil de ler.
Sintaxe de ordenação por várias colunas
Pra ordenar por várias colunas, usa o já conhecido operador ORDER BY, mas agora você lista várias colunas separadas por vírgula. O PostgreSQL faz a ordenação primeiro pela primeira coluna, depois (se os valores forem iguais) pela segunda, e assim vai.
Olha a sintaxe geral:
SELECT colunas
FROM tabela
ORDER BY coluna1 direção1, coluna2 direção2, ... ;
Onde:
coluna1,coluna2, ... — são as colunas que você quer usar pra ordenar.direção1,direção2, ... — é a direção da ordenação (ASC— crescente,DESC— decrescente).- Esse parâmetro é opcional, por padrão é
ASC.
Exemplo 1: Ordenando estudantes por sobrenome e depois por nome
Imagina a tabela students com dados dos estudantes:
| id | first_name | last_name | age |
|---|---|---|---|
| 1 | Anna | Lin | 20 |
| 2 | Victor | Lin | 22 |
| 3 | Maria | Kim | 21 |
| 4 | Otto | Lin | 23 |
| 5 | Anna | Kim | 20 |
Nosso objetivo é ordenar os estudantes primeiro pelo sobrenome (last_name), depois pelo nome (first_name).
SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;
Resultado:
| id | first_name | last_name | age |
|---|---|---|---|
| 5 | Anna | Kim | 20 |
| 3 | Maria | Kim | 21 |
| 1 | Anna | Lin | 20 |
| 4 | Otto | Lin | 23 |
| 2 | Victor | Lin | 22 |
Como dá pra ver, as linhas estão organizadas primeiro pelo sobrenome (Kim, depois Lin), e depois pelo nome (Anna, Maria, etc). Isso é muito útil quando você precisa achar alguém rápido na lista ou organizar um diário de classe.
Exemplo 2: Ordenando pedidos por data e valor
Imagina a tabela orders com dados dos pedidos:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 2 | 102 | 2025-10-03 | 200 |
| 3 | 103 | 2025-10-02 | 300 |
| 4 | 104 | 2025-10-01 | 100 |
| 5 | 101 | 2025-10-03 | 600 |
A gente quer ordenar os pedidos primeiro pela data order_date, depois pelo valor total em ordem decrescente.
SQL:
SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;
Resultado:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 4 | 104 | 2025-10-01 | 100 |
| 3 | 103 | 2025-10-02 | 300 |
| 5 | 101 | 2025-10-03 | 600 |
| 2 | 102 | 2025-10-03 | 200 |
Como dá pra ver, pedidos com a mesma data também são ordenados pelo valor.
Trabalhando com NULL na ordenação: NULLS FIRST e NULLS LAST
No SQL tem um valor especial - NULL, que significa ausência de valor. A gente vai falar mais sobre isso em outros níveis, mas agora é um bom momento pra mostrar como controlar o NULL na ordenação.
Quando você ordena colunas que têm NULL, o PostgreSQL precisa decidir onde colocar os valores vazios: no começo ou no fim.
Por padrão:
- Com
ORDER BY ... ASC:NULLvai pro fim (NULLS LAST) - Com
ORDER BY ... DESC:NULLvai pro começo (NULLS FIRST)
Às vezes isso não é o que você quer — e aí dá pra controlar usando NULLS FIRST ou NULLS LAST.
Sintaxe:
ORDER BY coluna ASC NULLS FIRST
ORDER BY coluna DESC NULLS LAST
Exemplo: ordenando por notas, onde NULL significa "nota ainda não lançada"
SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;
Assim a gente vê primeiro os melhores estudantes, depois os mais fracos, e lá no fim quem ainda não tem nota (NULL).
Exemplo: ao contrário — mostrar estudantes sem nota primeiro
Imagina que temos a tabela grades, onde alguns estudantes ainda não receberam nota (NULL):
| student_id | grade |
|---|---|
| 101 | NULL |
| 102 | 85 |
| 103 | NULL |
| 104 | 92 |
| 105 | 76 |
A gente quer mostrar primeiro os estudantes sem nota, depois o resto em ordem crescente de nota.
SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;
Resultado:
| student_id | grade |
|---|---|
| 101 | NULL |
| 103 | NULL |
| 105 | 76 |
| 102 | 85 |
| 104 | 92 |
O operador NULLS FIRST junto com ORDER BY grade ASC garante que os registros com NULL vão aparecer no começo, depois as notas em ordem crescente.
Sobre particularidades e erros comuns
Quem tá começando costuma esquecer de colocar a direção da ordenação pra cada coluna. Se você não colocar, o PostgreSQL usa ASC por padrão. Também é comum esquecer que a ordem das colunas no ORDER BY importa: primeiro os dados são ordenados pela primeira coluna, e só depois pela segunda se os valores da primeira forem iguais.
GO TO FULL VERSION