Database
 sql >> Base de Dados >  >> RDS >> Database

Cláusula SQL ORDER BY para iniciantes


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.