Database
 sql >> Base de données >  >> RDS >> Database

Clause SQL ORDER BY pour les débutants

Le ORDER BY La clause est couramment utilisée en SQL pour trier les résultats d'une requête.

Il vous permet de spécifier l'ordre dans lequel les résultats sont retournés.

Vous pouvez spécifier si les résultats sont triés par ordre croissant ou décroissant. Vous pouvez également spécifier plusieurs colonnes pour le tri.

Exemple

Voici un exemple pour illustrer le ORDER BY clause.

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

Résultat :

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

Le ASC partie signifie ascendant . Lorsque vous utilisez le ORDER BY clause, elle est par défaut ascendante, vous pouvez donc omettre le ASC partie si vous le souhaitez.

Nous pourrions donc également écrire la requête comme ceci :

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

Ordre décroissant

Pour le trier en décroissant commande, utilisez DESC .

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

Résultat :

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

Trier par plusieurs colonnes

Vous pouvez spécifier plusieurs colonnes avec lesquelles trier. Cela vous permet de spécifier comment les lignes doivent être triées lorsqu'il y a plusieurs lignes avec la même valeur dans la première colonne triée.

Il est probablement plus facile de le démontrer avec un exemple.

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

Résultat :

+------------+---------------------------------+----------------+
| 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 nous nous concentrons sur les trois lignes avec un VendorId de 1001 , nous pouvons voir que l'exemple précédent a renvoyé les noms de produits dans l'ordre croissant, mais dans cet exemple, nous les avons renvoyés dans l'ordre décroissant. C'est parce que nous avons nommé le ProductName comme deuxième colonne dans notre ORDER BY clause, et nous avons spécifié DESC pour l'ordre décroissant.

La deuxième colonne ne prend effet que s'il y a des doublons dans le premier ORDER BY colonne. Si ce n'est pas le cas, les colonnes suivantes ne sont pas pertinentes en ce qui concerne le tri ultérieur.

Si nous regardons le ProductPrice colonne, nous pouvons voir que cette colonne n'a eu aucun effet sur le tri, même si nous avons spécifié ProductPrice DESC . Nous pouvons voir que les prix sont tous en ordre croissant, malgré notre insistance pour qu'ils soient en ordre décroissant. La raison pour laquelle cette colonne n'a eu aucun effet est qu'il n'y avait pas de doublons dans la colonne précédemment triée. Par conséquent, l'ordre des deux premières colonnes a eu un impact sur les résultats, mais pas l'ordre de la troisième colonne.

Cela ne veut pas dire que la troisième colonne n'aura jamais d'effet. Si plus tard nous insérons un autre Left handed screwdriver , mais à un prix différent, alors le ProductPrice l'ordre de la colonne prendrait effet, en raison du fait qu'il y a des valeurs en double dans le ProductName colonne.

Mélanger croissant et décroissant

Vous pouvez mélanger chaque colonne avec un ordre croissant et décroissant. Ils ne doivent pas tous être identiques. Par exemple, nous pourrions faire ceci :

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

Résultat :

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

Trier par alias de colonne

Le ORDER BY La clause accepte les alias de colonne en tant que colonne à trier.

Par exemple, nous pourrions faire ceci :

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;

Résultat :

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

Trier par colonnes qui ne figurent pas dans la liste SELECT

Le ORDER BY la clause accepte les colonnes qui ne sont pas spécifiées dans le SELECT liste.

En d'autres termes, vous n'êtes pas obligé de sélectionner une colonne pour trier par cette colonne.

Exemple :

SELECT
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;

Résultat :

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

Ici, nous avons commandé par le VendorId colonne, même si nous ne l'avons pas inclus dans le SELECT liste.

Trier par ID de colonne

Le ORDER BY La clause accepte également l'ID de colonne à la place du nom de colonne.

Par exemple, nous pourrions faire ceci :

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Résultat :

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

Cependant, cela n'est pas recommandé.

Premièrement, cela rend la requête plus difficile à lire et à comprendre pour les autres.

Deuxièmement, si quelqu'un a changé plus tard l'ordre des colonnes dans le SELECT liste, ils devraient également changer l'ordre du ORDER BY liste. Il serait très facile d'oublier de le faire, et les résultats de la requête se retrouveraient dans le mauvais ordre.

Voici un exemple de ce que je veux dire.

SELECT 
    ProductName AS Name,
    VendorId AS ID,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Résultat :

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

Tout ce que j'ai fait a été de déplacer le ProductPrice position de la colonne dans le SELECT list, et cela a complètement chamboulé l'ordre des résultats.

Ordre par défaut

En SQL, si vous n'utilisez pas le ORDER BY clause, il n'y a aucune garantie dans quel ordre vos résultats seront. Bien que cela puisse regarder comme votre base de données trie les résultats par une colonne particulière, cela peut ne pas être le cas.

En général, sans ORDER BY clause, les données seront triées dans l'ordre dans lequel elles ont été chargées dans la table. Cependant, si des lignes ont été supprimées ou mises à jour, l'ordre sera affecté par la façon dont le SGBD réutilise l'espace de stockage récupéré.

Par conséquent, ne comptez pas sur le SGBD pour trier les résultats dans un ordre significatif. Si vous voulez que vos résultats soient triés, utilisez le ORDER BY clause.

Commander avec des exceptions

Vous pouvez rencontrer des moments où vous devez inclure une exception dans votre ORDER BY clause.

Par exemple, vous souhaitez trier par ordre alphabétique une colonne à l'exception d'une ligne. Vous voudrez peut-être qu'une ligne (ou plusieurs lignes) apparaisse en haut, tandis que toutes les lignes restantes sont classées dans un ordre particulier.

Heureusement, il existe un moyen simple de le faire. Voir Comment écrire une clause ORDER BY avec des exceptions si vous avez besoin de le faire.