Sous-requêtes PostgreSQL
Les sous-requêtes dans PostgreSQL sont des requêtes imbriquées utilisées à l'intérieur d'une requête principale pour effectuer des filtrages ou des calculs complexes. Ils vous permettent d'isoler des parties de requêtes SQL et d'utiliser des résultats intermédiaires pour formuler la sortie finale de la requête.
Utilisation
Les sous-requêtes sont généralement utilisées dans les instructions SELECT, INSERT, UPDATE ou DELETE pour décomposer des opérations SQL complexes en éléments plus simples et plus faciles à gérer. Elles sont placées entre parenthèses et peuvent renvoyer une seule valeur ou un ensemble de valeurs à utiliser par la requête principale.
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column FROM table WHERE condition);
Dans cette syntaxe, la sous-requête est utilisée dans une clause WHERE pour filtrer les résultats en fonction de la requête imbriquée.
Exemples
1. Sous-requête de base dans la clause WHERE
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2023-01-01');
Cet exemple extrait les clients qui ont passé des commandes après le 1er janvier 2023, à l'aide d'une sous-requête dans la clause WHERE.
2. Sous-requête dans l'instruction SELECT
SELECT product_id,
(SELECT AVG(price) FROM products) AS average_price
FROM products;
Ici, une sous-requête calcule le prix moyen de tous les produits et le présente avec l'identifiant de chaque produit.
3. Utilisation d'une sous-requête avec EXISTS
SELECT supplier_id, supplier_name
FROM suppliers
WHERE EXISTS (SELECT * FROM products WHERE suppliers.supplier_id = products.supplier_id AND products.stock > 0);
Cet exemple recherche les fournisseurs ayant des produits en stock en utilisant une condition EXISTS pour filtrer les résultats.
4. Sous-requête dans l'instruction INSERT
INSERT INTO sales_summary (product_id, total_sales)
SELECT product_id, SUM(sales_amount)
FROM sales
WHERE sale_date > '2023-01-01'
GROUP BY product_id;
Cet exemple utilise une sous-requête pour agréger des données de vente et insérer les résultats dans un tableau récapitulatif.
5. Sous-requête dans l'instruction UPDATE
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
Ici, la sous-requête recherche l'ID de la catégorie "Électronique" et la requête principale met à jour les prix de ces produits.
6. Sous-requête dans l'instruction DELETE
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_items WHERE quantity = 0);
Cet exemple supprime les commandes qui n'ont pas d'articles, comme déterminé par une sous-requête.
7. Exemple de sous-requête corrélée
SELECT employee_id, employee_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM sales s WHERE s.employee_id = e.employee_id AND s.amount > 1000);
Une sous-requête corrélée fait référence aux colonnes de la requête externe, en vérifiant ici les employés dont le chiffre d'affaires est supérieur à 1 000 $.
Conseils et bonnes pratiques
- Optimiser les performances. Utilisez les sous-requêtes à bon escient ; envisagez d'indexer les colonnes pertinentes ou de restructurer les requêtes pour minimiser le temps d'exécution.
- Utilisez des sous-requêtes pour la modularité. Décomposez les requêtes complexes en sous-requêtes pour en faciliter la gestion et la lecture.
- Exploitez soigneusement les sous-requêtes corrélées. Les sous-requêtes corrélées sont puissantes mais peuvent avoir un impact sur les performances car elles sont exécutées une fois par ligne dans la requête externe.
- Envisagez d'utiliser
EXISTSpour les contrôles d'existence. C'est souvent plus efficace que de comparer les résultats des sous-requêtes avec des opérateurs tels queIN.