Passer au contenu principal
eLearner.app
Module 14 · Leçon 1 sur 353/57 dans le cours~12 min
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

SQL
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.

Exercice#sql.m14.l1.e1
Tentatives : 0Chargement…

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 (*).

Chargement de l'éditeur…
Afficher l'indice

Commencez par AVEC produits_de_luxe AS (...) puis SELECT * FROM produits_de_luxe.

Solution disponible après 3 tentatives

Exercice#sql.m14.l1.e2
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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