CodeGym /Cursos /SQL SELF /Ordenação por várias colunas: ordem de classificação e pr...

Ordenação por várias colunas: ordem de classificação e prioridades

SQL SELF
Nível 6 , Lição 2
Disponível

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: NULL vai pro fim (NULLS LAST)
  • Com ORDER BY ... DESC: NULL vai 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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION