O
ORDER BY
A cláusula é comumente usada em SQL para classificar os resultados de uma consulta. Ele permite que você especifique a ordem na qual os resultados são retornados.
Você pode especificar se os resultados são classificados em ordem crescente ou decrescente. Você também pode especificar várias colunas para classificação.
Exemplo
Aqui está um exemplo para demonstrar o
ORDER BY
cláusula. SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Resultado:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | | 1002 | Sledge Hammer | 33.49 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | +------------+---------------------------------+----------------+
O
ASC
parte significa ascendente . Quando você usa o ORDER BY
cláusula, o padrão é ascendente, então você pode omitir o ASC
parte se desejar. Então, também poderíamos escrever a consulta assim:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Ordem Decrescente
Para classificá-lo em decrescente ordem, use
DESC
. SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Resultado:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Ordenar por várias colunas
Você pode especificar várias colunas com as quais classificar. Isso permite especificar como as linhas devem ser classificadas quando houver várias linhas com o mesmo valor na primeira coluna classificada.
Provavelmente é mais fácil demonstrar isso com um exemplo.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Resultado:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------------+---------------------------------+----------------+
Se focarmos nas três linhas com um
VendorId
de 1001
, podemos ver que o exemplo anterior retornou os nomes dos produtos em ordem crescente, mas neste exemplo os retornamos em ordem decrescente. Isso porque nomeamos o ProductName
como a segunda coluna em nosso ORDER BY
cláusula e especificamos DESC
para ordem decrescente. A segunda coluna só tem efeito se houver duplicatas na primeira
ORDER BY
coluna. Caso contrário, quaisquer colunas subsequentes são irrelevantes no que diz respeito à classificação posterior. Se olharmos para o
ProductPrice
coluna, podemos ver que esta coluna não teve efeito na classificação, mesmo que tenhamos especificado ProductPrice DESC
. Podemos ver que os preços estão todos em ordem crescente, apesar de nossa insistência para que sejam em ordem decrescente. A razão pela qual essa coluna não teve efeito é porque não havia duplicatas na coluna classificada anteriormente. Portanto, a ordenação das duas primeiras colunas impactou os resultados, mas a ordenação da terceira coluna não. Isso não quer dizer que a terceira coluna nunca terá qualquer efeito. Se mais tarde inserimos outra
Left handed screwdriver
, mas a um preço diferente, o ProductPrice
a ordenação da coluna entraria em vigor, devido ao fato de haver valores duplicados no ProductName
coluna. Misturando ascendente com descendente
Você pode misturar cada coluna com ordem crescente e decrescente. Não precisam ser todos iguais. Por exemplo, poderíamos fazer isso:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Resultado:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Ordenar por aliases de coluna
O
ORDER BY
A cláusula aceita aliases de coluna como uma coluna a ser ordenada. Por exemplo, poderíamos fazer isso:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Resultado:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Ordenar por colunas que não estão na lista SELECT
O
ORDER BY
cláusula aceita colunas que não são especificadas no SELECT
Lista. Em outras palavras, você não precisa selecionar uma coluna para classificar por essa coluna.
Exemplo:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Resultado:
+---------------------------------+---------+ | Name | Price | |---------------------------------+---------| | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Straw Dog Box | 55.99 | | Chainsaw | 245.00 | | Sledge Hammer | 33.49 | | Long Weight (green) | 11.99 | | Long Weight (blue) | 14.75 | | Left handed screwdriver | 25.99 | +---------------------------------+---------+
Aqui, nós ordenamos pelo
VendorId
coluna, mesmo que não a tenhamos incluído no SELECT
Lista. Ordenar por ID de coluna
O
ORDER BY
A cláusula também aceita o ID da coluna no lugar do nome da coluna. Por exemplo, poderíamos fazer isso:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Resultado:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Contudo, isto não é recomendado.
Primeiro, torna a consulta mais difícil para outras pessoas lerem e entenderem.
Segundo, se alguém mais tarde mudou a ordem das colunas no
SELECT
lista, eles também teriam que alterar a ordem do ORDER BY
Lista. Seria muito fácil esquecer de fazer isso e os resultados da consulta acabariam na ordem errada. Aqui está um exemplo do que quero dizer.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Resultado:
+---------------------------------+------+---------+ | Name | ID | Price | |---------------------------------+------+---------| | Straw Dog Box | 1003 | 55.99 | | Sledge Hammer | 1002 | 33.49 | | Long Weight (green) | 1001 | 11.99 | | Long Weight (blue) | 1001 | 14.75 | | Left handed screwdriver | 1001 | 25.99 | | Chainsaw | 1003 | 245.00 | | Bottomless Coffee Mugs (4 Pack) | 1004 | 9.99 | +---------------------------------+------+---------+
Tudo o que fiz foi mover o
ProductPrice
posição da coluna no SELECT
list, e estragou completamente a ordenação dos resultados. Pedido padrão
No SQL, se você não usar o
ORDER BY
cláusula, não há garantia de qual ordem seus resultados estarão. Embora possa parecer como seu banco de dados está classificando os resultados por uma coluna específica, isso pode não ser o caso. Em geral, sem um
ORDER BY
cláusula, os dados serão classificados na ordem em que foram carregados na tabela. No entanto, se as linhas tiverem sido excluídas ou atualizadas, o pedido será afetado pela forma como o DBMS reutiliza o espaço de armazenamento recuperado. Portanto, não confie no DBMS para classificar os resultados em qualquer ordem significativa. Se você deseja que seus resultados sejam classificados, use o
ORDER BY
cláusula. Pedidos com exceções
Você pode encontrar momentos em que precisa incluir uma exceção em seu
ORDER BY
cláusula. Por exemplo, você deseja ordenar alfabeticamente por uma coluna, exceto por uma linha. Você pode querer que uma linha (ou várias linhas) apareça na parte superior, enquanto todas as linhas restantes são ordenadas em uma ordem específica.
Felizmente, existe uma maneira fácil de fazer isso. Consulte Como escrever uma cláusula ORDER BY com exceções se precisar fazer isso.