Voltar para a lista de artigos Artigos
10 minutos de leitura

Um Guia Detalhado de Ordens SQL POR

Muitas vezes é necessário exibir a saída da consulta SQL em ordem específica em vez de arbitrariamente. Neste artigo, explicarei as muitas maneiras de fazê-lo com a cláusula SQL ORDER BY.

Para ordenar registros em SQL, você precisará usar a cláusula ORDER BY. Neste artigo, explicarei em detalhes como usar o ORDER BY para ordenar a saída por uma ou mais colunas, em ordem ascendente (A-Z) ou descendente (Z-A), e usando coluna(s) existente(s) ou usando coluna(s) calculada(s) por uma função agregada. Não se preocupe - não é tão complicado quanto parece!

Como Ordenar Linhas em SQL

Se você não ordenar a saída de sua consulta SQL, a ordem das filas será arbitrária. Se você quiser que as linhas da tabela resultante apareçam em ordem específica, você precisará usar a cláusula ORDER BY.

A sintaxe básica para ORDER BY é a seguinte:

SELECT ...columns...
FROM table
ORDER BY sorting_column ASC/DESC;
  • Após a palavra-chave ORDER BY, você simplesmente lista a(s) coluna(s) pela(s) qual(is) você deseja ordenar os registros.
  • Estas colunas não precisam ser exibidas na saída, ou seja, listadas na declaração SELECT.
  • Você define a ordem de ordenação (ascendente ou descendente) usando as palavras-chave DESC e ASC. A palavra-chave ASC é opcional; se nenhuma palavra-chave for especificada após o nome da coluna, as linhas serão ordenadas em ordem ascendente por padrão.
  • ORDER BY é posicionada no final da consulta.

Confira este artigo para uma animação de como funciona ORDER BY. Agora, vamos ver alguns casos práticos de ORDEM POR uso.

ENCOMENDAR POR uma coluna

Imagine que nós administramos uma loja que vende fantasias de Halloween. Temos diferentes tipos de fantasias, máscaras, chapéus e acessórios em estoque. Aqui está a mesa com nosso products:

products
idnamecategoryquantityprice
11Wonder Womancostumes219.95
12Vampiremasks43.95
13Magic Wandaccessories62.50
14Wizard of Ozhats33.95
15Supermancostumes314.95
16Hulkcostumes212.50
17Witchhats44.95
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
20Freddy Kruegermasks33.95
21Alienmasks0NULL
22Cowboyhats34.95
23Ghostbusteraccessories213.95
24Swordaccessories73.50
25Zombiemasks82.95

PEDIDO simples POR: Ordenação por uma coluna

Comecemos com um exemplo muito básico: ordenar nossos itens por ordem alfabética pelo nome. Para ordenar os itens em ordem alfabética, basta ordenar nosso resultado definido pela coluna do nome em ordem ascendente. Como sabemos, a ordem ascendente é o padrão em SQL, portanto a palavra-chave ASC pode ser omitida. Aqui está nossa pergunta:

SELECT *
FROM products
ORDER BY name;

E aqui está o resultado, com todos os registros ordenados alfabeticamente com base no nome do produto:

idnamecategoryquantityprice
21Alienmasks0NULL
22Cowboyhats34.95
20Freddy Kruegermasks33.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
13Magic Wandaccessories62.50
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
15Supermancostumes314.95
24Swordaccessories73.50
12Vampiremasks43.95
17Witchhats44.95
14Wizard of Ozhats33.95
11Wonder Womancostumes219.95
25Zombiemasks82.95

Bastante simples, certo? Agora vamos ordenar nossas fantasias de Halloween com base no preço, começando pelas mais caras. Ir do mais alto para o mais baixo preço requer uma classificação em ordem decrescente. Assim, nossa cláusula ORDER BY deve incluir a palavra-chave DESC:

SELECT *
FROM products
ORDER BY price DESC;
idnamecategoryquantityprice
19Snow Whitecostumes123.95
11Wonder Womancostumes219.95
15Supermancostumes314.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
17Witchhats44.95
22Cowboyhats34.95
14Wizard of Ozhats33.95
12Vampiremasks43.95
20Freddy Kruegermasks33.95
24Swordaccessories73.50
25Zombiemasks82.95
13Magic Wandaccessories62.50
21Alienmasks0NULL
18Rapunzelcostumes0NULL

Aqui estão várias coisas interessantes a serem observadas sobre os tipos de SQL:

  • Ordem das filas com o mesmo valor. Alguns itens em nossa tabela têm o mesmo preço - especificamente, os chapéus Witch e Cowboy custam $4,95, enquanto o chapéu Wizard of Oz e as máscaras Vampiro e Freddy Krueger custam $3,95. Como SQL ordena tais filas? Na verdade, não há regras específicas para estes casos; o resultado é não-determinístico. Em outras palavras, a ordem das linhas contendo o mesmo valor de coluna de ordenação pode variar toda vez que a consulta é executada. Se você precisar que a ordem das linhas seja consistente, use uma coluna única para ordenar as linhas. Se isso não for possível, veja se você pode ordenar o conjunto de resultados usando uma combinação de colunas que resulte em uma ordem determinada. Mais adiante, neste artigo, estaremos cobrindo a ordenação por várias colunas.
  • Comportamento de ordenação para valores NULL. Na tabela de resultados acima, as linhas com valores NULL na coluna de ordenação são colocadas no final da tabela. No entanto, este comportamento não é consistente entre diferentes bancos de dados relacionais. Eu usei o MySQL para executar esta consulta, e este banco de dados considera os valores NULL como o valor mais baixo possível. Assim, ele os classifica por último quando a ordem decrescente é solicitada. O resultado seria o mesmo nos bancos de dados SQL Server e SQLite. Entretanto, os bancos de dados PostgreSQL e Oracle tratam os NULLs como os maiores valores possíveis e os colocam em primeiro lugar quando são ordenados por ordem decrescente. Na maioria dos casos, é possível alterar o comportamento padrão do ORDER BY em relação aos valores NULL. Saiba como, neste guia detalhado.

Ótimo! Vamos passar a exemplos mais complicados.

Ordenação por Coluna Calculada por Função Agregada

Em SQL, você pode ordenar os resultados com base em uma ou mais colunas calculadas. Esta coluna pode ser calculada usando uma das funções agregadas (como AVG(), SUM(), COUNT(), MAX(), MIN()) ou outro método. Vamos ver como isto funciona na prática.

Em nosso próximo exemplo, queremos ver quais categorias de produtos incluem itens mais caros. Em particular, queremos ordenar as categorias pelo preço médio de seus produtos, começando com os mais caros.

Vamos calcular o preço médio para cada categoria, depois ordenaremos as linhas por ordem decrescente, de acordo com esta coluna calculada:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY avg_price DESC;

Note que a cláusula ORDER BY é colocada em último lugar, após a cláusula GROUP BY. Aqui está o resultado:

categoryavg_price
costumes17.84
accessories6.65
hats4.62
masks3.62

É bom notar que ORDER BY aceita a notação de número quando se refere à coluna de ordenação. Por exemplo, para ordenar o conjunto de resultados com base na primeira coluna, você pode simplesmente escrever ORDER BY 1.

Assim, a seguinte consulta nos daria o mesmo resultado que na tabela acima:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY 2 DESC;

Como a coluna avg_price é a segunda em nossa declaração SELECT, podemos nos referir a ela na cláusula ORDER BY usando '2'.

Esta abordagem nos poupa tempo na digitação, mas tem um inconveniente importante. Se você modificar a consulta adicionando mais campos à declaração SELECT, lembre-se de verificar se o número no ORDER BY ainda é relevante ou se precisa ser alterado. Infelizmente, esta etapa é muitas vezes negligenciada, resultando na ordem errada no conjunto de resultados.

ORDEM POR Múltiplas Colunas

ORDER BY permite ordenar o resultado definido por duas ou mais colunas. Entretanto, para utilizar esta ferramenta de forma apropriada, é necessário entender como ela funciona:

  • A ordenação começa com a ordenação dos dados com base na primeira coluna mencionada no ORDER BY Se esta coluna contiver os mesmos valores, as linhas correspondentes são ordenadas com base na segunda coluna listada na cláusula ORDER BY, e assim por diante. Portanto, a ordem das colunas é importante.
  • Você pode escolher a ordem (isto é, ascendente ou descendente) para cada uma das colunas listadas em ORDER BY. Para especificar a ordem, basta colocar a palavra-chave DESC ou ASC após cada uma das colunas listadas. Se você omitir a palavra-chave DESC / ASC, ela será ordenada em ordem ascendente por padrão.

Vamos ver alguns exemplos.

Ordenação por Múltiplas Colunas em SQL

Você deve se lembrar que quando estávamos ordenando nossos produtos de acordo com o preço, o resultado da ordenação não era determinístico. Especificamente, havia vários itens com o mesmo preço que deveriam ter aparecido na mesma posição, mas que na verdade foram encomendados aleatoriamente. Se quisermos mais controle sobre a ordem de classificação em tais casos, devemos acrescentar outra coluna à cláusula ORDER BY.

