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.