Lorsque vous travaillez avec SQL Server, la clause ORDER BY est un outil puissant qui vous permet de contrôler l’ordre dans lequel les lignes sont renvoyées dans le résultat d’une requête. Bien que de nombreux professionnels des bases de données SQL soient familiers avec l’utilisation de base de la clause ORDER BY, il existe plusieurs options et techniques qui peuvent améliorer sa fonctionnalité.
Tri par une seule colonne
Le cas d’utilisation le plus basique de la clause ORDER BY est le tri par une seule colonne. Par exemple, vous pouvez récupérer une liste d’employés triés par leur date d’embauche :
SELECT [JobTitle], [FirstName], [LastName], [HireDate]
FROM [HumanResources].[Employee]
ORDER BY [HireDate];
Tri par plusieurs colonnes
Vous pouvez également trier le résultat par plusieurs colonnes. Par exemple, si vous souhaitez trier les employés par leur date d’embauche, puis par leur nom de famille :
SELECT [JobTitle], [FirstName], [LastName], [HireDate]
FROM [HumanResources].[Employee]
ORDER BY [HireDate], [LastName];
Spécification de l’ordre de tri
Par défaut, la clause ORDER BY trie le résultat par ordre croissant. Cependant, vous pouvez spécifier l’ordre de tri en utilisant les mots-clés ASC (croissant) ou DESC (décroissant). Par exemple, pour trier les employés par date d’embauche en ordre croissant et par nom de famille en ordre décroissant :
SELECT [JobTitle], [FirstName], [LastName], [HireDate]
FROM [HumanResources].[Employee]
ORDER BY [HireDate] ASC, [LastName] DESC;
Gestion de la collation
Le paramètre de collation d’une base de données peut affecter la façon dont le résultat est trié. La collation détermine les règles de tri et de comparaison des données. Vous pouvez spécifier une collation différente pour la clause ORDER BY afin de modifier l’ordre de tri. Par exemple, pour trier les employés par leur prénom de manière sensible à la casse :
SELECT [JobTitle], [FirstName], [LastName], [HireDate]
FROM [HumanResources].[Employee]
ORDER BY [FirstName] COLLATE SQL_Latin1_General_CP1_CS_AS;
Utilisation d’alias ou de la position de colonne
Dans la clause ORDER BY, vous pouvez faire référence aux colonnes par leurs alias ou par leur position dans la liste de sélection. Par exemple, si vous avez un alias pour une colonne concaténée, vous pouvez l’utiliser dans la clause ORDER BY :
SELECT [JobTitle], [LastName] + ', ' + [FirstName] AS FullName
FROM [HumanResources].[Employee]
ORDER BY FullName;
Alternativement, vous pouvez faire référence à la position de la colonne dans la clause ORDER BY :
SELECT [JobTitle], [LastName] + ', ' + [FirstName] AS FullName
FROM [HumanResources].[Employee]
ORDER BY 2;
Gestion des valeurs NULL
SQL Server traite les valeurs NULL comme la valeur la plus basse possible pour un type de données donné. Par défaut, les valeurs NULL apparaissent en premier dans l’ordre croissant et en dernier dans l’ordre décroissant. Par exemple, pour récupérer les produits triés par couleur par ordre croissant :
SELECT [Name], [ProductNumber], [Color]
FROM [Production].[Product]
ORDER BY [Color] ASC;
Si vous souhaitez que les valeurs NULL apparaissent en dernier dans l’ordre croissant, vous pouvez utiliser la fonction COALESCE pour définir les valeurs NULL sur une valeur maximale de colonne :
SELECT [Name], [ProductNumber], [Color]
FROM [Production].[Product]
ORDER BY COALESCE([Color], 'ZZZZZZZZZZ') ASC;
Utilisation de la clause TOP
La clause TOP est souvent utilisée en conjonction avec la clause ORDER BY pour limiter le nombre de lignes renvoyées dans le résultat. Par exemple, pour récupérer les 10 produits les plus chers :
SELECT TOP 10 [ProductID], [Name], [ListPrice]
FROM [Production].[Product]
ORDER BY [ListPrice] DESC;
Pagination des résultats avec OFFSET et FETCH
Les options OFFSET et FETCH de la clause ORDER BY sont utiles pour mettre en œuvre la pagination côté serveur. La clause OFFSET ignore un nombre spécifié de lignes, et la clause FETCH récupère un nombre spécifié de lignes après la clause OFFSET. Par exemple, pour récupérer la 6e page des détails de commande avec 10 enregistrements par page :
SELECT [SalesOrderID], [RevisionNumber], [OrderDate], [DueDate], [ShipDate], [Status]
FROM [Sales].[SalesOrderHeader]
ORDER BY [OrderDate]
OFFSET 50 ROWS
FETCH NEXT 10 ROWS ONLY;
Utilisation de la clause ORDER BY avec des fonctions de classement
La clause ORDER BY est couramment utilisée avec des fonctions de classement ou de fenêtre pour calculer des classements au sein d’un résultat. Par exemple, pour déterminer le meilleur vendeur par région :
SELECT p.FirstName, p.LastName, st.Name,
RANK() OVER (PARTITION BY st.TerritoryID ORDER BY s.SalesYTD DESC) AS "Rank",
s.SalesYTD
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS st
ON s.TerritoryID = st.TerritoryID
WHERE st.TerritoryID IS NOT NULL AND s.SalesYTD <> 0;
En comprenant les différentes options et techniques disponibles dans la clause ORDER BY, vous pouvez avoir un plus grand contrôle sur le tri et l’ordonnancement des résultats de votre requête SQL Server.
Article mis à jour pour la dernière fois le 2021-05-26