Lors de la récupération de données complexes avec SQL, les sous-requêtes sont une technique très utile. Cependant, si vous souhaitez trier les résultats d’une sous-requête dans un ordre spécifique, il est important de savoir comment utiliser la clause ORDER BY correctement. Cet article explique en détail comment trier les résultats d’une sous-requête avec ORDER BY.
Utilisation basique des sous-requêtes
Une sous-requête est une requête qui est utilisée à l’intérieur d’une autre requête. Elle est encadrée par des parenthèses et peut être utilisée dans des instructions SQL comme SELECT, INSERT, UPDATE ou DELETE. En utilisant une sous-requête, vous pouvez construire des requêtes plus complexes et extraire des données en fonction de critères spécifiques.
Structure basique d’une sous-requête
Une sous-requête a la structure suivante :
SELECT column1, column2
FROM (SELECT column1, column2 FROM table WHERE condition) AS subquery_alias;
De cette manière, vous pouvez utiliser les résultats d’une requête dans une nouvelle requête en utilisant une sous-requête.
Utilisation basique de ORDER BY
La clause ORDER BY est utilisée pour trier les résultats d’une requête dans un ordre spécifique. En général, on trie les résultats en ordre croissant (ASC) ou décroissant (DESC).
Structure basique de la clause ORDER BY
La clause ORDER BY est placée à la fin de l’instruction SELECT et s’utilise ainsi :
SELECT column1, column2
FROM table
WHERE condition
ORDER BY column1 ASC, column2 DESC;
Exemple d’utilisation de ORDER BY
Par exemple, la requête suivante trie les noms des employés dans la table employees
par ordre alphabétique :
SELECT first_name, last_name
FROM employees
ORDER BY last_name ASC, first_name ASC;
En utilisant la clause ORDER BY, vous pouvez organiser l’ensemble des résultats dans l’ordre souhaité.
Les limitations de ORDER BY dans les sous-requêtes
Il y a plusieurs limitations à l’utilisation de la clause ORDER BY à l’intérieur des sous-requêtes. Notamment, si la sous-requête ne renvoie pas directement des résultats, la clause ORDER BY ne sera pas effective.
Inactivation de la clause ORDER BY dans une sous-requête
Même si vous utilisez ORDER BY dans une sous-requête, il est possible que la requête externe ignore cet ordre. Par exemple, dans la requête suivante, la clause ORDER BY dans la sous-requête est ignorée :
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name) AS subquery;
Dans ce cas, comme la requête externe ne contient pas de clause ORDER BY, l’ensemble des résultats n’est pas trié.
Points à considérer lors de l’utilisation de ORDER BY dans une sous-requête
L’utilisation de ORDER BY à l’intérieur d’une sous-requête n’est pertinente que lorsqu’elle est combinée avec des clauses comme TOP ou LIMIT. Par exemple, elle peut être utilisée avec la clause LIMIT de cette manière :
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name LIMIT 10) AS subquery;
Dans ce cas, l’ordre est respecté à l’intérieur de la sous-requête, et les 10 premiers résultats triés sont transmis à la requête externe.
Comment trier les résultats d’une sous-requête avec ORDER BY
Pour trier les résultats d’une sous-requête dans un ordre spécifique, vous devez utiliser la clause ORDER BY à l’extérieur de la sous-requête. Cela permet de trier l’ensemble des résultats de la sous-requête.
Méthode basique pour trier les résultats d’une sous-requête
Tout d’abord, récupérez les données nécessaires dans la sous-requête, puis triez-les dans la requête externe avec la clause ORDER BY. Voici un exemple :
SELECT *
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
Dans cette requête, les employés du department_id
10 sont récupérés dans la sous-requête et triés dans l’ordre décroissant de hire_date
.
Exemple d’utilisation pratique
Par exemple, pour récupérer les ventes d’une catégorie de produits spécifique et trier les résultats par montant des ventes, la requête serait :
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
Dans cet exemple, les ventes totales pour chaque produit de la catégorie Electronics
sont calculées, puis triées par montant des ventes dans l’ordre décroissant.
Points importants pour l’utilisation de ORDER BY dans une sous-requête
Lorsque vous utilisez ORDER BY dans une sous-requête, la requête externe ne respectera pas cet ordre. Il est donc nécessaire d’utiliser la clause ORDER BY dans la requête externe pour effectuer le tri final. Cela permet de présenter les résultats de la sous-requête dans l’ordre souhaité.
Exemples concrets de requêtes SQL avec sous-requête
Voici quelques exemples concrets de requêtes SQL contenant des sous-requêtes. Ces exemples vous aideront à comprendre comment utiliser les sous-requêtes et combiner ORDER BY pour effectuer des tris sur les résultats.
Tri des employés par date d’embauche
La requête suivante trie les employés d’un département spécifique par leur date d’embauche :
SELECT first_name, last_name, hire_date
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
Cette requête extrait les employés du département ayant l’ID 10 et trie les résultats par date d’embauche décroissante.
Tri des données de vente
La requête suivante agrège les données de vente d’une catégorie spécifique de produits et les trie par montant des ventes :
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
Cette requête calcule le total des ventes par produit dans la catégorie Electronics
, puis trie les résultats par montant des ventes dans l’ordre décroissant.
Liste des clients avec la commande la plus récente
La requête suivante obtient la liste des clients avec leur date de commande la plus récente et trie les résultats par date de commande :
SELECT customer_name, last_order_date
FROM (
SELECT customer_name, MAX(order_date) AS last_order_date
FROM orders
GROUP BY customer_name
) AS subquery
ORDER BY last_order_date DESC;
Cette requête récupère la date de la commande la plus récente pour chaque client et trie les résultats par date de commande décroissante.
Produits top dans chaque catégorie triés par ventes
La requête suivante obtient les produits ayant les meilleures ventes dans chaque catégorie et trie ces résultats par montant des ventes :
SELECT category, product_name, total_sales
FROM (
SELECT category, product_name, total_sales,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY total_sales DESC) AS rank
FROM (
SELECT category, product_name, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category, product_name
) AS subquery
) AS ranked_products
WHERE rank = 1
ORDER BY total_sales DESC;
Cette requête classe les produits de chaque catégorie par montant des ventes, extrait les produits les plus vendus, puis trie les résultats par montant des ventes décroissant.
Ces exemples vous montrent comment combiner les sous-requêtes et la clause ORDER BY pour effectuer des tris complexes et efficaces sur des ensembles de données.
Conclusion
Les sous-requêtes sont un outil puissant pour la création de requêtes SQL complexes. Elles sont particulièrement utiles pour filtrer une partie des données et appliquer des traitements supplémentaires sur les résultats. Cependant, comme la clause ORDER BY à l’intérieur d’une sous-requête n’est pas respectée par la requête externe, il est crucial d’utiliser la clause ORDER BY dans la requête externe pour effectuer le tri final. Cela permet d’organiser les résultats de la sous-requête dans l’ordre souhaité et d’obtenir les informations nécessaires efficacement. En combinant les sous-requêtes et ORDER BY, vous pouvez facilement gérer des extractions de données complexes.