Leçons du module (1/3)
Introduction aux CTEs (WITH)
Introduction aux CTE (AVEC)
Tôt ou tard, cela arrive à tout le monde : vous devez filtrer les données en fonction du résultat d'une agrégation, puis prendre ce filtre et le JOINDRE avec une autre requête agrégée. Vous commencez à écrire un SELECT dans un SELECT, qui à son tour se retrouve dans le FROM d'un autre SELECT.
Le résultat ? Spaghetti SQL, une requête illisible pour tout être humain.
Les CTE (Common Table Expressions) vous permettent de démêler ce désordre. Vous les activez avec le mot-clé WITH, qui permet de définir des requêtes nommées temporaires puis de les réutiliser comme « tables virtuelles » dans la requête finale.
Syntaxe de base
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;Comme vous pouvez le voir, la requête principale en bas se lit à partir de premium_customers comme s'il s'agissait d'une vraie table ! Et c'est beaucoup plus lisible qu'une méga jointure interne avec des sous-requêtes imbriquées.
Nous voulons des produits très chers. Utilisez un CTE appelé "luxury_products" pour sélectionner "id" et "price" parmi "products" où "price > 500". Exécutez ensuite une requête principale sur ce CTE et affichez tout (*).
Afficher l'indice
Commencez par AVEC produits_de_luxe AS (...) puis SELECT * FROM produits_de_luxe.
Solution disponible après 3 tentatives
Nous voulons trouver des utilisateurs qui écrivent des avis. Créez un CTE « réviseurs » qui extrait les valeurs uniques (DISTINCT) « customer_id » des « avis ». Extrayez ensuite 'id', 'first_name', 'last_name' de la table 'customers' et `JOIN` avec le CTE 'reviewers' sur id.
Afficher l'indice
AVEC les évaluateurs AS (SELECT DISTINCT customer_id FROM reviews) SELECT id, first_name, last_name FROM clients REJOIGNEZ les évaluateurs ON customer.id = reviewers.customer_id ;
Solution disponible après 3 tentatives