Por exemplo, podemos começar ordenando os itens com base em seu preço (do mais caro ao mais barato). Então, podemos optar por ordenar alfabeticamente os itens com o mesmo preço. Isto implica ordenar por preço em ordem decrescente e depois ordenar por nome em ordem crescente. Aqui está a pergunta:

SELECT id, name, price
FROM products
ORDER BY price DESC, name;
idnameprice
19Snow White23.95
11Wonder Woman19.95
15Superman14.95
23Ghostbuster13.95
16Hulk12.50
22Cowboy4.95
17Witch4.95
20Freddy Krueger3.95
12Vampire3.95
14Wizard of Oz3.95
24Sword3.50
25Zombie2.95
13Magic Wand2.50
21AlienNULL
18RapunzelNULL

Selecionamos apenas três colunas para que possamos nos concentrar mais facilmente nos resultados da ordenação. Como você pode ver:

  • Os chapéus Cowboy e Witch têm o mesmo preço e agora são ordenados por ordem alfabética.
  • Da mesma forma, outro grupo de itens com preço de US$ 3,95 também é pedido por ordem alfabética pelo nome.
  • Finalmente, SQL considera os valores NULL na coluna de preços como o mesmo valor, portanto, temos essas linhas ordenadas alfabeticamente de acordo com o nome do item.

Você pode usar a notação de número ao listar várias colunas na cláusula ORDER BY; funciona da mesma forma. A consulta a seguir nos dará os mesmos resultados que a acima:

SELECT id, name, price
FROM items
ORDER BY 3 DESC, 2;

Entretanto, você deve ter muito cuidado com a notação de número, pois a edição da consulta pode alterar a ordem da coluna - e, portanto, a saída da ordenação.

Ordenação por Múltiplas Colunas Calculadas

Vamos acrescentar complexidade ao nosso exemplo final de classificação. Neste caso, queremos classificar as categorias de produtos pelo número total de itens em estoque, começando pela categoria com o menor número de itens. Se qualquer uma das categorias tiver o mesmo número de itens em estoque, queremos que a categoria com o maior preço de produto seja listada primeiro.

Em outras palavras, queremos ordenar a produção por duas colunas, com ambas calculadas usando funções agregadas. Além disso, queremos que a categoria com o maior preço de produto seja listada primeiro:

  • A soma do número de itens em cada categoria deve ser ordenada em ordem ascendente.
  • O preço máximo do produto em cada categoria deve ser ordenado em ordem decrescente.

Aqui está a consulta e o resultado:

SELECT 
  category, 
  SUM(quantity) AS total_quantity, 
  MAX(price) AS max_price
FROM items
GROUP BY category
ORDER BY total_quantity, max_price DESC;
categorytotal_quantitymax_price
costumes823.95
hats104.95
accessories1513.95
masks153.95

Nesta consulta, calculamos o número total de itens (SUM(quantity)) e o preço máximo do produto (MAX(price)) para cada categoria (GROUP BY categoria). Também atribuímos os pseudônimos (total_quantity e max_price, respectivamente). Finalmente, ordenamos a saída por total_quantity em ordem ascendente (omitindo a palavra-chave ASC ) e por max_price em ordem descendente (usando a palavra-chave DESC ).

Como esperado, a tabela é ordenada pelo número total de itens em cada categoria, começando com os figurinos (que têm o menor número de itens em estoque). Mas observe que as categorias de acessórios e máscaras têm ambas 15 itens em estoque. Neste caso, a classificação pela segunda coluna entra em jogo e estas duas filas são ordenadas de acordo com o produto mais caro da categoria correspondente. Especificamente, a categoria de acessórios vem em primeiro lugar (pois inclui os Caça-Fantasmas, cujo preço é de $13,95), enquanto a categoria de máscaras vem em último lugar (pois as máscaras mais caras custam apenas $3,95).

Para aprender usos mais avançados ORDER BY - como colocar expressões na condição ORDER BY - confira este guia abrangente.

Hora de Praticar a PEDIDO SQL POR!

ORDER BY parece bastante fácil de entender. Entretanto, a classificação de registros em SQL tem muitas nuances que são melhor aprendidas com a prática. Eu recomendo começar com o SQL para Iniciantes Entre outras coisas, ele cobre tudo o que você precisa saber sobre a classificação de linhas em SQL. O curso é interativo e inclui 149 desafios de codificação, desde o mais básico até o mais avançado.

Se você está ansioso para construir uma base SQL sólida, considere completar LearnSQL.com.br's Fundamentos de SQL pista. Inclui SQL para Iniciantes e dois cursos adicionais que cobrem funções SQL padrão, criação e atualização de tabelas em SQL, e muito mais.

Obrigado por ler, e feliz aprendizado!