sql >> Base de Datos >  >> RDS >> Database

Cláusula SQL ORDER BY para principiantes

El ORDER BY La cláusula se usa comúnmente en SQL para ordenar los resultados de una consulta.

Le permite especificar el orden en que se devuelven los resultados.

Puede especificar si los resultados se ordenan en orden ascendente o descendente. También puede especificar varias columnas para ordenar.

Ejemplo

Aquí hay un ejemplo para demostrar el 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           |
+------------+---------------------------------+----------------+

El ASC parte significa ascendente . Cuando usas el ORDER BY cláusula, por defecto es ascendente, por lo que puede omitir el ASC parte si lo desea.

Así que también podríamos escribir la consulta así:

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId;

Orden descendente

Para ordenarlo en descendente orden, 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 múltiples columnas

Puede especificar varias columnas con las que ordenar. Esto le permite especificar cómo deben ordenarse las filas cuando hay varias filas con el mismo valor en la primera columna ordenada.

Probablemente sea más fácil demostrar esto con un ejemplo.

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          |
+------------+---------------------------------+----------------+

Si nos enfocamos en las tres filas con un VendorId de 1001 , podemos ver que el ejemplo anterior devolvió los nombres de los productos en orden ascendente, pero en este ejemplo los devolvimos en orden descendente. Esto se debe a que nominamos el ProductName como la segunda columna en nuestro ORDER BY y especificamos DESC por orden descendente.

La segunda columna solo surte efecto si hay duplicados en la primera ORDER BY columna. De lo contrario, las columnas posteriores son irrelevantes en lo que respecta a la clasificación adicional.

Si miramos el ProductPrice columna, podemos ver que esta columna no tuvo efecto en la clasificación, aunque especificamos ProductPrice DESC . Podemos ver que los precios están todos en orden ascendente, a pesar de nuestra insistencia en que deberían estar en orden descendente. La razón por la que esta columna no tuvo efecto es porque no había duplicados en la columna previamente ordenada. Por lo tanto, el orden de las dos primeras columnas afectó los resultados, pero no el orden de la tercera columna.

Esto no quiere decir que la tercera columna nunca tendrá ningún efecto. Si luego introducimos otro Left handed screwdriver , pero a un precio diferente, entonces el ProductPrice el orden de la columna tendría efecto, debido al hecho de que hay valores duplicados en el ProductName columna.

Mezclar Ascendente con Descendente

Puede mezclar cada columna con orden ascendente y descendente. No todos tienen que ser iguales. Por ejemplo, podríamos hacer esto:

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 alias de columna

El ORDER BY La cláusula acepta alias de columna como una columna por la que ordenar.

Por ejemplo, podríamos hacer esto:

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 columnas que no están en la lista SELECT

El ORDER BY La cláusula acepta columnas que no están especificadas en SELECT lista.

En otras palabras, no es necesario que seleccione una columna para ordenar por esa columna.

Ejemplo:

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   |
+---------------------------------+---------+

Aquí, ordenamos por VendorId columna, aunque no la incluimos en SELECT lista.

Ordenar por Id. de columna

El ORDER BY La cláusula también acepta el ID de la columna en lugar del nombre de la columna.

Por ejemplo, podríamos hacer esto:

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   |
+------+---------------------------------+---------+

Como sea, esto no es recomendable.

En primer lugar, hace que la consulta sea más difícil de leer y comprender para los demás.

En segundo lugar, si alguien más tarde cambiara el orden de las columnas en el SELECT lista, también tendrían que cambiar el orden de ORDER BY lista. Sería muy fácil olvidarse de hacer esto y los resultados de la consulta terminarían en el orden incorrecto.

Este es un ejemplo de lo que quiero decir.

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    |
+---------------------------------+------+---------+

Todo lo que hice fue mover el ProductPrice la posición de la columna en SELECT list, y arruinó por completo el orden de los resultados.

Pedido predeterminado

En SQL, si no usa el ORDER BY cláusula, no hay garantía en qué orden estarán sus resultados. Aunque puede parecer como su base de datos está ordenando los resultados por una columna en particular, este puede no ser el caso.

En general, sin un ORDER BY cláusula, los datos se ordenarán en el orden en que se cargaron en la tabla. Sin embargo, si las filas se eliminaron o actualizaron, el orden se verá afectado por la forma en que el DBMS reutiliza el espacio de almacenamiento reclamado.

Por lo tanto, no confíe en el DBMS para clasificar los resultados en un orden significativo. Si desea ordenar sus resultados, use el ORDER BY cláusula.

Pedidos con excepciones

Puede encontrar momentos en los que necesite incluir una excepción en su ORDER BY cláusula.

Por ejemplo, desea ordenar alfabéticamente por una columna excepto por una fila. Es posible que desee que aparezca una fila (o varias filas) en la parte superior, mientras que todas las filas restantes se ordenan en un orden particular.

Afortunadamente, hay una manera fácil de hacer esto. Consulte Cómo escribir una cláusula ORDER BY con excepciones si necesita hacer esto.